- Введение
- Добавление слоя KML
- Удаление слоя KML
- Доступ к контейнерам KML
- Доступ к меткам и наземным наложениям KML
- Доступ к свойствам KML
- Поддерживаемые элементы KML
Введение
KML – это формат данных, дополняющий формат XML и предназначенный для представления географических данных на карте. Рассматриваемая утилита позволяет преобразовывать объекты KML в географические фигуры и накладывать их на карту в качестве слоев. Чтобы добавить данные KML на карту, вызовите метод addLayerToMap()
. Чтобы удалить их, вызовите метод removeLayerFromMap()
. Чтобы получить свойства объекта KML, вызовите метод getProperties()
любого объекта Placemark, GroundOverlay, Document или Folder.
Добавление слоя 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
, в котором будет отрисовываться слой; - объект
InputStream
, содержащий данные KML; - объект
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
Чтобы получить доступ к какой-либо метке или наземному наложению, добавленному в слой, можно вызвать метод getPlacemarks()
или getGroundOverlays()
для слоя или контейнера. Эти методы возвращают итерируемый объект KmlPlacemarks
или KmlGroundOverlays
(соответственно).
Например, для доступа к объектам 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()
можно прослушивать события кликов по геометрическим объектам на карте. Ниже приводится пример кода, который позволяет регистрировать идентификаторы объектов при кликах по этим объектам.
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> | Частично | Выделенный стиль не предоставляется. Встроенный элемент StyleMaps не поддерживается. |
<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> | Да |