AI-generated Key Takeaways
- 
          KML data can be converted into geographical shapes and rendered as a layer on top of a map using the Maps SDK for Android Utility Library. 
- 
          This utility allows importing KML datasets from local resources or streams and adding them as layers to the map. 
- 
          Developers can access and manipulate KML containers, placemarks, ground overlays, and properties using provided methods. 
- 
          Click events on KML geometry features can be captured using the KmlLayer.OnFeatureClickListener().
- 
          The utility supports a wide range of KML elements, enabling detailed customization and interaction with KML data. 
- Introduction
- Add a KML layer
- Clear a KML layer
- Access KML containers
- Access KML placemarks and KML ground overlays
- Access KML properties
- KML supported features
Introduction
  KML
  is an extension of the
  XML
  data format and represents geographical data on a map. Using this utility, you
  can convert KML objects into geographical shapes and render them as a layer on
  top of a map. To add and remove your KML data to and from the map, call
  addLayerToMap() and removeLayerFromMap()
  respectively. To access properties in a KML object, call
  getProperties() on any Placemark, GroundOverlay, Document or
  Folder.
Add a KML layer to the map
To add a data layer to the map, first create an instance of the
KmlLayer class. There are two ways to instantiate a
KmlLayer.
To import and render a KML dataset from a local resource, you need:
- A GoogleMapobject where the layer is to be rendered.
- A local resource file containing the KML data.
- A Contextobject, which is required to open a local resource file.
Kotlin
val layer = KmlLayer(map, R.raw.geojson_file, context)
Java
KmlLayer layer = new KmlLayer(map, R.raw.geojson_file, context);
To import and render a KML dataset from a local stream, you need:
- A GoogleMapobject where the layer is to be rendered.
- An InputStreamcontaining the KML data.
- A Contextobject, which is required to open local resources.
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);
After you have created a KmlLayer, call
  addLayerToMap()() to add the imported data onto the map.
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
Clear a KML layer
Let's assume that you have created this 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);
To remove the layer from the map, call removeLayerFromMap():
Kotlin
layer.removeLayerFromMap()
Java
layer.removeLayerFromMap();
Access KML containers
To access any containers that have been added to your layer,
  you can call getContainers() on the layer that you have created.
  To check if any container has nested containers, you can call
  hasContainers(). To access these nested containers, similar to
  what you are able to do in your layer, you can call
  getContainers()
To access containers which are not nested in a KmlLayer
  or KmlContainer:
Kotlin
for (containers in layer.containers) { // Do something to container }
Java
for (KmlContainer containers : layer.getContainers()) { // Do something to container }
To access containers which are nested in a KmlLayer
  or 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()); } } }
Access KML placemarks and KML ground overlays
To access any placemark or ground overlay that has been
  added to the layer, you can call getPlacemarks() or
  getGroundOverlays() on a layer or container. Calling either will
  return an iterable of KmlPlacemarks or
  KmlGroundOverlays respectively.
For example, to access a KmlPlacemark objects from a layer:
Kotlin
for (placemark in layer.placemarks) { // Do something to Placemark }
Java
for (KmlPlacemark placemark : layer.getPlacemarks()) { // Do something to Placemark }
Access KML properties
To access any property in a container or placemark, call
  getProperty() and give it a property key. You can also call
  hasProperty() to check if it exists. This sample shows how to
  retrieve the property value "name" from a container, if it exists.
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")); } }
KML Geometry Click Events
You can use KmlLayer.OnFeatureClickListener() to listen for click events on the
  geometry features on the map. The following example logs the ID of a feature when the user
  clicks the feature:
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()); } });
See the demo app
For an example of importing a KML file and creating a layer
  with it, take a look at the KmlDemoActivity in the demo app
  that ships with the utility library. The setup guide shows you how
  to run the demo app.
