使用PostGIS将不同行中的两个线串组合在一起

时间:2016-01-13 00:49:07

标签: postgresql gps openstreetmap postgis

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

提前致谢

1 个答案:

答案 0 :(得分:3)

在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()会将构成中央高速公路的所有线串分组为一个multilinestring,然后ST_LineMerge()将以拓扑合理的方式将其转换为单个linestring(即已订购)从一个终点到下一个起点。)