この記事は Software Engineer の Rasťo Šrámek による Google Maps Platform Blog の記事 "Introducing plus codes in Place Autocomplete, Place Details and Geocoding to help you serve users everywhere " を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
Google は、住所、スポット情報、道路などを追加することで、常に世界をマッピングしています 。しかしながら、一般的な住所情報をつける仕組みをもともと持たない地域も多く、一部では住所表記や道路名がまったくない場所もあります。食品のデリバリーやオンデマンド配送など、正確な位置の把握が不可欠なサービスにおいては、このような地域での事業展開には、困難が伴うでしょう。また、指定した場所での商品やサービスの受け取りは、今、特に重要となってきています。
この問題を解決するために、Places API、Maps JavaScript API の Places Library、Android 向け Places SDK でのプレイス オートコンプリート機能に plus code を統合しました。なお、iOS 向け Places SDK にもまもなく対応する予定です。これで、世界中の誰もが、世界中のどこでも、固有で正確なデジタル アドレスを使用できるようになります。エンドユーザーは正確な位置を事業者に伝えることが可能となり、重要な商品やサービスを受け取ることができるのです。サービス事業者は、既存の地域でより良いサービスを提供し、以前は対応できなかった新しい地域での事業拡大も可能となるわけです。
plus code とは?
plus code は場所に紐づけられた単純な英数字コードで(例:CWC8 + R9 マウンテンビュー )、緯度と経度の座標から導き出されています。Google マップでピンを置くと、誰でも世界中のあらゆる場所の plus code を見つけることができ、Google 検索や Google マップの検索でもできます。よく行く場所の plus code を調べたら、従来の住所と同じように使用できます。
プレイス オートコンプリートでの plus code
このたび、plus code をプレイス オートコンプリートに統合したことで、ユーザーが配車を依頼したり、ランチの配達をオーダーしたり、あるいは他の位置情報サービスを使用する際に、町や場所の plus code に存在する頭文字を入力すると、自動的に plus code 情報を補完して、候補一覧を返してくれる機能が追加されました。
ジオコーディング や Place Details での plus code
処理はここで終わりというわけではありません。自動補完された plus code をユーザーが選択すると、Place Details またはジオコーディングを使用して、plus code の Place ID を地理座標に変換します。もしくは、この Place ID を ルート案内(Directions API や Distance Matrix API)で使用することで、ドライバーをすばやく割当てたり、配送の予定を立てたるといったことも可能です。
上記のシナリオを実装するコード スニペットのサンプルを以下に示します。ユーザーが入力し、オートコンプリートで補完された plus code の地理座標を取得するために、プレイス オートコンプリートと Geocoding API リクエストを組み合わせてプログラムしています。なお、詳細については、GitHub でソースコードや、実装オプションをご覧いただけます。
/**
*こちらでご紹介する方法は、場所の予測補完を取得することを目的としたプログラムのサンプルです。
*このリクエストでのパラメータは、インドのコルカタ周辺にバイアスがかかるようにしています。
*
* @param query the plus code query string (e.g. "GCG2+3M K")
*/
private void getPlacePredictions(String query) {
// `locationBias` の値は、与えられた領域(現在はコルカタ)に予測結果をバイアスします。
// これらの値を変更することで、別の領域の結果が取得できます。
// FindAutocompletePredictionsRequest.Builder オブジェクトと同様に、適切な値を .setCountries() に渡してください。
LocationBias locationBias = RectangularBounds.newInstance(
new LatLng(22.458744, 88.208162),
new LatLng(22.730671, 88.524896));
// 次に Places SDK for Android でのプレイス オートコンプリートリクエストを作成します
FindAutocompletePredictionsRequest newRequest = FindAutocompletePredictionsRequest.builder()
.setLocationBias(locationBias)
.setQuery(query)
.setTypeFilter(TypeFilter.ESTABLISHMENT)
.setCountries("IN")
.build();
// 続いて、オートコンプリート予測リクエストを実行します
placesClient.findAutocompletePredictions(newRequest).addOnSuccessListener((response) -> {
List<AutocompletePrediction> predictions = response.getAutocompletePredictions();
if (predictions.isEmpty()) {
Log.w(TAG, "No predictions found");
return;
}
// 1文字目の予測一致から Geocoding API リクエストを実行しています
AutocompletePrediction firstPrediction = predictions.get(0);
geocodePlace(firstPrediction.getPlaceId());
}).addOnFailureListener((exception) -> {
if (exception instanceof ApiException) {
ApiException apiException = (ApiException) exception;
Log.e(TAG, "Place not found: " + apiException.getStatusCode());
}
});
}
// ネットワーク リクエスト用の Volley ディスパッチキュー。 Android Context オブジェクトで初期化されます
RequestQueue queue;
/**
* Geocode API リクエストを実行します
*
* @param placeID the ID of the Place to geocode
*/
private void geocodePlace(String placeID) {
// リクエスト URL を作成します
String apiKey = ""; // GMP API キー
String url = "https://maps.googleapis.com/maps/api/geocode/json?place_id=%s&key=%s";
String requestURL = String.format(url, placeID, apiKey);
// Geocoding API の HTTP リクエスト URL を使用して場所の地理座標を取得します
JsonObjectRequest request = new JsonObjectRequest(Method.GET, requestURL, null,
response -> {
try {
// "results" の値を調べて空でないことを確認します
JSONArray results = response.getJSONArray("results");
if (results.length() == 0) {
Log.w(TAG, "No results from geocoding request.");
return;
}
// Gson を使用してレスポンスの JSON オブジェクトを POJO に変換します
GeocodingResult result = new Gson()
.fromJson(results.getString(0), GeocodingResult.class);
LatLng latLng = result.geometry.location;
Log.d(TAG, "LatLng for geocoded place: " + latLng);
} catch (JSONException e) {
e.printStackTrace();
}
}, error -> Log.e(TAG, "Request failed"));
// リクエストを Request キューに追加します。
queue.add(request);
}
こうしてジオコーディング は address リクエスト パラメーターとして plus code を受け取り、完全に入力されたジオコーディング結果と同じ plus code を返します。たとえば、address=GCG2%2B3M%20Kolkata を含むジオコーディング リクエストは、 place_id: "GhIJm8QgsHKGNkARke18P7UZVkA" と共に、グローバルコードと複合コードの両方としてフォーマット済みの plus code を含む結果を返します。
プレイス オートコンプリート、Place Details、ルート案内(Directions API や Distance Matrix API)、ジオコーディングで plus code を使用すると、世界中のあらゆるところで、ユーザーの送迎や食事を目的地まで届けることができます。こうした事業をすでにしている地域では、ユーザーへのサービス提供を支え、 新たな地域でのビジネスを拡大できるよう事業者を後押しすることでしょう。
詳しくは、YouTube の動画 や、Places API 、Places SDK for Android 、Places SDK for iOS 、Places Library 、Maps JavaScript API のプレイス オートコンプリートに関するドキュメントをご覧ください。Geocoding API のドキュメントでは、API のリクエストやレスポンスの中で plus code をどのように使用するかを詳しく説明しています。
Google Maps Platform に関する詳しい情報はこちら をご覧ください。ご質問やフィードバックはページ右上の「お問い合わせ」より承っております。
Posted by 丸山 智康 (Tomoyasu Maruyama) - Google Maps テクニカル アカウントマネージャ