我有一个包含很多 MultiLineString 功能的 Postgis 表。
我想使用该数据创建 A 点和 B 点之间的路线。我假设没有单一功能可以解决该问题。这意味着路线必须由两个或多个 MultiLineString 要素组合而成。
我该如何解决这个问题?
如果没有示例,实际上不可能回答,但我可以向您指出我为解决类似问题所做的工作的方向。我有很多代表道路的 MultiLineString。我还有代表道路节点的点,两条道路在此处合并。
您可以在这里找到形状文件:https://geoservices.ign.fr/route500#telechargement
我必须创建一个 pgRouting 表来计算如何从一个路点到达另一个路点。
CREATE TABLE routes (
id INTEGER,
source INTEGER,
target INTEGER,
cost FLOAT,
reverse_cost FLOAT);
然后用道路多线串中的信息填充表格:
WITH troncon AS (
SELECT ogc_fid AS id,
CASE
WHEN sens = 'Sens inverse' THEN ST_EndPoint(ST_LineMerge(wkb_geometry))
ELSE ST_StartPoint(ST_LineMerge(wkb_geometry)) END AS source,
CASE
WHEN sens = 'Sens inverse' THEN ST_StartPoint(ST_LineMerge(wkb_geometry))
ELSE ST_EndPoint(ST_LineMerge(wkb_geometry)) END AS target,
longueur AS cost,
CASE WHEN sens = 'Double sens' THEN longueur ELSE -longueur END AS reverse_cost
FROM troncon_route
)
INSERT INTO routes (id, source, target, cost, reverse_cost)
SELECT id,
(SELECT noeud_routier.ogc_fid FROM noeud_routier ORDER BY noeud_routier.wkb_geometry <-> source LIMIT 1) AS source,
(SELECT noeud_routier.ogc_fid FROM noeud_routier ORDER BY noeud_routier.wkb_geometry <-> target LIMIT 1) AS target,
cost,
reverse_cost
FROM troncon;
然后您可以使用 dijstra 来获得最佳路线:
WITH road_near_parcel AS (
SELECT noeud_routier.ogc_fid AS id
FROM noeud_routier
ORDER BY noeud_routier.wkb_geometry <-> (SELECT parcels.centroid FROM parcels WHERE id = 250000054000010276) LIMIT 1
),
road_near_facility AS (
SELECT noeud_routier.ogc_fid AS id
FROM noeud_routier
ORDER BY noeud_routier.wkb_geometry <-> (SELECT facilities.geometry FROM facilities WHERE id = 1946) LIMIT 1
)
SELECT troncon_route.num_route,
SUM(di.cost) AS cost
FROM pgr_dijkstra(
'SELECT id, source, target, cost, reverse_cost FROM routes',
(SELECT road_near_parcel.id FROM road_near_parcel),
(SELECT road_near_facility.id FROM road_near_facility),
false
) AS di
JOIN troncon_route ON troncon_route.ogc_fid = di.edge
GROUP BY troncon_route.num_route;
希望有帮助!我认为您可以专注于如何将多行字符串转换为路由表。您可以使用 ST_EndPoint 和 ST_EndPoint 来获取四肢