- はじめに
 - マップに GeoJsonLayer を追加する
 - GeoJsonLayer を削除する
 - GeoJsonFeature を追加および削除する
 - GeoJsonFeatures とそのプロパティにアクセスする
 - GeoJsonLayer と GeoJsonFeatures のスタイルを設定する
 - デモアプリを見る
 
はじめに
GeoJSON は JSON データ形式の拡張で、地理的データを表します。このユーティリティを使うと、GeoJSON 形式で地理的な対象物を保存し、それらをマップ上にレイヤとしてレンダリングすることができます。マップに GeoJSON データを追加したり、マップからこのデータを削除したりするには、それぞれ addLayerToMap() と removeLayerFromMap() を呼び出します。同様に、addFeature() と removeFeature() を呼び出して GeoJsonFeature オブジェクトを渡すことで、個々の対象物を追加および削除できます。対象物にアクセスするには、getFeatures() を呼び出して、レイヤに追加されているすべての 
  GeoJsonFeature オブジェクトの iterable を取得します。
対象物をレイヤに追加する前に、getDefaultPointStyle()、getDefaultLineStringStyle()、または 
  getDefaultPolygonStyle() を呼び出し、それぞれにスタイル オプションを設定して、対象物に適用するデフォルトのスタイルを設定することもできます。
または、対象物で setPointStyle()、setLineStringStyle()、または setPolygonStyle() を呼び出し、該当するスタイル オブジェクトを渡すことで、個々の GeoJsonFeature にスタイルを設定することもできます。
マップに GeoJsonLayer を追加する
マップに GeoJson レイヤを追加するには、まず GeoJsonLayer クラスのインスタンスを作成します。GeoJsonLayer をインスタンス化するには、2 つの方法があります。
JSONObject からインポートするには、以下のものが必要です。
- レイヤをレンダリングする 
GoogleMapオブジェクト - レイヤに追加する GeoJSON データを含む 
JSONObject 
Kotlin
val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      
  Java
JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      
  ローカル GeoJSON ファイルからインポートする場合は、以下のものが必要です。
- レイヤをレンダリングする 
GoogleMapオブジェクト - GeoJSON データを含むローカル リソース ファイル
 Contextオブジェクト。これはローカル リソース ファイルを開くために必要です。
Kotlin
val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
      
  Java
GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
      
  GeoJsonLayer を作成したら、addLayerToMap() を呼び出して、インポートしたデータをマップに追加します。
Kotlin
layer.addLayerToMap()
      
  Java
layer.addLayerToMap();
      
  GeoJsonLayer を削除する
次のレイヤを追加したと仮定します。
Kotlin
val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      
  Java
JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      
  GeoJsonLayer を消去するには、removeLayerFromMap() を呼び出します。
Kotlin
layer.removeLayerFromMap()
      
  Java
layer.removeLayerFromMap();
      
  GeoJsonFeature を追加および削除する
GeoJSON の対象物のタイプは「feature」です。これには、ジオメトリ、プロパティ メンバーと、任意で境界ボックスまたは ID が含まれています。
GeoJsonFeature オブジェクトを個別に作成して、 GeoJsonLayer に追加できます。
対象物を作成し、それに位置 0, 0 の点が 1 つ含まれ、プロパティにはエントリが 1 つあり、境界ボックスはないものと仮定します。
Kotlin
val point = GeoJsonPoint(LatLng(0.0, 0.0))
val properties = hashMapOf("Ocean" to "South Atlantic")
val pointFeature = GeoJsonFeature(point, "Origin", properties, null)
      
  Java
GeoJsonPoint point = new GeoJsonPoint(new LatLng(0, 0));
HashMap<String, String> properties = new HashMap<>();
properties.put("Ocean", "South Atlantic");
GeoJsonFeature pointFeature = new GeoJsonFeature(point, "Origin", properties, null);
      
  この対象物をレイヤに追加するには、addFeature() を呼び出し、追加する対象物を渡します。
Kotlin
layer.addFeature(pointFeature)
      
  Java
layer.addFeature(pointFeature);
      
  レイヤに追加した後で対象物を削除するには、removeFeature() を呼び出し、削除する対象物を渡します。
Kotlin
layer.removeFeature(pointFeature)
      
  Java
layer.removeFeature(pointFeature);
      
  GeoJsonFeatures とそのプロパティにアクセスする
レイヤに追加されたすべての GeoJsonFeature にアクセスするには、作成した GeoJsonLayer で  getFeatures() を呼び出します。これにより、以下に示すように for-each ループでアクセスできる GeoJsonFeatures の iterable が返されます。
Kotlin
for (feature in layer.features) {
    // Do something to the feature
}
      
  Java
for (GeoJsonFeature feature : layer.getFeatures()) {
    // Do something to the feature
}
      
  hasProperty() と getProperty() の各メソッドを getFeatures() メソッドと併用して、保存されている各対象物に特定のプロパティがあるかどうかをチェックし、ある場合はそのプロパティにアクセスします。
