使用 PostGIS 将不同行中的两个线串组合起来
Combine two linestrings in different rows using PostGIS
我举个例子来说明问题。我有一个城市的一部分的 OSM 文件,比如美国加利福尼亚州圣克拉拉,我将其加载到 Postgres+PostGIS 中。我正在尝试创建 OSM 文件中所有道路的数据库及其 GPS 坐标。让我们考虑一个名为 'Central Expressway' 的示例道路。我的查询是
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()
会将构成中央高速公路的所有线串组合成单个 multilinestring
,然后 ST_LineMerge()
将以拓扑合理的方式将其转换为单个 linestring
(即从一个终点到下一个起点排序)。
我举个例子来说明问题。我有一个城市的一部分的 OSM 文件,比如美国加利福尼亚州圣克拉拉,我将其加载到 Postgres+PostGIS 中。我正在尝试创建 OSM 文件中所有道路的数据库及其 GPS 坐标。让我们考虑一个名为 'Central Expressway' 的示例道路。我的查询是
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()
会将构成中央高速公路的所有线串组合成单个 multilinestring
,然后 ST_LineMerge()
将以拓扑合理的方式将其转换为单个 linestring
(即从一个终点到下一个起点排序)。