Google Maps-Dienstprogramm für den KML-Import

Plattform auswählen: Android iOS JavaScript
  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-Attribute 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 können Sie 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. Um auf Attribute in einem KML-Objekt zuzugreifen, rufen Sie getProperties() für eine Ortsmarkierung, ein Boden-Overlay, ein 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.

Wenn Sie einen KML-Datensatz aus einer lokalen Ressource importieren und rendern möchten, ist Folgendes erforderlich:

  • 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, ist Folgendes erforderlich:

  • 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 Sie eine KmlLayer erstellt haben, rufen Sie 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, rufen Sie removeLayerFromMap() auf:

Java


layer.removeLayerFromMap();

      

Kotlin


layer.removeLayerFromMap()

      

KML-Container aufrufen

Um auf alle Container zuzugreifen, die der Ebene hinzugefügt wurden, können Sie getContainers() für die erstellte Ebene aufrufen. Mit hasContainers() können Sie 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, können Sie getPlacemarks() oder getGroundOverlays() für eine Ebene oder einen Container aufrufen. Beim Aufrufen von beiden wird ein iterierbarer Wert von KmlPlacemarks bzw. KmlGroundOverlays zurückgegeben.

So greifen Sie beispielsweise über eine Ebene auf KmlPlacemark-Objekte 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 ein Attribut in einem Container oder eine Ortsmarkierung zuzugreifen, müssen Sie getProperty() aufrufen und einen Attributschlüssel übergeben. Sie können auch hasProperty() aufrufen, um zu prüfen, ob das Attribut vorhanden ist. 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

Mit KmlLayer.OnFeatureClickListener() lassen sich Klickereignisse für die Geometrieelemente der Karte erfassen. 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 Erstellen einer Ebene mithilfe dieser Datei findest du in der KmlDemoActivity in der Demo-App, die im Lieferumfang der Dienstprogrammbibliothek enthalten ist. 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