Utilidad de importación de KML de Google Maps

Selecciona la plataforma: Android iOS JavaScript
  1. Introducción
  2. Cómo agregar una capa KML
  3. Cómo borrar una capa KML
  4. Cómo acceder a contenedores KML
  5. Cómo acceder a marcadores KML y superposiciones de suelo KML
  6. Cómo acceder a propiedades de KML
  7. Funciones admitidas por KML

Introducción

KML es una extensión del formato de datos XML y representa datos geográficos en un mapa. Con esta utilidad, puedes convertir objetos KML en formas geográficas y renderizarlas como una capa sobre el mapa. Para agregar tus datos KML al mapa y quitarlos de este, llama a addLayerToMap() y removeLayerFromMap() respectivamente. Para acceder a las propiedades de un objeto KML, llama a getProperties() en cualquier objeto Placemark, GroundOverlay, Document o Folder.

Cómo agregar una capa KML al mapa

Para agregar una capa de datos al mapa, primero crea una instancia de la clase KmlLayer. Existen dos maneras de crear una instancia de KmlLayer.

Para importar y renderizar un conjunto de datos de KML a partir de un recurso local, necesitas lo siguiente:

  • Un objeto GoogleMap en el que se renderizará la capa
  • Un archivo de recursos local que contenga los datos de KML
  • Un objeto Context, que se necesita para abrir un archivo de recursos local

Kotlin



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

      

Java


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

      

Para importar y renderizar un conjunto de datos de KML a partir de un flujo local, necesitas lo siguiente:

  • Un objeto GoogleMap en el que se renderizará la capa
  • Un objeto InputStream que contenga los datos de KML
  • Un objeto Context, que se necesita para abrir recursos locales

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

      

Después de crear un objeto KmlLayer, llama a addLayerToMap()() para agregar los datos importados al mapa.

Kotlin



layer.addLayerToMap()

      

Java


layer.addLayerToMap();

      

Cómo borrar una capa KML

Supongamos que creaste 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);

      

Para quitar la capa del mapa, llama a removeLayerFromMap():

Kotlin



layer.removeLayerFromMap()

      

Java


layer.removeLayerFromMap();

      

Cómo acceder a contenedores KML

Para acceder a cualquier contenedor que se haya agregado a tu capa, puedes llamar a getContainers() en la capa que creaste. Para verificar si un contenedor tiene contenedores anidados, puedes llamar a hasContainers(). Para acceder a estos contenedores anidados, algo similar a lo que puedes hacer en tu capa, puedes llamar a getContainers().

Para acceder a contenedores que no estén anidados en KmlLayer ni KmlContainer:, utiliza este código:

Kotlin



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

      

Java


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

      

Para acceder a contenedores que estén anidados en KmlLayer o KmlContainer, utiliza este código:

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

      

Cómo acceder a marcadores KML y superposiciones de suelo KML

Para acceder a cualquier marcador o superposición de suelo agregados a la capa, puedes llamar a getPlacemarks() o getGroundOverlays() en una capa o contenedor. Si llamas a cualquiera de ellos, se mostrará un elemento iterable de KmlPlacemarks o KmlGroundOverlays, respectivamente.

Por ejemplo, para acceder a objetos KmlPlacemark desde una capa:

Kotlin



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

      

Java


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

      

Cómo acceder a propiedades de KML

Para acceder a cualquier propiedad en un contenedor o un marcador, llama a getProperty() y asígnale una clave de propiedad. También puedes llamar a hasProperty() para comprobar si existe. En el siguiente ejemplo, se muestra cómo recuperar el valor de propiedad "name" de un contenedor, si existe.

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

      

Eventos de clic en geometría de KML

Puedes utilizar KmlLayer.OnFeatureClickListener() para escuchar eventos de clic en las funciones de geometría del mapa. En el siguiente ejemplo, se registra el ID de una función cuando el usuario hace clic en ella:

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

      

Cómo consultar la app de demo

Para ver un ejemplo de cómo importar un archivo KML y crear una capa con él, observa KmlDemoActivity en la app de demostración que se incluye en la biblioteca de utilidades. En la guía de configuración, se muestra cómo ejecutar la app de demostración.

Funciones admitidas por KML

