简介
KML 是对 XML 数据格式的扩展,表示地图上的地理数据。您可以利用该实用程序将 KML 对象转换为地理形状,并将它们渲染为覆盖在地图上的图层。如需在地图中添加和移除 KML 数据,请分别调用 addLayerToMap() 和 removeLayerFromMap()。如需访问 KML 对象中的属性,请对任意 Placemark、GroundOverlay、Document 或 Folder 调用 getProperties()。
向地图添加 KML 图层
如需向地图添加数据图层,请先创建一个 KmlLayer 类的实例。可通过两种方法将 KmlLayer 实例化。
如需导入和渲染来自本地资源的 KML 数据集,您需要:
- 待渲染的图层所在的
GoogleMap对象。 - 包含 KML 数据的本地资源文件。
- 打开本地资源文件所需的
Context对象。
Kotlin
val layer = KmlLayer(map, R.raw.geojson_file, context)
Java
KmlLayer layer = new KmlLayer(map, R.raw.geojson_file, context);
如需导入和渲染来自本地数据流的 KML 数据集,您需要:
- 待渲染的图层所在的
GoogleMap对象。 - 包含 KML 数据的
InputStream。 - 打开本地资源所需的
Context对象。
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);
创建 KmlLayer 后,请调用 addLayerToMap()() 将导入的数据添加到地图上:
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
清除 KML 图层
我们假定您已创建以下 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);
如需从地图中移除该图层,请调用 removeLayerFromMap():
Kotlin
layer.removeLayerFromMap()
Java
layer.removeLayerFromMap();
访问 KML 容器
如需访问任何已添加到图层中的容器,您可以对已创建的图层调用 getContainers()。如需检查容器是否有嵌套容器,您可以调用 hasContainers()。如需访问这些嵌套容器,您可以像在图层中那样调用 getContainers()。
如需访问未嵌套在 KmlLayer 或 KmlContainer: 中的容器,请实现以下代码:
Kotlin
for (containers in layer.containers) {
// Do something to container
}
Java
for (KmlContainer containers : layer.getContainers()) {
// Do something to container
}
如需访问嵌套在 KmlLayer 或 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());
}
}
}
访问 KML 地标和 KML 地面叠加层
如需访问已添加到图层中的地标或地面叠加层,您可以对图层或容器调用 getPlacemarks() 或 getGroundOverlays()。调用其中任何一种方法都会分别返回 KmlPlacemarks 或 KmlGroundOverlays 的 iterable。
例如,如需访问图层中的 KmlPlacemark 对象,请实现以下代码:
Kotlin
for (placemark in layer.placemarks) {
// Do something to Placemark
}
Java
for (KmlPlacemark placemark : layer.getPlacemarks()) {
// Do something to Placemark
}
访问 KML 属性
如需访问容器或地标内的任何属性,请调用 getProperty() 并为其提供属性键。您还可以调用 hasProperty() 来确认其是否存在。以下示例展示了如何从容器中检索属性值“name”(若存在)。
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 几何图形点击事件
您可以使用 KmlLayer.OnFeatureClickListener() 监听地图上几何图形地图项的点击事件。以下示例会在用户点击该地图项时记录地图项 ID:
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());
}
});
观摩演示版应用
如需查看导入 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> | 是 |