Utilità di importazione KML di Google Maps

Seleziona la piattaforma: Android iOS JavaScript
  1. Introduzione
  2. Aggiungere un livello KML
  3. Cancellare un livello KML
  4. Accedere ai contenitori KML
  5. Accedere a segnaposto KML e overlay al suolo KML
  6. Accedere alle proprietà KML
  7. Funzionalità supportate da KML

Introduzione

Il file KML è un'estensione del formato dei dati XML e rappresenta i dati geografici su una mappa. Grazie a questa utilità, puoi convertire gli oggetti KML in forme geografiche e eseguirne il rendering come un livello sopra una mappa. Per aggiungere e rimuovere i dati KML nella e dalla mappa, richiama addLayerToMap() e removeLayerFromMap() rispettivamente. Per accedere alle proprietà in un oggetto KML, richiama getProperties() in qualsiasi segnaposto, GroundOverlay, Documento o cartella.

Aggiungi un livello KML alla mappa

Per aggiungere un livello dati alla mappa, crea prima un'istanza della classe KmlLayer. Esistono due modi per creare un'istanza di KmlLayer.

Per importare ed eseguire il rendering di un set di dati KML da una risorsa locale, hai bisogno di:

  • Un oggetto GoogleMap in cui deve essere eseguito il rendering del livello.
  • Un file di risorse locali contenente i dati KML.
  • Un oggetto Context, necessario per aprire un file di risorse locale.

Kotlin



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

      

Java


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

      

Per importare ed eseguire il rendering di un set di dati KML da uno stream locale, sono necessari:

  • Un oggetto GoogleMap in cui deve essere eseguito il rendering del livello.
  • Un elemento InputStream contenente i dati KML.
  • Un oggetto Context, necessario per aprire le risorse locali.

Kotlin



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

      

Java


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

      

Dopo aver creato un KmlLayer, chiama addLayerToMap()() per aggiungere i dati importati alla mappa.

Kotlin



layer.addLayerToMap()

      

Java


layer.addLayerToMap();

      

Cancellare un livello KML

Supponiamo che tu abbia creato questo KmlLayer:

Kotlin



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

      

Java


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

      

Per rimuovere il livello dalla mappa, chiama removeLayerFromMap():

Kotlin



layer.removeLayerFromMap()

      

Java


layer.removeLayerFromMap();

      

Accedere ai contenitori KML

Per accedere a tutti i container che sono stati aggiunti al tuo livello, puoi chiamare getContainers() nel livello creato. Per verificare se un container ha container nidificati, puoi chiamare hasContainers(). Per accedere a questi container nidificati, in modo simile a ciò che puoi fare nel tuo livello, puoi chiamare getContainers()

Per accedere a contenitori che non sono nidificati in un file KmlLayer o KmlContainer:

Kotlin



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

      

Java


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

      

Per accedere ai contenitori che sono nidificati in un file KmlLayer o KmlContainer:

Kotlin



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

      

Java


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

      

Accesso a segnaposto KML e overlay al suolo KML

Per accedere a qualsiasi segnaposto o overlay al suolo aggiunto al livello, puoi chiamare getPlacemarks() o getGroundOverlays() in un livello o un contenitore. La chiamata restituirà rispettivamente KmlPlacemarks o KmlGroundOverlays.

Ad esempio, per accedere a un oggetto KmlPlacemark da un livello:

Kotlin



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

      

Java


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

      

Accedere alle proprietà KML

Per accedere a qualsiasi proprietà in un contenitore o in un segnaposto, chiama getProperty() e assegnale una chiave di proprietà. Puoi anche chiamare hasProperty() per verificare se esiste. Questo esempio mostra come recuperare il valore della proprietà "name" da un container, se esistente.

Kotlin



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

      

Java


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

      

Eventi di clic relativi alla geometria KML

Puoi utilizzare KmlLayer.OnFeatureClickListener() per rimanere in ascolto degli eventi di clic sugli elementi geometrici della mappa. L'esempio seguente registra l'ID di una funzionalità quando l'utente fa clic su di essa:

Kotlin



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

      

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

      

Guarda l'app demo

Per un esempio di importazione di un file KML e di creazione di un livello con quest'ultimo, dai un'occhiata a KmlDemoActivity nell'app demo fornita in dotazione con la libreria di utilità. La guida alla configurazione mostra come eseguire l'app demo.

Funzionalità supportate da KML

