根据多线字符串表查找路线

问题描述 投票:0回答:1

我有一个包含很多 MultiLineString 功能的 Postgis 表。

我想使用该数据创建 A 点和 B 点之间的路线。我假设没有单一功能可以解决该问题。这意味着路线必须由两个或多个 MultiLineString 要素组合而成。

我该如何解决这个问题?

postgresql geospatial postgis spatial pgrouting
1个回答
0
投票

如果没有示例,实际上不可能回答,但我可以向您指出我为解决类似问题所做的工作的方向。我有很多代表道路的 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 来获取四肢

© www.soinside.com 2019 - 2024. All rights reserved.