ルート沿いの検索の実装方法
/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バイトの長さにするために使用されたepsilonは0.0002です。
より長いルートの場合はepsilonを増やす必要があります。
たとえば、ニューヨーク市とロサンゼルス間のルートに対してHERE Routingが返すポリラインは約200K文字です。
イプシロン0.015であれば、そのサイズを1,494バイトに縮小できます。反復的なプロセスを設定することで、適切な長さに調整できます。
HERE Routing APIによって提供されるルートに対する単純化ワークフローは次のようになります。
- フレキシブルポリラインを地理座標の行文字列にデコーディングする
- 行文字列を単純化する
- 単純化された行文字列を短いフレキシブルポリラインにエンコーディングする
たとえば、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)4 日前の更新