Google Maps Android GeoJSON-Dienstprogramm

  1. Einführung
  2. GeoJsonLayer zu einer Karte hinzufügen
  3. GeoJsonLayer entfernen
  4. GeoJsonFeature hinzufügen und entfernen
  5. GeoJsonFeatures und ihre Attribute aufrufen
  6. GeoJsonLayer und GeoJsonFeatures formatieren
  7. Demo-App ansehen

Einführung

GeoJSON ist eine Erweiterung des JSON-Datenformats und stellt geografische Daten dar. Mit diesem Dienstprogramm kannst du geografische Merkmale im GeoJSON-Format speichern und als Ebene, die über eine Karte gelegt wird, darstellen. Rufe addLayerToMap() bzw. removeLayerFromMap() auf, um deine GeoJSON-Daten der Karte hinzuzufügen oder daraus zu entfernen. Entsprechend kannst du einzelne Merkmale durch Aufrufen von addFeature() und removeFeature() hinzufügen und entfernen und ein GeoJsonFeature-Objekt übergeben. Wenn du auf die Merkmale zugreifen möchtest, kannst du mit getFeatures() die Iteration aller GeoJsonFeature-Objekte aufrufen, die der Ebene hinzugefügt wurden.

Du kannst auch Standardformate definieren, die vor dem Hinzufügen zur Ebene auf die Merkmale angewendet werden. Dazu rufst du getDefaultPointStyle(), getDefaultLineStringStyle() oder getDefaultPolygonStyle() auf und legst für beide Formatoptionen fest. Alternativ kannst du das Format für eine einzelne GeoJsonFeature festlegen, indem du setPointStyle(), setLineStringStyle() oder setPolygonStyle() für das Merkmal aufrufst und das entsprechende Formatobjekt übergibst.

GeoJsonLayer zu deiner Karte hinzufügen

Um deiner Karte eine GeoJson-Ebene hinzuzufügen, erstellst du zuerst eine Instanz der Klasse „GeoJsonLayer“. Es gibt zwei Möglichkeiten, um die Klasse „GeoJsonLayer“ zu instanziieren.

Für den Import aus einem JSONObject ist Folgendes erforderlich:

  • Ein GoogleMap-Objekt, in dem die Ebene gerendert werden soll
  • JSONObject mit den GeoJSON-Daten, die der Ebene hinzugefügt werden sollen

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)
      

Für einen Import aus einer GeoJSON-Datei benötigst du Folgendes:

  • Ein GoogleMap-Objekt, in dem die Ebene gerendert werden soll
  • Eine lokale Ressourcendatei mit den GeoJSON-Daten
  • Ein Context-Objekt, das zum Öffnen von lokalen Ressourcen erforderlich ist

Java

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

Kotlin

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

Nachdem du eine GeoJsonLayer erstellt hast, rufe addLayerToMap() auf, um die importierten Daten in die Karte aufzunehmen:

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

GeoJsonLayer entfernen

Angenommen, du hast diese Ebene hinzugefügt:

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)
      

Rufe zum Löschen von GeoJsonLayer removeLayerFromMap() auf.

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

GeoJsonFeature hinzufügen und entfernen

Merkmalen in GeoJSON ist der Typ „feature“ zugeordnet. Ein Merkmal enthält eine Geometrie, ein Eigenschaftsmitglied und hat optional einen Begrenzungsrahmen oder eine ID.

Du kannst GeoJsonFeature-Objekte einzeln erstellen und zu GeoJsonLayer hinzufügen.

Angenommen, du hast ein Merkmal erstellt, das einen Punkt an 0,0 mit einem Eintrag in den Eigenschaften und ohne Begrenzungsrahmen enthält.

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)
      

Rufe addFeature() auf, um das Merkmal zu übergeben und der Ebene hinzuzufügen.

Java

layer.addFeature(pointFeature);
      

Kotlin

layer.addFeature(pointFeature)
      

Um ein Merkmal nach dem Hinzufügen zur Ebene zu entfernen, rufe removeFeature() auf und übergib das zu entfernende Merkmal.

Java

layer.removeFeature(pointFeature);
      

Kotlin

layer.removeFeature(pointFeature)
      

GeoJsonFeatures und ihre Eigenschaften aufrufen

Um auf alle GeoJsonFeatures zuzugreifen, die der Ebene hinzugefügt wurden, kannst du getFeatures() für den von dir erstellten GeoJsonLayer aufrufen. Dadurch wird ein iterierbarer Wert für GeoJsonFeatures zurückgegeben, auf den du mithilfe einer For-Loop zugreifen kannst (siehe unten).

Java

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

Kotlin

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

Prüfe mit den Methoden hasProperty() und getProperty() in Verbindung mit der Methode getFeatures(), ob jedes gespeicherte Merkmal eine bestimmte Eigenschaft hat. Greife darauf zu, sofern vorhanden.

Java

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

Kotlin

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

GeoJSON-Geometrie-Klickereignisse

Du kannst GeoJsonLayer.OnFeatureClickListener() verwenden, um Klickereignisse auf die Geometrieelemente auf der Karte zu beobachten. Im folgenden Beispiel wird der Titel eines Merkmals protokolliert, wenn der Nutzer darauf klickt:

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 und GeoJsonFeatures formatieren

Du kannst Standardformate für eine GeoJsonLayer definieren oder einzelne Merkmale der Ebene formatieren.

Standardformate

In einer GeoJsonLayer kannst du Standardformate für beliebige Punkte, LineStrings und Polygone definieren, die der Ebene hinzugefügt wurden. Standardformate werden nur angewendet, wenn für ein Merkmal keine Formatvorlagensätze für eine ihrer Geometrien vorhanden sind. Jede Änderung, die du an der Standardformatierung vornimmst, wirkt sich auf alle Merkmale aus, für die diese Standardformatierung verwendet werden.

Nachfolgend sind die einzelnen Schritte aufgeführt, die zum Anwenden einer Standardformatierung erforderlich sind:

  1. Rufe das entsprechende Standardformatobjekt ab. Das kann entweder GeoJsonPointStyle, GeoJsonLineStringStyle oder GeoJsonPolygonStyle sein.
  2. Wende die gewünschten Optionen auf das Format an.

Im nachfolgenden Codebeispiel wird gezeigt, wie du das Standardpunktformat so änderst, dass die Punkte mit einem Titel und Ausschnitt gezogen werden können.

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"
      

Spezielle Formate für GeoJsonFeature

Alternativ kannst du einzelne Merkmale in der Ebene formatieren. So wendest du ein Format auf ein GeoJsonFeature an:

  1. Erstelle das relevante Formatobjekt. Das kann entweder GeoJsonPointStyle, GeoJsonLineStringStyle oder GeoJsonPolygonStyle sein.
  2. Wende die gewünschten Optionen auf das Format an.
  3. Übergib das Formatobjekt an die relevante Methode von GeoJsonFeature. Das ist entweder setPointStyle(), setLineStringStyle() oder setPolygonStyle().

So kannst du beispielsweise das LineString-Format für GeoJsonFeature anpassen, damit die Farbe Rot ist.

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
      

Demo-App ansehen

Ein Beispiel zum Importieren einer GeoJSON-Datei und Erstellen einer Ebene mithilfe dieser Datei findest du in der GeoJsonDemoActivity in der Demo-App, die im Lieferumfang der Dienstprogrammbibliothek enthalten ist. Im Einrichtungsleitfaden erhältst du Informationen zum Ausführen der Demo-App.