Utilidad de importación de KML de Google Maps

  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

Java

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

Kotlin

val layer = 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

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)
      

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

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

Cómo borrar una capa KML

Supongamos que creaste KmlLayer:

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)
      

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

Java

layer.removeLayerFromMap();
      

Kotlin

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 o KmlContainer:

Java

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

Kotlin

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

Para acceder a contenedores que estén anidados en KmlLayer o KmlContainer:

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

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:

Java

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

Kotlin

for (placemark in layer.placemarks) {
    // 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, en caso de que exista.

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

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:

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

Cómo consultar la app de demostración

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> Implícitamente, a partir del pedido <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> Implícitamente, a partir del pedido <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>