Google Maps KML 导入实用程序

  1. 简介
  2. 添加 KML 图层
  3. 清除 KML 图层
  4. 访问 KML 容器
  5. 访问 KML 地标和 KML 地面叠加层
  6. 访问 KML 属性
  7. KML 支持的功能

简介

KML 是对 XML 数据格式的扩展,表示地图上的地理数据。您可以利用该实用程序将 KML 对象转换为地理形状,并将它们渲染为覆盖在地图上的图层。如需在地图中添加和移除 KML 数据,请分别调用 addLayerToMap()removeLayerFromMap()。如需访问 KML 对象中的属性,请对任意 Placemark、GroundOverlay、Document 或 Folder 调用 getProperties()

向地图添加 KML 图层

如需向地图添加数据图层,请先创建一个 KmlLayer 类的实例。可通过两种方法将 KmlLayer 实例化。

如需导入和渲染来自本地资源的 KML 数据集,您需要:

  • 需要渲染的图层所在的 GoogleMap 对象。
  • 包含 KML 数据的本地资源文件。
  • 打开本地资源文件所需的 Context 对象。

Java

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

Kotlin

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

如需导入和渲染来自本地数据流的 KML 数据集,您需要:

  • 需要渲染的图层所在的 GoogleMap 对象。
  • 包含 KML 数据的 InputStream
  • 打开本地资源所需的 Context 对象。

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)
      

创建 KmlLayer 后,请调用 addLayerToMap()() 将导入的数据添加到地图上:

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

清除 KML 图层

我们假定您已创建以下 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)
      

如需从地图中移除该图层,请调用 removeLayerFromMap()

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

访问 KML 容器

如需访问任何已添加到图层中的容器,您可以对已创建的图层调用 getContainers()。如需检查容器是否有嵌套容器,您可以调用 hasContainers()。如需访问这些嵌套容器,您可以像在图层中那样调用 getContainers()

如需访问未嵌套在 KmlLayerKmlContainer: 中的容器,请实现以下代码:

Java

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

Kotlin

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

如需访问嵌套在 KmlLayerKmlContainer 中的容器,请实现以下代码:

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

访问 KML 地标和 KML 地面叠加层

如需访问已添加到图层中的地标或地面叠加层,您可以对图层或容器调用 getPlacemarks()getGroundOverlays()。调用其中任何一种方法都会分别返回 KmlPlacemarksKmlGroundOverlays 的 iterable。

例如,如需访问图层中的 KmlPlacemark 对象,请实现以下代码:

Java

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

Kotlin

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

访问 KML 属性

如需访问容器或地标内的任何属性,请调用 getProperty() 并为其提供属性键。您还可以调用 hasProperty() 来确认其是否存在。以下示例展示了如何从容器中检索属性值“name”(若存在)。

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

KML 几何图形点击事件

您可以使用 KmlLayer.OnFeatureClickListener() 监听地图上几何图形地图项的点击事件。以下示例会在用户点击该地图项时记录其 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());
    }
});
      

Kotlin

// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i(
        "KML",
        "Feature clicked: " + feature.id
    )
}
      

观摩演示版应用

如需查看导入 KML 文件并利用其创建图层的示例,请查看实用程序库附带的演示版应用中的 KmlDemoActivity设置指南向您介绍了如何运行演示版应用。

KML 支持的功能

