为什么 graphhopper 使用一些 OpenStreetMap 铁路元素来构建汽车图

Why does graphopper use some OpenStreeMap railway elements for car graph build up

Graphhopper 项目(OpenStreetMap 的开源路由)导入 稍后将在道路网络图中使用的特定铁路元素。

在文件 CarFlagEncoder.java 中,允许将存储在 acceptedRailways 中的一些特定铁路类型添加到图表中:

   // do not drive cars over railways (sometimes incorrectly mapped!)
   if (way.hasTag("railway") && !way.hasTag("railway", acceptedRailways))
        return 0;

acceptedRailways 在 AbstractFlagEncoder 中定义:

    acceptedRailways.add("tram");
    acceptedRailways.add("abandoned");
    acceptedRailways.add("abandoned_tram");
    acceptedRailways.add("disused");

    acceptedRailways.add("dismantled");
    acceptedRailways.add("razed");
    acceptedRailways.add("historic");
    acceptedRailways.add("obliterated");

虽然我能理解为什么使用"tram"(汽车和有轨电车有时共用一条道路,所以汽车可以在上面行驶),但我不明白其他铁路类型。

为什么需要它们?谁想通过历史悠久的不存在的铁路路线? 如此处所示 http://wiki.openstreetmap.org/wiki/Demolished_Railway

我不熟悉具体的项目,我想我可以从design/code评论的角度回答你的具体问题。

Why are they needed? Who want to route via an historic non existing railway?

我认为我们需要关注路由的来源。

graphhopper 项目事前使用 OpenStreetMap 数据源中的所有路线。该项目似乎包含所有类型的路线。这意味着事前所有路线都是有效的;高速公路/轮渡/铁路。

然后在建图的时候解析下来。您可以在您提到的 acceptWay 函数中看到这一点。这里各种标签是必需的或受限制的

注意前几行:我们已经需要 highway 标签。 (或处理其他案件)。

String highwayValue = way.getTag("highway");
if (highwayValue == null)
{
      if (way.hasTag("route", ferries))
      {
           String motorcarTag = way.getTag("motorcar");
           if (motorcarTag == null)
               motorcarTag = way.getTag("motor_vehicle");

           if (motorcarTag == null && !way.hasTag("foot") && !way.hasTag("bicycle") || "yes".equals(motorcarTag))
               return acceptBit | ferryBit;
       }
       return 0;
 }

一旦我们通过了主要的 highway 标签检查,就会执行其他检查。 铁路 支票就是其中一项支票。


现在:为什么我们要允许那些其他子类型的铁路?

因为,这些类型的铁路可能目前可以通行

acceptedRailways.add("tram");
acceptedRailways.add("abandoned");
acceptedRailways.add("abandoned_tram");
acceptedRailways.add("disused");

acceptedRailways.add("dismantled");
acceptedRailways.add("razed");
acceptedRailways.add("historic");
acceptedRailways.add("obliterated");

进一步支持:除了电车之外,所有这些词都表示某种形式的当前不存在。

有时,map/route 会包含旧标记。 所以,我有根据的猜测是程序的设计者做出了权衡。

如果 acceptedRailways 高速公路 并且满足有效 高速公路 的所有条件,则允许它。否则,它会像其他任何东西一样失败。

(它也可以看作是对 无铁路标签 检查的限制的放松;设计者不愿意冒险允许一条路线与铁路标签,没有特殊的、不存在的标签。即使它可能有公路标签!)

这是由于 OSM 中的奇怪标记而引入的,并导致铁路用于汽车,这是不可接受的。

现在 'OSM market power' 我们正在考虑完全删除此解决方法并修复数据。这不仅是更好的方法,而且还会导致其他地方出现当前行为问题,请参阅 here 了解更详细的讨论。