【问题标题】:OSRM giving wrong response for distance between 2 pointsOSRM 对 2 点之间的距离给出错误的响应
【发布时间】:2018-06-21 14:35:42
【问题描述】:

我正在尝试通过 projects-osrm 获取两个地理位置之间的距离。 通过python。

import requests
source_coordinates = '18.21231,42.50830;'
dest_coordinates = '18.20971,42.50075'
url =  'http://router.project-osrm.org/route/v1/driving/'+source_coordinates+dest_coordinates

payload = {"steps":"true","geometries":"geojson"}

response = requests.get(url,params=payload)

data = response.json()
print(data)

`
{
  "routes": [
    {
      "geometry": "oksbGmvonB??",
      "legs": [
        {
          "summary": "",
          "weight": 0,
          "duration": 0,
          "steps": [],
          "distance": 0
        }
      ],
      "weight_name": "routability",
      "weight": 0,
       "duration": 0,
      "distance": 0
  "code": "Ok"
}
`

如您所见,我得到的距离为 0 作为响应。

但是当我在网站上输入相同的坐标时。

http://map.project-osrm.org/ 并输入相同的坐标,我得到 2.5 公里和 6 分钟。

以下是截图:

我能否知道为什么会发生这种情况,还有其他方法(开源)来获取两个地方之间的距离和时间。

提前致谢

【问题讨论】:

  • 如果我没记错的话,我们可以补充一点,osrm 会在他最近的已知地图上投影您的位置。因此,如果您交换经纬度并到达大海,它将投影到最近的地图,并且两个投影点可能非常接近。
  • @roganjosh 是的,这有帮助。!交换了纬度和长期位置! :) 谢谢。但我仍然认为 OSRM 地图数据不像谷歌地图那样经常更新。
  • @user8150031 实际上,我发现这对 OSRM 来说非常令人沮丧。例如,在 graphhopper 中,很容易为糟糕的纬度/经度数据设置一个半径标志,这样它就不会在一定距离后捕捉到沿海道路。当我希望 OSRM 会引发错误时,OSRM 似乎更具容错性(我想在某处设置了一个标志,但我没有成功)。最终它确实放弃了寻找道路,而且这些位置都出海了
  • @SRingne 我不确定你的意思。 Geofabrik 每天都会更新 osm.pbf 文件。如果您是自托管的,则该地图与 OSRM没有任何关系,它仅取决于决定处理新图表的频率。但是,OSM(构建地图)是众包数据,因此它不会像世界上最大的科技公司之一全力以赴那样完整。但是,对于任何合理数量的请求,Google 都不是免费的。这取决于你想要什么,不幸的是你不能拥有一切......
  • 嗯,好的,我看到你实际上是在使用他们自己的站点 API 为你做路由。请注意,这项服务是为了合理使用,所以不要用请求敲打它,否则它会阻止你。在您自己的实例之一上自行托管服务非常容易,然后您可以完全控制地图的更新频率,并可以根据需要生成任意数量的请求。

标签: python openstreetmap osrm


【解决方案1】:

将我们讨论中出现的所有不同部分捆绑起来。

1.主要问题 - 给出 0 行驶距离

可以在here 找到 API 的当前文档(适用于 >V4.x)。请注意“请求”下的坐标以lon,lat 顺序提供:

格式字符串 {经度},{纬度};{经度},{纬度}[;{经度},{纬度} ...] 或 polyline({polyline}) 或 polyline6({polyline6})

假设它们在lon,lat 配对中,您提供的当前坐标将两个位置都放在海中。因此,您可能会以更自然的lat,lon 顺序提供坐标。 Web 界面需要lat,lon,因此会产生您期望的输出。老实说,我不知道为什么 API 坚持lon,lat

2。其他路由服务

在他们的 Wiki here 中可以找到基于 OSM 数据构建的当前路由软件列表。其中,我广泛使用了 Graphhopper 和 OSRM,但没有其他任何一个。关于我用过的,我可以说几件事:

  • 对于大型查询,OSRM 比 Graphhoper 快得多 因为它支持矩阵调用而 Graphhopper 不支持(在 开源格式)。位置之间的查询速度低于 300 次/秒 对,没有区别。
  • Graphhopper 带有一个内置的前端。OSRM front-end 是一个 需要 JavaScript 努力集成的独立实体。
  • Graphhopper 提供便宜的API service 如果你不想 自主办。

3.自托管

您当前用于 OSRM 的 API 受公平使用政策的约束。它不适用于任何重要的工作,只是不经常调用。您还担心它没有经常更新。这两个问题都可以通过自行托管您自己的软件版本来解决(OSRM 已放弃 Windows 支持,但您可以在虚拟机上构建,然后桥接端口 5000,这样您就可以从 Windows 调用 API,这就是我所做的) .

  • 构建 OSRM 指令可以在here 找到。
  • 地图文件解压说明见here
  • Geofabrik 每天更新地图文件。您可以随时从here.osm.pbf 格式下载新的地图文件。

    OSRM 矩阵调用的旁注。关于返回距离和时间的矩阵 APIboth,我不完全理解 here 的争论。如果您需要该功能,您应该通过niemeier-PSI here 加载分叉项目的table-distances 分支。我从来没有加载过全球地图文件,只是在每个国家/地区的基础上加载,所以对这种方法的任何内存问题对我来说都是没有意义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多