项目graphhopper(OpenStreetMap的开源路由(导入稍后在道路网络图中使用的特定铁路元素。
在 CarFlagEncoder 文件中.java允许将存储在 acceptedRailways
中的某些特定铁路类型添加到图形中:
// do not drive cars over railways (sometimes incorrectly mapped!)
if (way.hasTag("railway") && !way.hasTag("railway", acceptedRailways))
return 0;
接受的铁路在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");
虽然我可以理解为什么使用"电车"(汽车和有轨电车有时共用一条道路,因此汽车可以在上面行驶(,但我不了解其他铁路类型。
为什么需要它们?谁想通过历史悠久的不存在的铁路进行路线?如图所示 http://wiki.openstreetmap.org/wiki/Demolished_Railway
这是由于OSM中的奇怪标记而引入的,并导致铁路用于汽车,这是不可接受的。
现在,凭借我们的"OSM市场力量",我们正在考虑完全删除此解决方法并修复数据。这不仅是更好的方法,而且还会导致其他地方当前的行为问题,请参阅此处以获取更详细的讨论。
熟悉确切的项目,我想我可以从设计/代码审查的角度回答你的具体问题。
为什么需要它们?谁想通过历史不存在的路线 铁路?
我认为我们需要关注路线的来源。
Graphhopper 项目事前使用 OpenStreetMap 数据源中的所有路由。此项目似乎包含所有类型的路由。这意味着事前所有路线都是有效的;公路/渡轮/铁路。
然后在构建地图时对其进行解析。你可以在你提到的函数 acceptWay 中看到这一点。这里需要或限制各种标签。
请注意前几行:我们已经需要高速公路标签。(或处理其他案件(。
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;
}
一旦我们通过主要高速公路标签检查,就会执行其他检查。铁路检查就是其中之一。
现在:我们为什么要允许其他子类型的铁路?
因为,这些类型的铁路目前可能是可以通过的。
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");
进一步支持:除了电车,所有这些词都意味着某种形式的当前不存在。
有时,地图/路线会包含旧标记。所以,我有根据的猜测是,程序的设计者做出了权衡。
如果acceptedRailways
是高速公路并且满足有效高速公路的所有标准,则允许它。否则,它将像其他任何失败一样失败。
(这也可以看作是对无铁路标签检查的限制的放松;设计者不愿意冒险允许带有铁路标签的路线,没有特殊的,不存在的类似标签。即使它可能有高速公路标签!