AndroidでGoogleMapアプリ開発
第1回 表示
第2回 表示形式 衛星、地図、地形図
第3回 マーカーと直線
第4回 googleMapのエラー
第5回 PlaceAPIとマーカーのセット
第6回 現在地 GPSの実装
第7回 トラッキング
第8回 様々な技法
その他、いくつかの技法について紹介します。
表示中のマップのLatLngBoundsを取得する
もっとも簡単な方法が以下の方法になります。
LatLngBounds mapLLB = mMap.getProjection().getVisibleRegion().latLngBounds)
この値を取得することで、例えばgooglePlaceAPIのPlacePickerに渡すLatLngBoundsを指定することができます。
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); builder.setLatLngBounds(mMap.getProjection().getVisibleRegion().latLngBounds);
となるわけです。
AutoCompleteFilterについて
AutocompleteFragmentによって簡単にマップ検索をすることができるようになるわけですが、その際に利用するfilterが結果に及ぼす影響についてまとめます。渋谷駅周辺のマップ表示範囲をlatlngboundsとして設定を行ったうえでフィルタリングし、ファミリーマートについて検索をしました。
TYPE_FILTER_*** | 検索結果 |
未設定 | |
ADDRESS | |
正確な住所でジオコーディングした結果のみを返す。とされているものです。latlngboundsの影響が無視されています。 | |
CITIES | |
TYLE_LOCALITY、TYPE_ADMINISTRATIVE_AREA_LEVEL_3でのの結果を返します。今回の場合において、結果は返されませんでした。例えば「渋」で検索すると、渋谷区、渋川市が表示されます。ただし、渋川市の地名渋川(渋川市渋川)は表示されません。LEVEL_3の設定によるものと思われます。 | |
ESTABLISHMENT | |
一見して最も期待通りの結果に近いのではないでしょうか。といっても、住所検索ができません。 | |
GEOCODE | |
ビジネス結果(ESTABLISHMENT)も表示されますが、住所が優先的に表示されます。latlngboundsが無視されていしまっているように見受けられ、実用性は乏しいように思えます。 |
|
NONE | |
未設定を明示的に記載。住所検索にも対応。 | |
REGIONS | |
LOCALITY,SUBLOCALITY,POSTAL,COUNTRY,LEVEL_1,LEVEL_2に該当する結果が返されます。TYPE_FILTER_CITIESがLEVEL_3であることことからそれよりも範囲は広がります。例えば、渋川で検索をするとLEVEL_3では渋川市のみでしたが、渋川市のほか、渋川とつく全国の地名が検索結果として表示されます。latlngBoundsの影響も反映されます。 |
何を使うべきか、考えてみますと、
表示 | 属性 |
店舗名等のみの表示 | ESTABLISHMENT |
住所のみの表示 | REGIONS |
いずれも表示 | NONE |
setCountryは使うべきかどうか
autocompleteFilterにはfilterの他に国を指定することができます。"JP"とすれば日本語になります。その他の国のコードについてはdeveloperサイトで。
また、
.setCountry(Locale.getDefault().getCountry())
とすれば、端末に合わせてその国の地図のみが表示されるようになります。ただし、例えば英語端末を使っているアメリカ人が日本で使用した場合には日本の結果は表示されず、アメリカ本土の結果のみが表示されてしまいます。正確な値を取得するにはGPSから国を取得する必要があります。つまり、geocoodingAPIを使ってJSON解析することになります。
まだまだAutocomplete、PlacePickerいずれもカスタマイズできる項目は少なく、より完成度を高める、又は細かい検索ができるようにするためにはPlaceAPIのJSON解析を利用する必要があります。