使用 PostGIS 合并不同行中的两个线串

alt*_*ont 4 postgresql gps postgis openstreetmap

我举个例子来解释一下这个问题。我有一个城市一部分的 OSM 文件,例如美国加利福尼亚州圣克拉拉,我将其加载到 Postgres+PostGIS 中。我正在尝试在 OSM 文件中创建所有道路及其 GPS 坐标的数据库。让我们考虑一条名为“中央高速公路”的示例道路。我的查询是

SELECT NAME, OSM_ID, AS_TEXT(ST_TRANSFORM(WAY, 4326)) AS whole_road FROM planet_osm_roads WHERE NAME = 'CENTRAL EXPRESSWAY'
Run Code Online (Sandbox Code Playgroud)

然而,这给了我不同的行,它们对应于同一条道路(中央高速公路)的不同路段,并且 GPS 坐标存储为每行的线串。例如,如果获得类似的东西

Central Expressway |  id_1 | LINESTRING(x_1 y_1, x_2 y_2, x_3 y_3)


Central Expressway |  id_2 | LINESTRING(x_4 y_4, x_5 y_5)
Run Code Online (Sandbox Code Playgroud)

据我所知,这就是数据存储在 OSM 文件中的方式。我的问题是如何将不同的线串连接成一个线串,即类似

Central Expressway |  id_new | LINESTRING(x_1 y_1, x_2 y_2, x_3 y_3, x_4 y_4, x_5 y_5)
Run Code Online (Sandbox Code Playgroud)

提前致谢

Pat*_*ick 6

在 OSM 中,与几乎所有 GIS 系统一样,linestrings出于拓扑原因,长道路被存储为多条。如果您想获取一条道路的所有坐标,那么您应该首先连接几何图形,然后才转换为格式WKT

SELECT name, As_Text(
               ST_LineMerge(
                 ST_Collect(
                   ST_Transform(way, 4326)
                 )
               )
             ) AS whole_road
FROM planet_osm_roads
WHERE name = 'CENTRAL EXPRESSWAY'
GROUP BY name;
Run Code Online (Sandbox Code Playgroud)

ST_Collect()会将构成中央高速公路的所有线串分组为一个线串multilinestringST_LineMerge()然后以拓扑合理的方式将其转换为一个线串linestring(即从一个端点到下一个起点排序)。