Google マップ Android GeoJSON ユーティリティ

  1. はじめに
  2. マップに GeoJsonLayer を追加する
  3. GeoJsonLayer を削除する
  4. GeoJsonFeature を追加および削除する
  5. GeoJsonFeatures とそのプロパティにアクセスする
  6. GeoJsonLayer と GeoJsonFeatures のスタイルを設定する
  7. デモアプリを見る

はじめに

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

Java

JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      

Kotlin

val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      

ローカル GeoJSON ファイルからインポートする場合は、以下のものが必要です。

  • レイヤをレンダリングする GoogleMap オブジェクト
  • GeoJSON データを含むローカル リソース ファイル
  • Context オブジェクト。これはローカル リソース ファイルを開くために必要です。

Java

GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
      

Kotlin

val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
      

GeoJsonLayer を作成したら、addLayerToMap() を呼び出して、インポートしたデータをマップに追加します。

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

GeoJsonLayer を削除する

次のレイヤを追加したと仮定します。

Java

JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);
      

Kotlin

val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)
      

GeoJsonLayer を消去するには、removeLayerFromMap() を呼び出します。

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

GeoJsonFeature を追加および削除する

GeoJSON の対象物のタイプは「feature」です。これには、ジオメトリ、プロパティ メンバーと、任意で境界ボックスまたは ID が含まれています。

GeoJsonFeature オブジェクトを個別に作成して、 GeoJsonLayer に追加できます。

対象物を作成し、それに位置 0, 0 の点が 1 つ含まれ、プロパティにはエントリが 1 つあり、境界ボックスはないものと仮定します。

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);
      

Kotlin

val point = GeoJsonPoint(LatLng(0.0, 0.0))
val properties = hashMapOf("Ocean" to "South Atlantic")
val pointFeature = GeoJsonFeature(point, "Origin", properties, null)
      

この対象物をレイヤに追加するには、addFeature() を呼び出し、追加する対象物を渡します。

Java

layer.addFeature(pointFeature);
      

Kotlin

layer.addFeature(pointFeature)
      

レイヤに追加した後で対象物を削除するには、removeFeature() を呼び出し、削除する対象物を渡します。

Java

layer.removeFeature(pointFeature);
      

Kotlin

layer.removeFeature(pointFeature)
      

GeoJsonFeatures とそのプロパティにアクセスする

レイヤに追加されたすべての GeoJsonFeature にアクセスするには、作成した GeoJsonLayer getFeatures() を呼び出します。これにより、以下に示すように for-each ループでアクセスできる GeoJsonFeatures の iterable が返されます。

Java

for (GeoJsonFeature feature : layer.getFeatures()) {
    // Do something to the feature
}
      

Kotlin

for (feature in layer.features) {
    // Do something to the feature
}
      

hasProperty()getProperty() の各メソッドを getFeatures() メソッドと併用して、保存されている各対象物に特定のプロパティがあるかどうかをチェックし、ある場合はそのプロパティにアクセスします。

Java

if (feature.hasProperty("Ocean")) {
    String oceanProperty = feature.getProperty("Ocean");
}
      

Kotlin

if (feature.hasProperty("Ocean")) {
    val oceanProperty = feature.getProperty("Ocean")
}
      

GeoJSON ジオメトリ クリック イベント

GeoJsonLayer.OnFeatureClickListener() を使って、マップ上のジオメトリ対象物に対するクリック イベントをリッスンできます。次の例は、ユーザーによって対象物がクリックされた際にその対象物のタイトルをログに記録しています。

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"));
    }
});
      

Kotlin

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i("GeoJsonClick", "Feature clicked: ${feature.getProperty("title")}")
}
      

GeoJsonLayer と GeoJsonFeatures のスタイルを設定する

GeoJsonLayer のデフォルト スタイルを設定するか、レイヤ内の対象物に個別にスタイルを設定できます。

デフォルト スタイル

GeoJsonLayer では、レイヤに追加されるすべての点、線分、ポリゴンのデフォルト スタイルを設定できます。デフォルト スタイルは、対象物のいずれのジオメトリにもスタイルが設定されていない場合にのみ、適用されます。デフォルト スタイルに加えた変更は、デフォルト スタイルを使用しているすべての対象物にも反映されます。

デフォルト スタイルを適用するステップは、以下のとおりです。

  1. 関連するデフォルト スタイル オブジェクトを取得します。これは GeoJsonPointStyleGeoJsonLineStringStyle、または GeoJsonPolygonStyle のいずれかです。
  2. 必要なオプションをスタイルに適用します。

たとえば、以下のコードサンプルは、デフォルトの点のスタイルを変更して、点をドラッグ可能にし、タイトルとスニペットを設定する方法を示しています。

Java

GeoJsonPointStyle pointStyle = layer.getDefaultPointStyle();
pointStyle.setDraggable(true);
pointStyle.setTitle("Hello, World!");
pointStyle.setSnippet("I am a draggable marker");
      

Kotlin

val pointStyle = layer.defaultPointStyle
pointStyle.isDraggable = true
pointStyle.title = "Hello, World!"
pointStyle.snippet = "I am a draggable marker"
      

GeoJsonFeature に固有のスタイル

レイヤ内の対象物ごとにスタイルを設定することもできます。GeoJsonFeature でスタイルを適用する手順は、以下のとおりです。

  1. 関連するスタイル オブジェクトを作成します。これは GeoJsonPointStyleGeoJsonLineStringStyle、または GeoJsonPolygonStyle のいずれかです。
  2. 必要なオプションをスタイルに適用します。
  3. スタイル オブジェクトを GeoJsonFeature の関連するメソッド(setPointStyle()setLineStringStyle()setPolygonStyle() のいずれか)に渡します。

次の例では、GeoJsonFeature の線分のスタイルをカスタマイズして、色が赤になるようにする方法を示しています。

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);
      

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
      

デモアプリを見る

URL から GeoJSON ファイルをインポートし、それを使用してレイヤを作成する例については、ユーティリティ ライブラリに付属のデモアプリにある GeoJsonDemoActivity をご覧ください。また、設定ガイドでは、デモアプリを実行する方法を説明しています。