Postgis - 如何找到出发地x目的地的最佳路线

时间:2018-04-24 04:09:20

标签: sql postgresql geospatial postgis

我有一个表,用于存储由名称和两个几何点(原点和目的地)组成的“路线”。用户将通知他的出发地和目的地,并且我应该获得最佳路线,其最佳匹配他的出发地和目的地点(或者可能是最佳路线的列表,从最好到更差)。路径无关紧要,只是起点和终点。

我创建了这个查询,它根据查询进行调整,以找到最接近点的点,但它有时会给我正确的结果,但有时却没有。

SELECT "Routes".Name AS name, origin.location AS origin, 
destination.location AS destination FROM "Routes"
JOIN "StopPoints" AS origin ON ("Routes"."originId" = origin.id)
JOIN "StopPoints" AS destination ON ("Routes"."destinationId" = 
destination.id)
ORDER BY origin.location <-> st_setsrid(st_makepoint(-26.956636, 
-48.639537), 0),
destination.location <-> st_setsrid(st_makepoint(-26.907525, -48.661486), 0);

那里定义的坐标只是例如。并且忽略“StopPoints”的使用,它将在以后实施。考虑到我只有一个原点和一个目标点,我想从一个表中获得最佳路线,每一行都有一个起点和目的点。

1 个答案:

答案 0 :(得分:1)

当前查询不起作用,因为它只是优化到起点的距离,并且只有当两条路线具有相同的起点时才会考虑到终点的距离。

一个简单的解决方案是考虑到起点和终点的距离之和,并找出累积距离最小的路线。

您还可以通过仅考虑您所在位置X km内的起点/终点来优化它。如果您想要考虑更复杂的网络,应考虑路由解决方案,例如pg_routing。

以下是您的查询被修改以考虑到起点/终点的距离之和

SELECT "Routes".Name AS name, origin.location AS origin, 
destination.location AS destination 
FROM "Routes"
  JOIN "StopPoints" AS origin ON ("Routes"."originId" = origin.id)
  JOIN "StopPoints" AS destination ON ("Routes"."destinationId" = 
destination.id)
ORDER BY origin.location <-> st_setsrid(st_makepoint(-26.956636, 
-48.639537), 0) + destination.location <-> st_setsrid(st_makepoint(-26.907525, -48.661486), 0);