我有一个表,用于存储由名称和两个几何点(原点和目的地)组成的“路线”。用户将通知他的出发地和目的地,并且我应该获得最佳路线,其最佳匹配他的出发地和目的地点(或者可能是最佳路线的列表,从最好到更差)。路径无关紧要,只是起点和终点。
我创建了这个查询,它根据查询进行调整,以找到最接近点的点,但它有时会给我正确的结果,但有时却没有。
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”的使用,它将在以后实施。考虑到我只有一个原点和一个目标点,我想从一个表中获得最佳路线,每一行都有一个起点和目的点。
答案 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);