【问题标题】:Google Directions API Encoded PolylineGoogle Directions API 编码折线
【发布时间】:2014-03-14 01:08:11
【问题描述】:

我正在尝试绘制应该与 Google Maps 街道网络匹配的路线。

我知道如何序列化来自 Google Maps Directions API 的 JSON 结果。

我现在正在研究如何对各个布线步骤中的折线进行编码。

我在 stackoverflow 上找到了一些解码器算法,但首先测试了 Google 自己的 Interactive Polyline Encoder。我希望编码的行与谷歌地图匹配,但事实并非如此。

屏幕截图显示了左侧交互式折线编码器中编码段的结果,右侧显示了 Google 地图路线的结果。

编码的折线为“uxhuBxrc|QPA@?@?B?B@@B@D@HDFD@B@H@JBB@DBFJ”

会不会是 Google 的交互式折线编码器中的算法有误?

有没有人测试过Jeffrey Sambells algorithm 并知道结果是否与谷歌的交互式解码器的结果相匹配?

干杯, 丹尼斯

编辑:问题在于返回的折线段而不是编码算法。即使是 Google 在 Directions API 页面上的示例响应中提供的示例片段,与基础道路几何形状的匹配度也很差。

【问题讨论】:

  • 不是上述问题的重复。同时我自己运行算法来解码折线,结果与交互式折线编码器中显示的相同。因此,问题是为什么方向 api 的结果与谷歌地图应用程序中显示的折线结果不同?
  • 因为正如我在答案中所说(您声称您已阅读并且不是重复的),overview_path 编码的折线被简化了。
  • 我没有使用overview_path。我正在将实际段数字化,如 routes.legs.steps.polyline

标签: google-maps encoding google-directions-api


【解决方案1】:

我也遇到了困难。我设法想出的唯一解决方案(虽然效果很好)是使用 Google 的 snap to road API。将不准确的折线的坐标发送到 API,API 会返回更正后的坐标。

希望这会有所帮助。

【讨论】:

  • 哇。听起来很酷。我停止使用谷歌地图,转而使用 OpenStreetMap。但我会将此标记为正确答案,因为我相信这会起作用。
  • 我试过了,效果很好,但是,捕捉仅适用于彼此相对靠近(约 300 米)的点。 Directions api 在通过笔直道路时为我提供了它们之间距离超过几公里的点,这就是 Roads API 中断并导致不良捕捉的时候。没有想法如何应对它。我需要路线 API 来返回更多的点,但没有这样的设置“步骤之间的最大距离”
  • @Starwave 早在我使用 Google 地图时,我就编写了一个快速课程来为您处理所有这些。看BVAccurateRoutePlot
  • 我开始使用“OpenRoute 服务”来替代 Google 地图。它让我得到了 json 格式的折线点,所以我可以直接在我的代码中使用它们。检查网站:openrouteservice.org/dev/#/api-docs/directions/get 并检查此 API:api.openrouteservice.org/…
【解决方案2】:

几个月后,我终于收到了 Google 的回复。不幸的是,他们无法理解问题并提供帮助。我再次查看了解码算法,现在我可以自己回答这个问题了。

算法将坐标四舍五入为 1e5。

Google Polyline algorithm

因此,不可能对符合底层道路网络渲染的折线进行编码,在最高缩放级别下具有更高的精度。

此图像显示了坐标四舍五入到 1e5 的最大位置精度。

【讨论】:

  • 嗨!您是否设法解决了这个问题或找到了解决方法?或者你只是满足于看起来很糟糕的折线?
  • 从未找到解决方案,然后完全停止使用 Google 地图,因为我们希望成为 100% 开源/开放数据。
【解决方案3】:

您也可以从

下载示例项目

https://github.com/xomena-so/so47492459

不要忘记将 API 密钥替换为您的。

我希望这会有所帮助!

【讨论】:

    【解决方案4】:

    你可以试试这个:http://zevross.com/blog/2014/09/23/convert-google-directions-to-geojson-points-or-polylines/?subscribe=success#blog_subscription-3

    您可以尝试以下步骤(如果您使用的是 Node.js):

    npm install polyline
    

    然后:

    var polyline = require('polyline');
    
    // returns an array of lat, lon pairs
    polyline.decode('_p~iF~ps|U_ulLnnqC_mqNvxq`@')
    

    其中字符串“_p~iF~ps|U_ulLnnqC_mqNvxq`@”是从 Google Maps API 的响应中提取的:root > routes > overview_polyline > points

    地图中的结果点可以这样显示:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2023-02-12
      相关资源
      最近更新 更多