Google Maps-Dienstprogramm für den KML-Import

  1. Einführung
  2. KML-Ebenen hinzufügen
  3. KML-Ebenen entfernen
  4. KML-Container aufrufen
  5. KML-Ortsmarkierungen und KML-Boden-Overlays aufrufen
  6. KML-Eigenschaften aufrufen
  7. Durch KML unterstützte Funktionen

Einführung

KML ist eine Erweiterung des XML-Datenformats und stellt geografische Daten auf einer Karte dar. Mit diesem Dienstprogramm kannst du KML-Objekte in geografische Formen umwandeln und als Ebene rendern, die über die Karte gelegt wird. Rufe addLayerToMap() bzw. removeLayerFromMap() auf, um deine KML-Daten der Karte hinzuzufügen oder daraus zu entfernen. Für den Zugriff auf Eigenschaften in einem KML-Objekt rufe getProperties() für eine Ortsmarkierung, ein Boden-Overlay, Dokument oder einen Ordner auf.

KML-Ebenen der Karte hinzufügen

Erstelle zuerst eine Instanz der Klasse KmlLayer, um der Karte eine Datenebene hinzuzufügen. Es gibt zwei Möglichkeiten, eine KmlLayer zu instanziieren.

Um einen KML-Datensatz aus einer lokalen Ressource zu importieren und zu rendern, benötigst du Folgendes:

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

Java

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

Kotlin

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

Um einen KML-Datensatz aus einem lokalen Stream zu importieren und zu rendern, benötigst du Folgendes:

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

Java

InputStream inputStream = // InputStream containing KML data
KmlLayer layer = new KmlLayer(map, inputStream, context);
      

Kotlin

val inputStream: InputStream? =  // InputStream containing KML data
val layer = KmlLayer(map, inputStream, context)
      

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

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

KML-Ebenen entfernen

Angenommen, du hast diese KmlLayer erstellt:

Java

InputStream inputStream = // InputStream containing KML data
KmlLayer layer = new KmlLayer(map, inputStream, context);
      

Kotlin

val inputStream: InputStream? =  // InputStream containing KML data
val layer = KmlLayer(map, inputStream, context)
      

Um die Ebene aus der Karte zu entfernen, rufe removeLayerFromMap() auf:

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

KML-Container aufrufen

Um auf alle Container zuzugreifen, die deiner Ebene hinzugefügt wurden, kannst du getContainers() für die von dir erstellte Ebene aufrufen. Mit hasContainers() kannst du prüfen, ob ein Container verschachtelte Container enthält. Um diese geschachtelten Container aufzurufen, rufst du, ähnlich wie beim Bearbeiten der Ebenen, getContainers() auf.

Auf Container zugreifen, die nicht in einem KmlLayer oder KmlContainer: verschachtelt sind:

Java

for (KmlContainer containers : layer.getContainers()) {
    // Do something to container
}
      

Kotlin

for (containers in layer.containers) {
    // Do something to container
}
      

So greifst du auf Container zu, die in einem KmlLayer oder KmlContainer verschachtelt sind:

Java

public void accessContainers(Iterable<KmlContainer> containers) {
    for (KmlContainer container : containers) {
        if (container.hasContainers()) {
            accessContainers(container.getContainers());
        }
    }
}
      

Kotlin

