1

通过执行 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"
          }
        }
      ]
    }
  ]
}
4

1 回答 1

1

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

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

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

此过程将为您提供相对于行程时间的路线中间的最佳近似值:

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

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

于 2022-01-02T21:18:47.933 回答