KML supported features
| KML Element | Supported? | Comment | 
|---|---|---|
| <address> | partially | Stored as a property value | 
| <AddressDetails> | no | |
| <Alias> | no | |
| <altitude> | no | |
| <altitudeMode> | no | |
| <atom:author> | no | |
| <atom:link> | no | |
| <atom:name> | no | |
| <BalloonStyle> | partially | only <text> is supported | 
| <begin> | N/A | <TimeSpan> is not supported | 
| <bgColor> | no | |
| <bottomFov> | N/A | <PhotoOverlay> is not supported | 
| <Camera> | no | |
| <Change> | partially | only style changes are supported | 
| <color> | partially | includes #AABBGGRR and #BBGGRR; not supported in <ScreenOverlay>, and <GroundOverlay> | 
| <colorMode> | yes | |
| <cookie> | no | <NetworkLinkControl> not supported | 
| <coordinates> | yes | |
| <Create> | no | |
| <Data> | no | |
| <Delete> | no | |
| <description> | yes | Plain text only, no HTML content is supported | 
| <displayMode> | no | |
| <displayName> | no | |
| <Document> | yes | |
| <drawOrder> | yes | |
| <east> | yes | |
| <end> | N/A | <TimeSpan> is not supported | 
| <expires> | no | <NetworkLinkControl> not supported | 
| <ExtendedData> | partially | untyped <Data> only, no <SimpleData> or <Schema>, and entity replacements of the form$[dataName] are unsupported. | 
| <extrude> | no | |
| <fill> | yes | |
| <flyToView> | no | <NetworkLinkControl> not supported | 
| <Folder> | yes | |
| <gridOrigin> | N/A | <PhotoOverlay> is not supported | 
| <GroundOverlay> | yes | |
| <heading> | yes | |
| <hotSpot> | yes | |
| <href> | yes | |
| <httpQuery> | no | |
| <Icon> | yes | |
| <IconStyle> | yes | |
| <ImagePyramid> | N/A | <PhotoOverlay> is not supported | 
| <innerBoundaryIs> | yes | implicitly from <LinearRing> order | 
| <ItemIcon> | N/A | <ListStyle> is not supported | 
| <key> | yes | |
| <kml> | yes | |
| <LabelStyle> | no | |
| <latitude> | yes | |
| <LatLonAltBox> | no | |
| <LatLonBox> | yes | |
| <leftFov> | N/A | <PhotoOverlay> is not supported | 
| <LinearRing> | yes | |
| <LineString> | yes | |
| <LineStyle> | yes | |
| <Link> | no | |
| <linkDescription> | N/A | <NetworkLinkControl> not supported | 
| <linkName> | N/A | <NetworkLinkControl> not supported | 
| <linkSnippet> | N/A | <NetworkLinkControl> not supported | 
| <listItemType> | N/A | <ListStyle> is not supported | 
| <ListStyle> | no | |
| <Location> | N/A | <Model> is not supported | 
| <Lod> | yes | |
| <longitude> | yes | |
| <LookAt> | no | |
| <maxAltitude> | no | |
| <maxFadeExtent> | no | |
| <maxHeight> | N/A | <PhotoOverlay> is not supported | 
| <maxLodPixels> | no | |
| <maxSessionLength> | no | |
| <maxWidth> | N/A | <PhotoOverlay> is not supported | 
| <message> | no | |
| <minAltitude> | no | |
| <minFadeExtent> | no | |
| <minLodPixels> | no | |
| <minRefreshPeriod> | no | <NetworkLink> | 
| <Model> | no | |
| <MultiGeometry> | yes | |
| <name> | yes | |
| <near> | N/A | <PhotoOverlay> is not supported | 
| <NetworkLink> | no | |
| <NetworkLinkControl> | no | |
| <north> | yes | |
| <open> | yes | Stored as a property value | 
| <Orientation> | N/A | <Model> is not supported | 
| <outerBoundaryIs> | yes | implicitly from <LinearRing> order | 
| <outline> | yes | |
| <overlayXY> | no | |
| <Pair> | yes | |
| <phoneNumber> | partially | Stored as a property value | 
| <PhotoOverlay> | no | |
| <Placemark> | yes | |
| <Point> | yes | |
| <Polygon> | yes | |
| <PolyStyle> | yes | |
| <range> | yes | |
| <refreshInterval> | no | |
| <refreshMode> | no | |
| <refreshVisibility> | no | |
| <Region> | yes | |
| <ResourceMap> | N/A | <Model> is not supported | 
| <rightFov> | N/A | <PhotoOverlay> is not supported | 
| <roll> | N/A | <Camera> and <Model> are not supported | 
| <rotation> | yes | |
| <rotationXY> | no | |
| <Scale> | N/A | <Model> is not supported | 
| <scale> | yes | |
| <Schema> | no | |
| <SchemaData> | no | |
| <ScreenOverlay> | no | |
| <screenXY> | N/A | <ScreenOverlay> is not supported | 
| <shape> | N/A | <PhotoOverlay> is not supported | 
| <SimpleData> | N/A | <SchemaData> are not supported | 
| <SimpleField> | N/A | <Schema> are not supported | 
| <size> | yes | |
| <Snippet> | no | |
| <south> | yes | |
| <state> | N/A | <ListStyle> is not supported | 
| <Style> | yes | |
| <StyleMap> | partially | Highlighted style not supplied. Inline StyleMaps not supported | 
| <styleUrl> | yes | |
| <targetHref> | no | <Alias> is not supported | 
| <tessellate> | no | |
| <text> | yes | |
| <textColor> | no | |
| <tileSize> | N/A | <PhotoOverlay> is not supported | 
| <tilt> | no | |
| <TimeSpan> | no | |
| <TimeStamp> | no | |
| <topFov> | N/A | <PhotoOverlay> is not supported | 
| <Update> | N/A | <NetworkLinkControl< not supported | 
| <value> | yes | |
| <viewBoundScale> | no | |
| <viewFormat> | no | |
| <viewRefreshMode> | no | |
| <viewRefreshTime> | no | |
| <ViewVolume> | N/A | <PhotoOverlay> is not supported | 
| <visibility> | yes | |
| <west> | yes | |
| <when> | N/A | <TimeStamp> is not supported | 
| <width> | yes |