fun accessContainers(containers: Iterable<KmlContainer>) {
    for (container in containers) {
        if (container.hasContainers()) {
            accessContainers(container.containers)
        }
    }
      

KML-Ortsmarkierungen und KML-Boden-Overlays aufrufen

Um auf Ortsmarkierungen oder Boden-Overlays zuzugreifen, die der Ebene hinzugefügt wurden, kannst du getPlacemarks() oder getGroundOverlays() in einer Ebene oder einem Container aufrufen. Beim Aufrufen von beiden wird ein iterierbarer Wert von KmlPlacemarks bzw. KmlGroundOverlays zurückgegeben.

So greifst du beispielsweise auf KmlPlacemark-Objekte aus einer Ebene zu:

Java

for (KmlPlacemark placemark : layer.getPlacemarks()) {
    // Do something to Placemark
}
      

Kotlin

for (placemark in layer.placemarks) {
    // Do something to Placemark
}
      

KML-Eigenschaften aufrufen

Um auf eine Eigenschaft in einem Container oder Ortsmarkierung zuzugreifen, rufe getProperty() auf und übergebe ihm einen Eigenschaftenschlüssel. Du kannst auch hasProperty() aufrufen, um zu überprüfen, ob sie existiert. Im nachfolgenden Beispiel wird gezeigt, wie du den Eigenschaftswert „name“ aus einem Container abrufst, sofern die Eigenschaft vorhanden ist.

Java

for (KmlContainer container : layer.getContainers()) {
    if (container.hasProperty("name")) {
        Log.i("KML", container.getProperty("name"));
    }
}
      

Kotlin

for (container in layer.containers) {
    if (container.hasProperty("name")) {
        Log.i("KML", container.getProperty("name"))
    }
}
      

Klickereignisse für KML-Geometrie

Du kannst KmlLayer.OnFeatureClickListener() verwenden, um Klickereignisse auf die Geometrieelemente auf der Karte zu überwachen. Im folgenden Beispiel wird die ID einer Funktion protokolliert, wenn der Nutzer darauf klickt:

Java

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener(new KmlLayer.OnFeatureClickListener() {
    @Override
    public void onFeatureClick(Feature feature) {
        Log.i("KML", "Feature clicked: " + feature.getId());
    }
});
      

Kotlin

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i(
        "KML",
        "Feature clicked: " + feature.id
    )
}
      

Demo-App anzeigen

Ein Beispiel zum Importieren einer KML-Datei und zum Erstellen einer Ebene mithilfe dieser Datei findest du in KmlDemoActivity in der Demo-App, die mit der Dienstprogrammbibliothek ausgeliefert wird. Im Einrichtungsleitfaden erhältst du Informationen zum Ausführen der Demo-App.

Durch KML unterstützte Funktionen

