使用pgRouting计算多个源和目标之间的距离

时间:2012-08-16 05:13:44

标签: distance shortest-path

我正在使用Postgres / PostGIS / pgRouting为我正在进行的分析准备数据集。我需要准备的数据集中的一个字段是100,000个家庭的数据集(点数据)与数十个活动中心的数据集(也是点数据)之间的最短道路距离。我已经创建了一个节点和网络数据集来准备这个。我还使用包含最近节点的id值的列更新了我的家庭和activity_centre数据集。

到目前为止,我已经能够使用driving_distance()函数来计算从中央商务区(CBD)到每个家庭的道路距离,但我希望在一次运行中为所有中心做到这一点而不必进行每个中心的单独距离数据集。

更重要的是,我最终必须对每个家庭和最近的火车站之间的道路距离做同样的事情。

有解决方法吗?

非常感谢,

1 个答案:

答案 0 :(得分:1)

我不知道我的问题是否正确。如果它像

  • 你有10万个家庭
  • 其他人的数量较少(可能是1k) 兴趣点(活动中心,火车站等)
  • 的 目的是显示从/向其中一个家庭的最短路径 在没有做太多运行时间的情况下往返于兴趣点 计算
  • 我假设您拥有的道路数据更远 指示,即可能有单向道路。
  • 这些要点不会经常变化,

然后你可以尝试这样的方法:

  1. 准备一个包含所有100 + 1k节点和道路边缘的有向图。道路将从节点定向到节点,权重与其距离成比例。
  2. 准备相同的反向图-i.e.只需切换from和to节点,保持相同的权重。
  3. 对于每个兴趣点P,做一个Dijkstra,它将返回100 + 1k点的完整前驱图(最短路径树作为数组),它给出了从P到所有其他点的最短距离。这是一个100 + 1k值的整数数组。
  4. 在反向图上重复此操作。这将为您提供一个predecessor_map,它可以从所有其他点给出每个兴趣点P的最短距离。
  5. 现在你有2 * 1k阵列,每个阵列有100 + 1k值。对于每个阵列,您还可以知道点P的位置。
  6. 运行时计算:

    • 要计算从P到任何其他点的最短路径,请使用第一个数组。转到阵列上目标点的位置,查看它对应的值是什么,然后转到阵列上的那个元素,重复直到达到P的位置。
      

    示例:如果P位于第7位且您的终点位于第12位,   转到数组元素12,读取其值array_val [12] = 10,   现在有10,比如array_val [10] = 7,那么你的路径是7-10-12。

    • 同样,如果您对第二个数组执行此操作,则最短路径将是相反顺序的路径,即12-10-7。

    观察:

    1. 上述两个步骤在运行时(毫秒)要快得多。你不需要在运行时使用Dijkstra,a。
    2. 第一次计算2 * 1k最短路径树应该总共需要大约2 * 1000 * 0.8 = 1600秒(在具有4 GB RAM和i5处理器的Linux笔记本电脑上)。
    3. 您可能希望直接使用boost-graph来执行此操作,但是..
    4. 使用pgrouting:

      如果要使用pgrouting,可能需要修改boost_wrapper.cpp函数boost_dijkstra以返回完整的predecessor_map而不是仅返回一条最短路径(将其复制到path_vect)。这将使pgrouting dijkstra始终返回最短路径树,而不是仅返回最短路径。我还没有对此进行测试(请注意,pgrouting内部会进行索引重新排序,但此方法应该会返回原始索引ID)。