Elemento KML Supportato? Commento
<address> parzialmente Archiviata come valore di una proprietà
<AddressDetails> no
<Alias> no
<altitude> no
<altitudeMode> no
<atom:author> no
<atom:link> no
<atom:name> no
<BalloonStyle> parzialmente è supportato solo il tag <text>
<begin> N/A <TimeSpan> non supportato
<bgColor> no
<bottomFov> N/A <PhotoOverlay> non è supportato
<Camera> no
<Cambia> parzialmente sono supportate solo le modifiche allo stile
<color> parzialmente include #AABBGGRR e #BBGGRR; non supportato in <ScreenOverlay> e <GroundOverlay>
<colorMode>
<cookie> no <NetworkLinkControl> non supportato
<coordinates>
<Crea> no
<Data> no
<Elimina> no
<description> Solo testo normale, nessun contenuto HTML supportato
<displayMode> no
<displayName> no
<Document>
<drawOrder>
<east>
<end> N/A <TimeSpan> non supportato
<expires> no <NetworkLinkControl> non supportato
<ExtendedData> parzialmente solo <Data> senza tipo, nessun <SempliciData> o <Schema> e le sostituzioni delle entità nel formato$[dataName] non sono supportate.
<extrude> no
<fill>
<flyToView> no <NetworkLinkControl> non supportato
<Cartella>
<gridOrigin> N/A <PhotoOverlay> non è supportato
<GroundOverlay>
<heading>
<hotSpot>
<href>
<httpQuery> no
<Icon>
<IconStyle>
<ImagePyramid> N/A <PhotoOverlay> non è supportato
<innerBoundaryIs> implicitamente dall'ordine <LinearRing>
<ItemIcon> N/A <ListStyle> non è supportato
<key>
<kml>
<LabelStyle> no
<latitude>
<LatLonAltBox> no
<LatLonBox>
<leftFov> N/A <PhotoOverlay> non è supportato
<LinearRing>
<LineString>
<LineStyle>
<Link> no
<linkDescription> N/A <NetworkLinkControl> non supportato
<linkName> N/A <NetworkLinkControl> non supportato
<linkSnippet> N/A <NetworkLinkControl> non supportato
<listItemType> N/A <ListStyle> non è supportato
<ListStyle> no
<Località> N/A <Modello> non supportato
<Lod>
<longitude>
<LookAt> no
<maxAltitude> no
<maxFadeExtent> no
<maxHeight> N/A <PhotoOverlay> non è supportato
<maxLodPixels> no
<maxSessionLength> no
<maxWidth> N/A <PhotoOverlay> non è supportato
<message> no
<minAltitude> no
<minFadeExtent> no
<minLodPixels> no
<minRefreshPeriod> no <NetworkLink>
<Modello> no
<MultiGeometry>
<name>
<vicino> N/A <PhotoOverlay> non è supportato
<NetworkLink> no
<NetworkLinkControl> no
<north>
<open> Archiviata come valore di una proprietà
<Orientation> N/A <Modello> non supportato
<outerBoundaryIs> implicitamente dall'ordine <LinearRing>
<outline>
<overlayXY> no
<Pair>
<phoneNumber> parzialmente Archiviata come valore di una proprietà
<PhotoOverlay> no
<Placemark>
<Point>
<Polygon>
<PolyStyle>
<range>
<refreshInterval> no
<refreshMode> no
<refreshVisibility> no
<Region>
<ResourceMap> N/A <Modello> non supportato
<rightFov> N/A <PhotoOverlay> non è supportato
<roll> N/A <Fotocamera> e <Modello> non sono supportati
<rotation>
<rotationXY> no
<Scala> N/A <Modello> non supportato
<scale>
<Schema> no
<SchemaData> no
<ScreenOverlay> no
<screenXY> N/A <ScreenOverlay> non è supportato
<shape> N/A <PhotoOverlay> non è supportato
<SimpleData> N/A <SchemaData> non è supportato
<SimpleField> N/A <Schema> non è supportato
<size>
<Snippet> no
<south>
<state> N/A <ListStyle> non è supportato
<Style>
<StyleMap> parzialmente Stile evidenziato non fornito. Mappe di stile incorporate non supportate
<styleUrl>
<targetHref> no <Alias> non è supportato
<tessellate> no
<text>
<textColor> no
<tileSize> N/A <PhotoOverlay> non è supportato
<tilt> no
<TimeSpan> no
<TimeStamp> no
<topFov> N/A <PhotoOverlay> non è supportato
<Aggiorna> N/A <NetworkLinkControl< non supportato
<value>
<viewBoundScale> no
<viewFormat> no
<viewRefreshMode> no
<viewRefreshTime> no
<ViewVolume> N/A <PhotoOverlay> non è supportato
<visibility>
<west>
<when> N/A <TimeStamp> non è supportato
<width>