让我举一个例子来解释这个问题。我有一个城市的一部分的 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'

然而,这给了我不同的行,它们对应于同一条道路(中央高速公路)的不同路段,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)

我知道这就是数据存储在 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)

提前致谢

最佳答案

在 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;
ST_Collect() 会将组成 Central Expressway 的所有线串分组为单个 multilinestring,然后 ST_LineMerge() 将以拓扑合理的方式(即从一个端点到下一个起点排序)将其转换为单个 linestring

关于postgresql - 使用 PostGIS 合并不同行中的两个线串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34756556/

10-10 16:06