- Introducción
- Cómo agregar una capa KML
- Cómo borrar una capa KML
- Cómo acceder a contenedores KML
- Cómo acceder a marcadores KML y superposiciones de suelo KML
- Cómo acceder a propiedades de KML
- 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> | sí | |
<cookie> | no | No se admite <NetworkLinkControl>. |
<coordinates> | sí | |
<Create> | no | |
<Data> | no | |
<Delete> | no | |
<description> | sí | Solo texto sin formato. No se admite contenido HTML. |
<displayMode> | no | |
<displayName> | no | |
<Document> | sí | |
<drawOrder> | sí | |
<east> | sí | |
<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> | sí | |
<flyToView> | no | No se admite <NetworkLinkControl>. |
<Folder> | sí | |
<gridOrigin> | N/A | No se admite <PhotoOverlay>. |
<GroundOverlay> | sí | |
<heading> | sí | |
<hotSpot> | sí | |
<href> | sí | |
<httpQuery> | no | |
<Icon> | sí | |
<IconStyle> | sí | |
<ImagePyramid> | N/A | No se admite <PhotoOverlay>. |
<innerBoundaryIs> | sí | Se admite de forma implícita a partir del orden de <LinearRing>. |
<ItemIcon> | N/A | No se admite <ListStyle>. |
<key> | sí | |
<kml> | sí | |
<LabelStyle> | no | |
<latitude> | sí | |
<LatLonAltBox> | no | |
<LatLonBox> | sí | |
<leftFov> | N/A | No se admite <PhotoOverlay>. |
<LinearRing> | sí | |
<LineString> | sí | |
<LineStyle> | sí | |
<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> | sí | |
<longitude> | sí | |
<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> | sí | |
<name> | sí | |
<near> | N/A | No se admite <PhotoOverlay>. |
<NetworkLink> | no | |
<NetworkLinkControl> | no | |
<north> | sí | |
<open> | sí | Se almacena como valor de propiedad. |
<Orientation> | N/A | No se admite <Model>. |
<outerBoundaryIs> | sí | Se admite de forma implícita a partir del orden de <LinearRing>. |
<outline> | sí | |
<overlayXY> | no | |
<Pair> | sí | |
<phoneNumber> | parcialmente | Se almacena como valor de propiedad. |
<PhotoOverlay> | no | |
<Placemark> | sí | |
<Point> | sí | |
<Polygon> | sí | |
<PolyStyle> | sí | |
<range> | sí | |
<refreshInterval> | no | |
<refreshMode> | no | |
<refreshVisibility> | no | |
<Region> | sí | |
<ResourceMap> | N/A | No se admite <Model>. |
<rightFov> | N/A | No se admite <PhotoOverlay>. |
<roll> | N/A | No se admiten <Camera> ni <Model>. |
<rotation> | sí | |
<rotationXY> | no | |
<Scale> | N/A | No se admite <Model>. |
<scale> | sí | |
<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> | sí | |
<Snippet> | no | |
<south> | sí | |
<state> | N/A | No se admite <ListStyle>. |
<Style> | sí | |
<StyleMap> | parcialmente | No se proporciona el estilo destacado. No se admite StyleMaps integrado. |
<styleUrl> | sí | |
<targetHref> | no | No se admite <Alias>. |
<tessellate> | no | |
<text> | sí | |
<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> | sí | |
<viewBoundScale> | no | |
<viewFormat> | no | |
<viewRefreshMode> | no | |
<viewRefreshTime> | no | |
<ViewVolume> | N/A | No se admite <PhotoOverlay>. |
<visibility> | sí | |
<west> | sí | |
<when> | N/A | No se admite <TimeStamp>. |
<width> | sí |