简介
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> | 是 |