このコードラボは、最新の CameraX ベータ版で動作します。こちらの CameraX ベータ版動画には、 API が変更されたためコードラボが動作しなくなっているというコメントがいくつか寄せられていました。今回の改定で、ベータ版へのアップデートに加えて、コードの説明がさらに追加されました。さらに、Android R エミュレータの最新リリースでは、分析と撮影の同時実行がサポートされています。
Empower Health は、患者が自分に必要な医療を見つけ、医療従事者が患者に高品質のサービスを提供できるようにする技術プラットフォームを開発しています。iamsick.ca というプラットフォームでは、すべてのカナダ人が、新規患者を受け入れてくれるかかりつけ医、かけこみ受診可能な診療所、ウェルネス クリニック、薬局、病院を、いつでも簡単に見つけることができます。新型コロナウイルス感染症の疑いがある人が受信できる医療機関を探せるよう、今回、このプラットフォームに、新型コロナウイルス診断施設の情報が追加されました。地図上で診断施設には特別なマーカーがつけられているので、最寄りの施設をすばやく容易に見つけることができます。
Empower Health はさらに、新型コロナウイルスの国家レベルの情報ハブとして c19.ca というウェブサイトを立ち上げるとともに、カナダのライアーソン大学の国立老化研究所と共同で、世界初の Long-Term Care COVID-19 Tracker(介護施設における新型コロナウイルス (COVID-19) 感染状況の追跡ツール)も立ち上げました。Long-Term Care COVID-19 Tracker は、介護施設や老人ホーム内での感染者数や死亡者数を日々更新しています。特に、カナダにおける新型コロナウイルス感染の中心地となっているオンタリオ州に焦点を合わせており、こうした施設の入居者やケアの担い手を守るための最前線の取り組み強化に役立っています。
新型コロナウイルス関連のウェブサイトやアプリの開発や運用に従事する非営利のデベロッパーや組織の方は、こちらのクレジット申請フォームより Google Maps Platform のクレジットを申請することができます。また、アプリ開発に役立つ Google Maps Platform のコア機能を、デベロッパーの皆さまにより良く理解していただけるよう、新型コロナウイルスリソースハブに、お役立ち情報をまとめました。今後は、在宅が求められる中で、地域社会の活性化に貢献するお客様に焦点を当てたいと思います。
Google Maps Platform に関する詳しい情報はこちらをご覧ください。ご質問やフィードバックはページ右上の「お問い合わせ」より承っております。
穂先形状の判定は、高い専門性と人間の感覚が重要である作業であるため、機械による作業の完全置き換えはまだ難しい状態です。今回の場合のように、人間の作業は非常に精度が高く、人間作業を前提に構築された現状のオペレーションでも効率が低いわけではないことが多いです。そのため、機能検証では機械学習の単純な検知精度だけではなく、既存のオペレーションと AI システムの可能性をきちんと理解して、どこにどのように AI を適応するのがベストかを見極めることが大切です。今回はまず「穂先形状の検品作業」という一部の作業で AI モデルの可能性を確かめることができました。今後はモデル精度・スループットの改善と共に、既存オペレーションへのこのツールの現実的な導入方法についても考えていくつもりです。
<参考> 株式会社ブレインパッドは、2004 年の創業以来、AI、ビッグデータなどの言葉が広まる前から、データ活用のリーディングカンパニーとして、アナリティクスとエンジニアリングを駆使し、企業のビジネス創造と経営改善をご支援しています。支援実績は、金融・小売・メーカー・サービスなど幅広い業種を対象に 1,000 社を超え、データ活用のコンセプトデザインから運用による成果創出までをトータルに支援することで、データを価値に変えるお手伝いをしています。一般社団法人データサイエンティスト協会代表理事、一般社団法人日本ディープラーニング協会理事も担っており、近年はビジネス課題を解決するために機械学習・深層学習を用いる AI 活用事例を多数生み出しています。
const request = {
placeId: 'ChIJ9xzt5AYVkFQRTSTBq6a4nWc',
fields: ['name', 'business_status']
};
const service = new google.maps.places.PlacesService(map);
service.getDetails(request, callback);
レスポンスの処理 :
function callback(place, status) {
if (status !== google.maps.places.PlacesServiceStatus.OK) return;
if (place.business_status) {
console.log(`${place.name} is currently ${place.business_status}.`);
}
}
permanently_closed 機能から business_status に置き換える
Place Search と Place Details は、これまでも permanently_closed というフィールドをサポートしていますが、事業の拠点が完全に閉鎖しているのか臨時休業しているのかの区別はしておりません。したがって、閉鎖か臨時休業かを区別する必要がある場合、代わりに business_status を使用してアプリケーションを構築することをデベロッパーの皆さんには強くお勧めします。ただ、既存のアプリケーションの場合、permanently_closed を使用してその拠点が何らかの理由で閉鎖しているかどうかを判断している場合もあります。その場合、Places API はこれまで通り permanently_closed を返し続けますので、引き続きご利用頂けます。
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 を使用すると、世界中のあらゆるところで、ユーザーの送迎や食事を目的地まで届けることができます。こうした事業をすでにしている地域では、ユーザーへのサービス提供を支え、 新たな地域でのビジネスを拡大できるよう事業者を後押しすることでしょう。
編集者注 : この記事では、変化する消費者やビジネスのニーズに応える企業や開発者をサポートするために、アプリやウェブサイトへの新しい機能追加の成功事例を紹介します。
世界中で多くの飲食店や店舗が通常営業できない中、デリバリー機能をサービスにすばやく追加するにはどうすれば良いかとという質問をよくいただきます。「オンラインで購入して店舗で受け取る」で取り上げた API や SDK の多くは、商品の受け取りだけでなくデリバリー機能を実現する際にも使用できます。その方法を見てみましょう。
誤配送を最小限に抑える
正しい場所に商品が届くことが重要なので、正確な住所情報は、誤配送による商品の返送を減らすのに不可欠です。Autocomplete API は、「先行入力」の住所予測補完サービスを提供します。これを支払い手続きに統合すれば、住所入力が迅速になるので、支払い手続きの煩わしさが減るとともに、誤配送を減らすことができます。
Autocomplete API から住所を取得したら、Geocoding API を使ってユーザーの配送先住所の正確な緯度/経度の位置を特定することもできます(Autocomplete の Place_ID を使用)。これは、配送先や納入場所を動かせるピンで地図上に表示して確認できるようにします。これにより、確認用の地図がすぐに表示されるので、ユーザーはピンの場所を変えて配送先の位置を微調整できます。再び Geocoding API を使えば、マップ上のピンの場所を人が読むことのできる住所表記に戻すことも可能です。
また、正確なあるいは公的な住所が存在しない場所には、Place Autocomplete API と Geocoding API の plus code を使用することで、正確な配送先をドライバーを取得できるようになります。
ユーザーからの注文に応じるため、対応できる各倉庫や配送センターからの移動時間を Distance Matrix API を使って比較し、最短となる組み合わせを探すことで迅速な配送が行えます。traffic_model パラメータを使うと、商品を配送センターから出荷して到着するまでにかかる時間を予測することも可能です。
また、Distance Matrix API はライブ交通情報を使用するため、リアルタイムの移動時間に基づいて、商品の引き受けと配送をするのに最も近い場所にいるドライバーを選ぶことができます。これにより、納品までの時間を可能な限り短縮して、全体的なオペレーションをより効率化します。運転時間が短くなることで、ドライバーの 1 日あたりの配送数も増やせます。
正確なドライバーのルートデータが必要な場合、Roads API を使うことで、道路形状に沿わせた補正が可能です。デバイスから得られる生の GPS データから、前後関係を考慮に入れて Google の道路ネットワークの最も近い位置にスナップ補正する機能です。Roads API で補正された位置情報は、Directions API や Distance Matrix API の起点としても使用できます。この方法でドライバーの位置を修正すると、道順と配送予定時刻がより正確になるので、全体的にも効率が改善されて、配送能力が向上します。
ドライバーのルートを最適化する
配送するドライバーが決まったら、すぐに配送先へ向かってもらいましょう。配送するドライバーに Directions API を使ってリアルタイムの交通情報に基づくルート案内をしたり、traffic_model パラメータで時間帯指定に対応した配送先の組み替え考慮した所要時間を予測することが可能です。このサービスは、複数の配送先をどの順序でまわるかを最適化するため、配送の全行程を最短で完了します。ここで Tips を紹介しましょう。プレイス オートコンプリート または Geocoding API のレスポンスとして得られる Place ID(住所情報ではない地点固有のID)を使って目的地を設定することです。これにより、ドライバーの行先をより最適なアクセス ポイント(荷下ろしをしやすい停車場所や玄関など)に送り出せるので、ほとんどの場合、より効率的な配送が可能になり、全体としてオペレーションの効率が良くなります。
Android または iOS の SDK で構築したネイティブアプリでストリートビューを使用し、配送先の画像を表示すれば、ドライバーは停車場所や玄関先の様子を現地に到着する前に正確に把握することができるため、荷物の受け渡しにかかる時間を節約できます。ネイティブの Google マップアプリを起動して、リアルタイムの音声ナビゲーションを利用することもお忘れなく。
リアルタイムで最新の配送予定時刻を顧客に伝える
最後に、顧客向けのアプリでは、常に最新の配送状況がわかるようにしましょう。Directions API を使用することで、ドライバーの次の顧客への配送予定時刻までの残り時間を確認することができます。また、Distance Matrix API を使用すれば、一度に多くの配送予定時刻を確認できます。ライブ交通情報を使用して、刻々と変わる道路状況について顧客に最新情報を提供しましょう。Maps JavaScript API を使ってウェブ上に簡単な配送トラッカーを構築すれば、顧客は配送をリアルタイムで追跡できるようになるので、配送のステータスを確認するために事業所に何度も電話をかけることもなくなるでしょう。
Developer Community Manager supporting Google via Robert Walters since Feb. 2019. その前はパリで約 8 年間、デジタル コンサルティングをしたり、撮影をしたり、フランス人に書を教えたり、自由にフリーランスとして過ごす。好きなものはアートと旅行。一児の母。