Google Maps KML Importing Utility

Select platform: Android iOS JavaScript
  1. Introduction
  2. Add a KML layer
  3. Clear a KML layer
  4. Access KML containers
  5. Access KML placemarks and KML ground overlays
  6. Access KML properties
  7. 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 GoogleMap object where the layer is to be rendered.
  • A local resource file containing the KML data.
  • A Context object, 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 GoogleMap object where the layer is to be rendered.
  • An InputStream containing the KML data.
  • A Context object, 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