Kotlin
if (feature.hasProperty("Ocean")) {
    val oceanProperty = feature.getProperty("Ocean")
}
      
  Java
if (feature.hasProperty("Ocean")) {
    String oceanProperty = feature.getProperty("Ocean");
}
      
  GeoJSON ジオメトリ クリック イベント
GeoJsonLayer.OnFeatureClickListener() を使って、マップ上のジオメトリ対象物に対するクリック イベントをリッスンできます。次の例では、ユーザーによって対象物がクリックされた際にその対象物のタイトルがログに記録されます。
Kotlin
// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i("GeoJsonClick", "Feature clicked: ${feature.getProperty("title")}")
}
      
  Java
// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener(new Layer.OnFeatureClickListener() {
    @Override
    public void onFeatureClick(Feature feature) {
        Log.i("GeoJsonClick", "Feature clicked: " + feature.getProperty("title"));
    }
});
      
  GeoJsonLayer と GeoJsonFeatures のスタイルを設定する
GeoJsonLayer のデフォルト スタイルを設定するか、レイヤ内の対象物に個別にスタイルを設定できます。
デフォルト スタイル
GeoJsonLayer では、レイヤに追加されるすべての点、線分、ポリゴンのデフォルト スタイルを設定できます。デフォルト スタイルは、対象物のいずれのジオメトリにもスタイルが設定されていない場合にのみ、適用されます。デフォルト スタイルに加えた変更は、デフォルト スタイルを使用しているすべての対象物にも反映されます。
デフォルト スタイルを適用するステップは、以下のとおりです。
- 関連するデフォルト スタイル オブジェクトを取得します。これは 
GeoJsonPointStyle、GeoJsonLineStringStyle、またはGeoJsonPolygonStyleのいずれかです。 - 必要なオプションをスタイルに適用します。
 
たとえば、以下のコードサンプルは、デフォルトの点のスタイルを変更して、点をドラッグ可能にし、タイトルとスニペットを設定する方法を示しています。
Kotlin
val pointStyle = layer.defaultPointStyle
pointStyle.isDraggable = true
pointStyle.title = "Hello, World!"
pointStyle.snippet = "I am a draggable marker"
      
  Java
GeoJsonPointStyle pointStyle = layer.getDefaultPointStyle();
pointStyle.setDraggable(true);
pointStyle.setTitle("Hello, World!");
pointStyle.setSnippet("I am a draggable marker");
      
  GeoJsonFeature に固有のスタイル
レイヤ内の対象物ごとにスタイルを設定することもできます。GeoJsonFeature でスタイルを適用する手順は、以下のとおりです。
- 関連するスタイル オブジェクトを作成します。これは 
GeoJsonPointStyle、GeoJsonLineStringStyle、またはGeoJsonPolygonStyleのいずれかです。 - 必要なオプションをスタイルに適用します。
 - スタイル オブジェクトを 
GeoJsonFeatureの関連するメソッド(setPointStyle()、setLineStringStyle()、setPolygonStyle()のいずれか)に渡します。 
次の例は、GeoJsonFeature の線分のスタイルをカスタマイズして、色を赤にする方法を示しています。
Kotlin
// Create a new feature containing a linestring
val lineStringArray: MutableList<LatLng> = ArrayList()
lineStringArray.add(LatLng(0.0, 0.0))
lineStringArray.add(LatLng(50.0, 50.0))
val lineString = GeoJsonLineString(lineStringArray)
val lineStringFeature = GeoJsonFeature(lineString, null, null, null)
// Set the color of the linestring to red
val lineStringStyle = GeoJsonLineStringStyle()
lineStringStyle.color = Color.RED
// Set the style of the feature
lineStringFeature.lineStringStyle = lineStringStyle
      
  Java
// Create a new feature containing a linestring
List<LatLng> lineStringArray = new ArrayList<LatLng>();
lineStringArray.add(new LatLng(0, 0));
lineStringArray.add(new LatLng(50, 50));
GeoJsonLineString lineString = new GeoJsonLineString(lineStringArray);
GeoJsonFeature lineStringFeature = new GeoJsonFeature(lineString, null, null, null);
// Set the color of the linestring to red
GeoJsonLineStringStyle lineStringStyle = new GeoJsonLineStringStyle();
lineStringStyle.setColor(Color.RED);
// Set the style of the feature
lineStringFeature.setLineStringStyle(lineStringStyle);
      
  デモアプリを見る
URL から GeoJSON ファイルをインポートし、それを使用してレイヤを作成する例については、ユーティリティ ライブラリに付属のデモアプリにある GeoJsonDemoActivity をご覧ください。また、設定ガイドでは、デモアプリを実行する方法を説明しています。