KML 元素 是否支持? 注释
<address> 部分支持 存储为属性值
<AddressDetails>
<Alias>
<altitude>
<altitudeMode>
<atom:author>
<atom:link>
<atom:name>
<BalloonStyle> 部分支持 仅支持 <text>
<begin> 不适用 不支持 <TimeSpan>
<bgColor>
<bottomFov> 不适用 不支持 <PhotoOverlay>
<Camera>
<Change> 部分支持 仅支持样式更改
<color> 部分支持 包括 #AABBGGRR 和 #BBGGRR;<ScreenOverlay> 和 <GroundOverlay> 中不予支持
<colorMode>
<cookie> 不支持 <NetworkLinkControl>
<coordinates>
<Create>
<Data>
<Delete>
<description> 仅纯文本,不支持 HTML 内容
<displayMode>
<displayName>
<Document>
<drawOrder>
<east>
<end> 不适用 不支持 <TimeSpan>
<expires> 不支持 <NetworkLinkControl>
<ExtendedData> 部分支持 仅支持非类型化 <Data>,不支持 <SimpleData> 或 <Schema>,以及 $[dataName] 形式的实体替换。
<extrude>
<fill>
<flyToView> 不支持 <NetworkLinkControl>
<Folder>
<gridOrigin> 不适用 不支持 <PhotoOverlay>
<GroundOverlay>
<heading>
<hotSpot>
<href>
<httpQuery>
<Icon>
<IconStyle>
<ImagePyramid> 不适用 不支持 <PhotoOverlay>
<innerBoundaryIs> 默认情况下按 <LinearRing> 顺序
<ItemIcon> 不适用 不支持 <ListStyle>
<key>
<kml>
<LabelStyle>
<latitude>
<LatLonAltBox>
<LatLonBox>
<leftFov> 不适用 不支持 <PhotoOverlay>
<LinearRing>
<LineString>
<LineStyle>
<Link>
<linkDescription> 不适用 不支持 <NetworkLinkControl>
<linkName> 不适用 不支持 <NetworkLinkControl>
<linkSnippet> 不适用 不支持 <NetworkLinkControl>
<listItemType> 不适用 不支持 <ListStyle>
<ListStyle>
<Location> 不适用 不支持 <Model>
<Lod>
<longitude>
<LookAt>
<maxAltitude>
<maxFadeExtent>
<maxHeight> 不适用 不支持 <PhotoOverlay>
<maxLodPixels>
<maxSessionLength>
<maxWidth> 不适用 不支持 <PhotoOverlay>
<message>
<minAltitude>
<minFadeExtent>
<minLodPixels>
<minRefreshPeriod> <NetworkLink>
<Model>
<MultiGeometry>
<name>
<near> 不适用 不支持 <PhotoOverlay>
<NetworkLink>
<NetworkLinkControl>
<north>
<open> 存储为属性值
<Orientation> 不适用 不支持 <Model>
<outerBoundaryIs> 默认情况下,按 <LinearRing> 顺序
<outline>
<overlayXY>
<Pair>
<phoneNumber> 部分支持 存储为属性值
<PhotoOverlay>
<Placemark>
<Point>
<Polygon>
<PolyStyle>
<range>
<refreshInterval>
<refreshMode>
<refreshVisibility>
<Region>
<ResourceMap> 不适用 不支持 <Model>
<rightFov> 不适用 不支持 <PhotoOverlay>
<roll> 不适用 不支持 <Camera> 和 <Model>
<rotation>
<rotationXY>
<Scale> 不适用 不支持 <Model>
<scale>
<Schema>
<SchemaData>
<ScreenOverlay>
<screenXY> 不适用 不支持 <ScreenOverlay>
<shape> 不适用 不支持 <PhotoOverlay>
<SimpleData> 不适用 不支持 <SchemaData>
<SimpleField> 不适用 不支持 <Schema>
<size>
<Snippet>
<south>
<state> 不适用 不支持 <ListStyle>
<Style>
<StyleMap> 部分支持 不提供突出显示样式。不支持内联 StyleMap
<styleUrl>
<targetHref> 不支持 <Alias>
<tessellate>
<text>
<textColor>
<tileSize> 不适用 不支持 <PhotoOverlay>
<tilt>
<TimeSpan>
<TimeStamp>
<topFov> 不适用 不支持 <PhotoOverlay>
<Update> 不适用 不支持 <NetworkLinkControl>
<value>
<viewBoundScale>
<viewFormat>
<viewRefreshMode>
<viewRefreshTime>
<ViewVolume> 不适用 不支持 <PhotoOverlay>
<visibility>
<west>
<when> 不适用 不支持 <TimeStamp>
<width>