Elemento KML ¿Se admite? Comentario
<address> parcialmente Se almacena como valor de propiedad.
<AddressDetails> no
<Alias> no
<altitude> no
<altitudeMode> no
<atom:author> no
<atom:link> no
<atom:name> no
<BalloonStyle> parcialmente Solo se admite <text>.
<begin> N/A No se admite <TimeSpan>.
<bgColor> no
<bottomFov> N/A No se admite <PhotoOverlay>.
<Camera> no
<Change> parcialmente Solo se admiten cambios de estilo.
<color> parcialmente Incluye #AABBGGRR y #BBGGRR; no se admite en <ScreenOverlay> y <GroundOverlay>.
<colorMode>
<cookie> no No se admite <NetworkLinkControl>.
<coordinates>
<Create> no
<Data> no
<Delete> no
<description> Solo texto sin formato. No se admite contenido HTML.
<displayMode> no
<displayName> no
<Document>
<drawOrder>
<east>
<end> N/A No se admite <TimeSpan>.
<expires> no No se admite <NetworkLinkControl>.
<ExtendedData> parcialmente Solo <Data> sin tipo. No se admiten <SimpleData>, <Schema> ni reemplazos de entidades con form$[dataName].
<extrude> no
<fill>
<flyToView> no No se admite <NetworkLinkControl>.
<Folder>
<gridOrigin> N/A No se admite <PhotoOverlay>.
<GroundOverlay>
<heading>
<hotSpot>
<href>
<httpQuery> no
<Icon>
<IconStyle>
<ImagePyramid> N/A No se admite <PhotoOverlay>.
<innerBoundaryIs> Se admite de forma implícita a partir del orden de <LinearRing>.
<ItemIcon> N/A No se admite <ListStyle>.
<key>
<kml>
<LabelStyle> no
<latitude>
<LatLonAltBox> no
<LatLonBox>
<leftFov> N/A No se admite <PhotoOverlay>.
<LinearRing>
<LineString>
<LineStyle>
<Link> no
<linkDescription> N/A No se admite <NetworkLinkControl>.
<linkName> N/A No se admite <NetworkLinkControl>.
<linkSnippet> N/A No se admite <NetworkLinkControl>.
<listItemType> N/A No se admite <ListStyle>.
<ListStyle> no
<Location> N/A No se admite <Model>.
<Lod>
<longitude>
<LookAt> no
<maxAltitude> no
<maxFadeExtent> no
<maxHeight> N/A No se admite <PhotoOverlay>.
<maxLodPixels> no
<maxSessionLength> no
<maxWidth> N/A No se admite <PhotoOverlay>.
<message> no
<minAltitude> no
<minFadeExtent> no
<minLodPixels> no
<minRefreshPeriod> no <NetworkLink>
<Model> no
<MultiGeometry>
<name>
<near> N/A No se admite <PhotoOverlay>.
<NetworkLink> no
<NetworkLinkControl> no
<north>
<open> Se almacena como valor de propiedad.
<Orientation> N/A No se admite <Model>.
<outerBoundaryIs> Se admite de forma implícita a partir del orden de <LinearRing>.
<outline>
<overlayXY> no
<Pair>
<phoneNumber> parcialmente Se almacena como valor de propiedad.
<PhotoOverlay> no
<Placemark>
<Point>
<Polygon>
<PolyStyle>
<range>
<refreshInterval> no
<refreshMode> no
<refreshVisibility> no
<Region>
<ResourceMap> N/A No se admite <Model>.
<rightFov> N/A No se admite <PhotoOverlay>.
<roll> N/A No se admiten <Camera> ni <Model>.
<rotation>
<rotationXY> no
<Scale> N/A No se admite <Model>.
<scale>
<Schema> no
<SchemaData> no
<ScreenOverlay> no
<screenXY> N/A No se admite <ScreenOverlay>.
<shape> N/A No se admite <PhotoOverlay>.
<SimpleData> N/A No se admite <SchemaData>.
<SimpleField> N/A No se admite <Schema>.
<size>
<Snippet> no
<south>
<state> N/A No se admite <ListStyle>.
<Style>
<StyleMap> parcialmente No se proporciona el estilo destacado. No se admite StyleMaps integrado.
<styleUrl>
<targetHref> no No se admite <Alias>.
<tessellate> no
<text>
<textColor> no
<tileSize> N/A No se admite <PhotoOverlay>.
<tilt> no
<TimeSpan> no
<TimeStamp> no
<topFov> N/A No se admite <PhotoOverlay>.
<Update> N/A No se admite <NetworkLinkControl>.
<value>
<viewBoundScale> no
<viewFormat> no
<viewRefreshMode> no
<viewRefreshTime> no
<ViewVolume> N/A No se admite <PhotoOverlay>.
<visibility>
<west>
<when> N/A No se admite <TimeStamp>.
<width>