ガイドAPIリファレンス変更履歴
ガイド

ルート沿いの検索の実装方法

/autosuggest/discover/browseエンドポイントは任意のrouteパラメーターを使用したルート沿いの検索のユースケースに対応しています。

検索結果は次の 2 つのタイプの距離要素を使用して返されます。

  • distance:ルートの合計距離とルートから結果までの距離の合計
  • excursionDistance:ルートから結果までの距離

ルートの定義

routeパラメーター値の形式はHERE flexible-polylineです。 指定したルートからの幅をメートル単位で指定した、追加の任意パラメーターwにより拡張されます。wに対して受け入れられる最大値は50000 (50km)です。

パラメーターwの値は検索結果とポリラインの間の直線距離での最大距離です。

結果、検索結果に表示されるコリドー ポリゴンは合計幅 2*w となります。ポリラインと幅の組み合わせで コリドーを形成し、すべての検索結果は定義されたコリドーに制限されます。

distance フィールド値はポリラインに沿った距離の合計に、ポリラインから結果までの直線距離を加えたものです。その距離は次の図では l1+l2+l3 となります。

l3 について次の点にご注意ください。

  • l3 は常に l3 < w です。
  • excursionDistance レスポンス要素は 2*l3 と等しくなります。
ポリライン、コリドー、幅、距離

w のデフォルト値は 1,000 (メートル) です。URLの長さ2,048バイトに準拠するため、ルートのポイント数を300以下にすることを お勧めします。

/discoverエンドポイントを使用するアプリケーションでは、ベルリンからハンブルクへの定義済みルートにおいて、 そのルート上の位置52.5308,13.3847から幅1,000メートルのルート沿いにある「レストラン」について、次のクエリを送信できます。

https://discover.search.hereapi.com/v1/
discover?apiKey={YOUR_API_KEY}
&at=52.5308,13.3847
&limit=10
&route=BF0-zgKyl2xCvCrJ2mBtwBwY9kB2xEthIyYrjDuBjlBoOpEoLNoJzE0I9KkPjeiI5JwrDzoCqdtc8H1NgKtjBsM1WuQ_yB2alkCuGlK8EpDuFUiPgV-HT0LpOkJDmD5B2dnnBmI_G8J_D0zEmW4RbiSzD6N3EuUtKqS9MsOjNsZneiyC1oE8RxY8hB1iB8tBjesJzJ8HhOuErPmC1W1FxjBzB7YD3kGiK5iFaty
BvEzlC7Nj_D1B7lBgB3rBiGj5Bq8B7tL-YhjHsM_6BiSt2Bi8Cv7F0SrrBwO_nBoMtnBiN7zBggBzuFqRrqC-LvmB8QzsB4hBrkCohB_xBkiBxnBqhBvd4hBrW2lBpRsnB_JysB1DizDhBkYlE6a3JqW3M6ZvU2pC5tC6oBziB8uB3c2kF51C4XvPyT_QmhBpnB45Bt7CmnC31CuW5f0NjYwOtfiqBn2DiVhtBoWxjB09Bjw
C-zBx5C-brmBmczcg1BruB0apbklEtiFkjB1nBwiBlhB4_BtzB8X3XyZ9hBm4Bn6CwiB7oBoWxTkZzQszCzlBuWzMge1WoclckZpgBgcxuBu1Bl3DgTnmBwaloB8V9YkbjXgb9PsKZuGwCmRgRsI4DqL1B-J3I8F_K0D5NsFtvCkJ77B2K5uB4PtyBsO7jBgVnqBqTtf6gBrtBkYtpB2Y12BqS92BuKnpBqJ5yByPt9E6Jxh
CwQ9jCmSj1ByWryBmattBqRxY4xBh9BojB33BqwElzIqV_wBwbhtCkXnzByZzrBg4BnxCymB5oCsbhiCsY3rCmNj0B2mBpwF4NhxBqXn9BkkBhrCiZ1lCqNr0B-Jz0BgMnzC4Gt-BsGrxDkC1yIqF7jCsLpnCgJlnB-NhvBkP3oBmQrkBge71B23BhuC0Std-SljBgU3tBkW_jC2gBzwEglB94D4MzhC0L9vDoNtnCyU_kC
ufpqCwQhuB0MjvBkKj1BqFhrBmDpyBqCzjIoChlC4HhpC4NnkCmRn5BgU5xBoVzpBigBzyB2QlewQ7lB0cpxCiO9gBqS_hBgkB72BiSxf0Q_kB8M9kB-dp5D-e33C0OnyByLzyByJ17BiGnjCqBrhC7BxvB3K1_DFxqC-Hp9C0I1zB-JjsB4WtqC0drlCmWzoB03CrrEqR9gB8P5kBqVxhCwShyCkN3tB6O_nBqdpjC6Qtx
BiOx5B6Ir2BoF99BM3zBxCzwBtMl0DlBzyBuCn6B-zB1nM4T_6G0FtuE8EzlCmjC7hS2GzsCqI3yF_G7-F0D54J0FzwC2O35Cw2Cv-K8xB9xHmUhpC6pBlgE6QtrC2JlqCwF9wCS1lCvCj9DwC52BuV54DsK_1D2WrjDuO7hEmenwEqIzkCmB32BjD_yBtzB_pL1EjvB_BhtB-B3iCkR3pGvBpkBnM1oDL5wB-Gv2B4iB_zE
qFjsBsC9vBnCtlCvNrxErtBrlJ1HnsDb3oB2CppBkZnkEgB_V1B_kB1DjRpH3R1JtP_M9NvWzO55B7XxYnPnchXlpBjoBnhBnrBriB97BpbjhClOtrBzOt3BjH1xBoB5hBgLzpC2DtvFqD5N6G_I85B51BwUvRoLtE2KiD4MwHqnBgkB8UqQ0EuCiChBkL_ZmIpjBuNtlBuN9R6CrMWjkB2MyB6RvH6TjiB2GnY0B9R7I5E9
I9H3CNhDyF;w=1000
&q=restaurant

