如何找到 HERE Routing API 路线的中间位置?

How can I find the middle of a HERE Routing API route?

通过执行 GET 请求,我从 HERE 路由接收路由信息 API:

https://router.hereapi.com/v8/routes?apikey=MY_API_KEY&destination=52.530394,13.400683&origin=52.530728,13.383833&return=polyline,travelSummary&transportMode=truck&&vehicle[speedCap]=30&spans=names,length,duration,speedLimit

现在我想找到相对于总时间在路线中间的坐标。所以我在下面的例子中,总持续时间是 274 秒。我怎样才能知道 137 秒后我将处于哪个位置? (在实际应用中,这些时间要长得多。这里,为了简单和较小的 JSON 文件大小,我只选择了很短的距离)

首先,我想添加跨距的起始坐标和结束坐标,但是 API 似乎不可能。

其次,我想到了使用折线。从那里我收到了很多坐标,但是我没有看到将这些坐标之一连接到特定旅行持续时间的可能性。

有什么方法可以通过 HERE 路由 API 或任何 PHP 计算获得我正在寻找的信息?

{
  "routes": [
    {
      "id": "90be4eb8-d0ba-47f8-9954-9be444576a17",
      "sections": [
        {
          "id": "bfd32e45-662b-4b7e-a297-21eeee09dd68",
          "type": "vehicle",
          "departure": {
            "time": "2021-12-11T23:42:04+01:00",
            "place": {
              "type": "place",
              "location": {
                "lat": 52.5307744,
                "lng": 13.3838015
              },
              "originalLocation": {
                "lat": 52.5307279,
                "lng": 13.383833
              }
            }
          },
          "arrival": {
            "time": "2021-12-11T23:46:38+01:00",
            "place": {
              "type": "place",
              "location": {
                "lat": 52.5303982,
                "lng": 13.4006967
              },
              "originalLocation": {
                "lat": 52.5303939,
                "lng": 13.4006829
              }
            }
          },
          "travelSummary": {
            "duration": 274,
            "length": 1338,
            "baseDuration": 264
          },
          "polyline": "BGslnmkDyn8wZ8CmL4Iof0F0U8BoGsEoQwCsJsEkSoBoG8BsJsE0U8BgK8BoLoB4IoB0KoBoLoBkNwC8a8B0UoB0UoBkNsEgtBkDsd8BsTkDgZsEgtB4D0jBgFwvBoG46B8B8QwCoV8BwMgFgtBUwHkD8akDgeU4NoB4XAkIoB0ZoB8pBU0K8Boa8B0PkDkS7GkD3I0F3DwC7foa7G0Fzeoaze0ZvTiQ",
          "spans": [
            {
              "offset": 0,
              "names": [
                {
                  "value": "Invalidenstraße",
                  "language": "de"
                }
              ],
              "length": 189,
              "duration": 31,
              "speedLimit": 13.8888893
            },
            {
              "offset": 11,
              "names": [
                {
                  "value": "Invalidenstraße",
                  "language": "de"
                }
              ],
              "length": 872,
              "duration": 184,
              "speedLimit": 8.333334
            },
            {
              "offset": 44,
              "names": [
                {
                  "value": "Brunnenstraße",
                  "language": "de"
                }
              ],
              "length": 277,
              "duration": 59,
              "speedLimit": 8.333334
            }
          ],
          "transport": {
            "mode": "truck"
          }
        }
      ]
    }
  ]
}

使用 spans 对象中的信息绝对是可行的方法。您需要做的是将跨度分解成尽可能多的部分。您可以通过将这些值添加到请求中的参数来实现:

&spans=duration,length,segmentId,names,speedLimit,dynamicSpeedInfo,baseDuration,typicalDuration,segmentRef

您会看到响应包含由 offset 属性标识的跨度列表,它告诉您您的坐标跨度所指的多段线。这意味着您想知道跨度持续时间之和为 137 时的偏移量(坐标索引)是多少。

此过程将使您获得相对于旅行时间的路线中间的最佳近似值:

  1. 遍历跨度列表并对 duration 属性中的值求和;当总和等于或大于所需持续时间(在您的示例中为 137)时,循环应停止。
  2. 获取offset属性的值,并加1.
  3. 解码您的多段线,并在索引处获取坐标,该索引等于您在第 2 步中获得的数字(偏移量 + 1)。

对于您示例中的路线,满足步骤 1 中条件的跨度为 offset=31,因此您对折线中索引 32 处的坐标感兴趣。