让我举一个例子来解释这个问题。我有一个城市的一部分的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)
提前致谢
答案 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
(即已订购)从一个终点到下一个起点。)