このクエリは次のレスポンスを返します。

{
  "items": [
    {
      "title": "Cô Chu",
      "id": "here:pds:place:276hzqom-a51495c57f0210dc85fd26e4b796f449",
      "resultType": "place",
      "address": {
        "label": "Cô Chu, Invalidenstraße 29, 10115 Berlin, Deutschland",
        "countryCode": "DEU",
        "countryName": "Deutschland",
        "state": "Berlin",
        "county": "Berlin",
        "city": "Berlin",
        "district": "Mitte",
        "street": "Invalidenstraße",
        "postalCode": "10115",
        "houseNumber": "29"
      },
      "position": { "lat": 52.53112, "lng": 13.38471 },
      "access": [{ "lat": 52.53104, "lng": 13.38476 }],
      "distance": 36,
      "categories": [{ "id": "100-1000-0000" }],
      "foodTypes": [{ "id": "200-000" }, { "id": "206-000" }]
    },
    {
      "title": "Bangaluu-Private Dining",
      "id": "here:pds:place:276u33db-6943d7dab85640d3bf84eb810a46b6c3",
      "distance": 34,
      ...
    },
    ...
    {
      "title": "Bio Company Chausseestraße",
      "id": "here:pds:place:276u33db-7be18fbf70df4a53ad7013794b014fea",
      "distance": 119,
      ...
    }
  ]
}

ルートの簡略化

HERE Routing APIなどの業界をリードするサービスが返すルートは非常に詳細です。

たとえば、ベルリンとハンブルクを結ぶルートのフレキシブルポリライン文字列は約18Kバイト(約4,000ポイント)です。

/discover/autosuggest/browseエンドポイントで使用するには、ルートを幾何学的に簡略化して HERE Geocoding and SearchでサポートされているURLの最大長2,048バイトに合うようにする必要があります。このためには、開発者は 一般的なO(n logn)計算量を提供するRamer-Douglas-Peuckerアルゴリズムの使用を検討することをお勧めします。

上の例で使用されたフレキシブルポリラインは、ベルリンからハンブルクまでのルートに対してHERE Routing APIが返したポリラインに、Ramer-Douglas-Peuckerによる単純化を適用した結果です。

1769バイトの長さにするために使用されたepsilon0.0002です。

より長いルートの場合はepsilonを増やす必要があります。

たとえば、ニューヨーク市とロサンゼルス間のルートに対してHERE Routingが返すポリラインは約200K文字です。

イプシロン0.015であれば、そのサイズを1,494バイトに縮小できます。反復的なプロセスを設定することで、適切な長さに調整できます。

HERE Routing APIによって提供されるルートに対する単純化ワークフローは次のようになります。

  1. フレキシブルポリラインを地理座標の行文字列にデコーディングする
  2. 行文字列を単純化する
  3. 単純化された行文字列を短いフレキシブルポリラインにエンコーディングする

たとえば、HERE flexible-polylineパッケージと simplificationパッケージ(Blue Oak Model License)を使用するPythonスクリプトは次のようになります。

from flexpolyline import decode, encode
from simplification.cutil import simplify_coords

def simplify(flex_polyline: str, limit: int=2000) -> str:
    decoded = decode(flex_polyline)
    if len(decoded) > limit:
        epsilon = 0.0000002
        simplified_coords = simplify_coords(decoded, epsilon)
        while len(simplified_coords) > limit:
            epsilon *= 1.1
            simplified_coords = simplify_coords(decoded, epsilon)
    else:
        simplified_coords = decoded
    return encode(simplified_coords)