KML-Element Unterstützt? Kommentar
<Adresse> Teilweise Hinterlegt als Eigenschaftswert
<AddressDetails> Nein
<Alias> Nein
<Altitude> Nein
<altitudeMode> Nein
<atom:author> Nein
<atom:link> Nein
<atom:name> Nein
<BalloonStyle> Teilweise Nur <text> wird unterstützt.
<begin> <TimeSpan> wird nicht unterstützt.
<bgColor> Nein
<bottomFov> <PhotoOverlay> wird nicht unterstützt.
<Camera> Nein
<Change> Teilweise Nur Formatänderungen werden unterstützt.
<color> Teilweise Umfasst #AABBGGRR und #BBGGRR; nicht unterstützt in <ScreenOverlay> und <GroundOverlay>
<colorMode> Ja
<cookie> Nein <NetworkLinkControl> wird nicht unterstützt.
<coordinates> Ja
<Create> Nein
<Data> Nein
<Delete> Nein
<description> Ja Nur Text, HTML-Inhalt wird nicht unterstützt.
<displayMode> Nein
<displayName> Nein
<Document> Ja
<drawOrder> Ja
<east> Ja
<end> <TimeSpan> wird nicht unterstützt.
<expires> Nein <NetworkLinkControl> wird nicht unterstützt.
<ExtendedData> Teilweise <Data> nur nicht typisiert, nicht <SimpleData> oder <Schema>, und Entitätsersetzungen von form$[dataName] werden nicht unterstützt.
<extrude> Nein
<fill> Ja
<flyToView> Nein <NetworkLinkControl> wird nicht unterstützt.
<Folder> Ja
<gridOrigin> <PhotoOverlay> wird nicht unterstützt.
<GroundOverlay> Ja
<heading> Ja
<hotSpot> Ja
<href> Ja
<httpQuery> Nein
<Icon> Ja
<IconStyle> Ja
<ImagePyramid> <PhotoOverlay> wird nicht unterstützt.
<innerBoundaryIs> Ja Implizit aus <LinearRing>-Reihenfolge
<ItemIcon> <ListStyle> wird nicht unterstützt.
<key> Ja
<kml> Ja
<LabelStyle> Nein
<latitude> Ja
<LatLonAltBox> Nein
<LatLonBox> Ja
<leftFov> <PhotoOverlay> wird nicht unterstützt.
<LinearRing> Ja
<LineString> Ja
<LineStyle> Ja
<Link> Nein
<linkDescription> <NetworkLinkControl> wird nicht unterstützt.
<linkName> <NetworkLinkControl> wird nicht unterstützt.
<linkSnippet> <NetworkLinkControl> wird nicht unterstützt.
<listItemType> <ListStyle> wird nicht unterstützt.
<ListStyle> Nein
<Location> <Model> wird nicht unterstützt.
<Lod> Ja
<longitude> Ja
<LookAt> Nein
<maxAltitude> Nein
<maxFadeExtent> Nein
<maxHeight> <PhotoOverlay> wird nicht unterstützt.
<maxLodPixels> Nein
<maxSessionLength> Nein
<maxWidth> <PhotoOverlay> wird nicht unterstützt.
<message> Nein
<minAltitude> Nein
<minFadeExtent> Nein
<minLodPixels> Nein
<minRefreshPeriod> Nein <NetworkLink>
<Model> Nein
<MultiGeometry> Ja
<name> Ja
<near> <PhotoOverlay> wird nicht unterstützt.
<NetworkLink> Nein
<NetworkLinkControl> Nein
<north> Ja
<open> Ja Hinterlegt als Eigenschaftswert
<Orientation> <Model> wird nicht unterstützt.
<outerBoundaryIs> Ja Implizit aus <LinearRing>-Reihenfolge
<outline> Ja
<overlayXY> Nein
<Pair> Ja
<phoneNumber> Teilweise Hinterlegt als Eigenschaftswert
<PhotoOverlay> Nein
<Placemark> Ja
<Point> Ja
<Polygon> Ja
<PolyStyle> Ja
<range> Ja
<refreshInterval> Nein
<refreshMode> Nein
<refreshVisibility> Nein
<Region> Ja
<ResourceMap> <Model> wird nicht unterstützt.
<rightFov> <PhotoOverlay> wird nicht unterstützt.
<roll> <Camera> und <Model> werden nicht unterstützt.
<rotation> Ja
<rotationXY> Nein
<Scale> <Model> wird nicht unterstützt.
<scale> Ja
<Schema> Nein
<SchemaData> Nein
<ScreenOverlay> Nein
<screenXY> <ScreenOverlay> wird nicht unterstützt.
<shape> <PhotoOverlay> wird nicht unterstützt.
<SimpleData> <SchemaData> wird nicht unterstützt.
<SimpleField> <Schema> wird nicht unterstützt.
<size> Ja
<Snippet> Nein
<south> Ja
<state> <ListStyle> wird nicht unterstützt.
<Style> Ja
<StyleMap> Teilweise Hervorgehobene Formate sind nicht verfügbar. Inline-StyleMaps werden nicht unterstützt.
<styleUrl> Ja
<targetHref> Nein <Alias> wird nicht unterstützt.
<tessellate> Nein
<text> Ja
<textColor> Nein
<tileSize> <PhotoOverlay> wird nicht unterstützt.
<tilt> Nein
<TimeSpan> Nein
<TimeStamp> Nein
<topFov> <PhotoOverlay> wird nicht unterstützt.
<Update> <NetworkLinkControl< wird nicht unterstützt.
<value> Ja
<viewBoundScale> Nein
<viewFormat> Nein
<viewRefreshMode> Nein
<viewRefreshTime> Nein
<ViewVolume> <PhotoOverlay> wird nicht unterstützt.
<visibility> Ja
<west> Ja
<when> <TimeStamp> wird nicht unterstützt.
<width> Ja