Утилита для импорта данных KML в Google Карты

  1. Введение
  2. Добавление слоя KML
  3. Удаление слоя KML
  4. Доступ к контейнерам KML
  5. Доступ к меткам и наземным наложениям KML
  6. Доступ к свойствам KML
  7. Поддерживаемые элементы KML

Введение

KML – это формат данных, дополняющий формат XML и предназначенный для представления географических данных на карте. Утилита позволяет преобразовывать объекты KML в географические фигуры и накладывать их на карту в качестве слоев. Чтобы добавить данные KML на карту, вызовите метод addLayerToMap(). Чтобы удалить их, вызовите метод removeLayerFromMap(). Чтобы получить свойства объекта KML, вызовите метод getProperties() любого объекта Placemark, GroundOverlay, Document или Folder.

Добавление слоя 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, в который нужно добавить слой;
  • объект InputStream, содержащий данные KML;
  • объект 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().

Чтобы получить доступ к контейнерам, не вложенным в KmlLayer или KmlContainer:, используйте указанный ниже код.

Java

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

Kotlin

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

Чтобы получить доступ к контейнерам, вложенным в KmlLayer или KmlContainer, используйте указанный ниже код.

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

Чтобы получить доступ к какой-либо метке или наземному наложению, добавленному в слой, можно вызвать метод getPlacemarks() или getGroundOverlays() для слоя или контейнера. Эти методы возвращают итерируемый объект KmlPlacemarks или KmlGroundOverlays (соответственно).

Например, для доступа к объектам 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() можно прослушивать события кликов по геометрическим объектам на карте. В приведенном ниже примере кода реализовано сохранение идентификатора объекта на карте при клике по этому объекту:

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> Частично Выделенный стиль не предоставляется. Встроенный элемент 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> Да