【问题标题】:Get exact geo coordinates along an entire route, Google Maps or OpenStreetMap沿整条路线、Google 地图或 OpenStreetMap 获取准确的地理坐标
【发布时间】:2013-05-18 15:51:33
【问题描述】:

假设我有一条从一个城镇到另一个城镇的路线。从 Google Maps API 我可以恢复两者之间的路线。但是,从 Google 返回的路线是包含地理坐标的驾驶路线,仅在一条腿还有另一步的地方(例如,我必须从一条高速公路转向另一条高速公路)。

我需要的是整个路线上的地理位置(纬度/经度),以特定的间隔(例如,每 1/4 英里或 100m)。

有没有办法通过 Google Maps API/网络服务来实现这一点?

或者 OpenStreetMap 数据库会是这样做的方式吗?

亲切的问候, 玛德琳。

【问题讨论】:

  • 您是否正在尝试制作“里程标记”?喜欢this questionthis example
  • 是的,我想要的是里程标记。 geocodzip 链接非常有用。

标签: google-maps geolocation openstreetmap


【解决方案1】:

OSRM 为您提供具有道路几何形状的路线,就像它们在 OpenStreetMap 数据库中一样。例如,您可以将路由作为 GPX 获取(如果需要,可以对该文件进行后处理)。如下所示:

GET http://router.project-osrm.org/viaroute?hl=en&loc=47.064970,15.458470&loc=47.071100,15.476760&output=gpx

阅读更多:OSRM API docs

【讨论】:

  • 路径或小径有类似的东西吗?
  • 上述查询不再起作用,因为 OSRM 的“viaroute”服务已被“route”服务取代。查看我对当前解决方案的回答:stackoverflow.com/a/47539464/2350644
【解决方案2】:

由于接受的答案已过时且不再有效,因此可以使用来自Project OSRMroute service 查询沿路的所有节点。

给定任意数量的 lon,lat 对。 例如以下三个(在柏林):

  • 13.388860,52.517037
  • 13.397634,52.529407
  • 13.428555,52.523219

路线服务计算这些点之间的最快路线,并使用以下查询返回沿路的所有节点:

http://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.397634,52.529407;13.428555,52.523219?alternatives=false&annotations=nodes

这将返回一个 json 响应,其中包含沿途所有节点的节点 ID。结果应如下所示:

{
  "routes": [
    {
      ...
      "legs": [
        {
          "annotation": {
            "nodes": [
              2264199819,
              2045820592,
              21487242,
              ...
    ]
 }

可以使用OverpassAPI 接收节点的纬度、经度坐标。

[out:json];
(
   node(264199819);
   node(...);
   node(...);
   ...
);
(._;>;);
out;

这是使用 overpass-turbo 的示例请求:http://overpass-turbo.eu/s/toe

【讨论】:

  • 我有源和目标 lat-lng 对,我想要 lat-lng 对用于距离不远的中间点,比如 20 英里。我该如何做到这一点?
  • 当我使用 OverpassAPI 获取 lats 和 lngs 时,我得到一个按 node_id 排序的 json。但我希望 json 的排序与查询中的节点顺序相同。你有什么想法,我是否能做对吗?
  • 虽然这确实有效,但它需要另一个 API 请求,它不必要地使用数据并且可能很慢(我非常轻松地发出了 8 秒的请求)。我推荐@Adithya Ajith 的答案,因为它几乎是即时的。
【解决方案3】:

这只是 google.maps.DirectionsService().route() 方法。您需要传递服务请求,然后在服务请求完成时执行回调。

https://developers.google.com/maps/documentation/javascript/directions

【讨论】:

  • 看着它。但它是否给出了“腿”之间的 lat.long,例如,大于 10 英里?
【解决方案4】:

虽然不用作API,但这里:https://www.nmeagen.org/可以创建“多点线”,设置点之间的距离和下载路线(坐标)为CSV。

【讨论】:

    【解决方案5】:

    添加到马里奥的答案。

    您可以使用 Google Maps Directions API 本身。 对于给定的起点和终点,在 JSON 输出中查找以下内容:

    "polyline" : {
      "points" : ""
    }
    

    您可以使用解码器从折线获取坐标。: https://github.com/emcconville/google-map-polyline-encoding-tool 要么。您可以使用 R 中的 googleway 包对其进行解码。 https://cran.r-project.org/web/packages/googleway/googleway.pdf

    虽然我不确定如何将分辨率设置为您想要的级别。但是 API 输出中的分辨率非常好。

    【讨论】:

    • 实际上,您需要通过overview_polyline 获取整条路线的所有纬度/经度坐标。 vignette 提供了更多示例和详细信息。
    • 但是总览并没有准确地描绘出道路的曲率。腿部每一步的折线点给出了更详细的路线坐标。
    • 在我看来,使用每个 polyline : points 会导致大量冗余信息(例如,一条腿的最后一个坐标将是下一条腿的开始)。而overview_polyline 对沿道路和路线的每次方向变化都有一个点,因此其间的所有点都在一条直线上并且可以推断出来。
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2020-01-03
    相关资源
    最近更新 更多