Утилита Google Maps Android GeoJSON

Выберите платформу: Android iOS JavaScript
  1. Введение
  2. Как добавить слой GeoJsonLayer на карту
  3. Как удалить слой GeoJsonLayer
  4. Как добавить или удалить объект GeoJsonFeature
  5. Доступ к объектам GeoJsonFeature и их свойствам
  6. Как настроить стиль для GeoJsonLayer и GeoJsonFeature
  7. Демонстрационное приложение

Введение

GeoJSON – это расширение формата данных JSON, которое служит для передачи геоданных. Эта утилита позволяет сохранять информацию о географических объектах в формате GeoJSON и отображать их в слое поверх карты. Чтобы добавить данные GeoJSON на карту, вызовите метод addLayerToMap(). Чтобы удалить их, вызовите метод removeLayerFromMap(). Точно так же можно добавлять и удалять отдельные географические объекты, вызывая методы addFeature() и removeFeature() и передавая им объекты GeoJsonFeature. Для доступа к географическим объектам используется метод getFeatures(), возвращающий итерируемый массив всех объектов GeoJsonFeature, добавленных в слой.

Можно задать стили по умолчанию, которые будут применяться к географическим объектам перед добавлением в слой. Для этого вызовите метод getDefaultPointStyle(), getDefaultLineStringStyle() или getDefaultPolygonStyle() и задайте параметры стиля. Вы также можете задать стиль для отдельного объекта GeoJsonFeature, вызвав для него метод setPointStyle(), setLineStringStyle() или setPolygonStyle() и передав нужный объект с параметрами стиля.

Как добавить слой GeoJsonLayer на карту

Чтобы добавить слой GeoJson на карту, сначала необходимо создать экземпляр класса GeoJsonLayer. Это можно сделать двумя способами.

Для импорта данных из объекта JSONObject вам понадобятся:

  • объект GoogleMap, в котором будет отрисовываться слой;
  • объект JSONObject, содержащий данные GeoJSON, которые нужно добавить в слой.

Java


JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);

      

Kotlin


val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)

      

Для импорта данных из локального файла GeoJSON вам понадобятся:

  • объект GoogleMap, в котором будет отрисовываться слой;
  • локальный файл ресурсов, содержащий данные GeoJSON;
  • объект Context, необходимый для открытия локального файла ресурсов.

Java


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

      

Kotlin


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

      

После создания объекта GeoJsonLayer вызовите метод addLayerToMap(), чтобы добавить импортированные данные на карту.

Java


layer.addLayerToMap();

      

Kotlin


layer.addLayerToMap()

      

Как удалить слой GeoJsonLayer

Предположим, что вы добавили слой следующим образом:

Java


JSONObject geoJsonData = // JSONObject containing the GeoJSON data
GeoJsonLayer layer = new GeoJsonLayer(map, geoJsonData);

      

Kotlin


val geoJsonData: JSONObject? = // JSONObject containing the GeoJSON data
val layer = GeoJsonLayer(map, geoJsonData)

      

Чтобы очистить GeoJsonLayer, вызовите метод removeLayerFromMap().

Java


layer.removeLayerFromMap();

      

Kotlin


layer.removeLayerFromMap()

      

Как добавить или удалить объект GeoJsonFeature

Географический объект в GeoJSON имеет тип feature. Он содержит геометрические данные и элемент свойства, а также может содержать граничную рамку или идентификатор.

Вы можете создать объекты GeoJsonFeature по отдельности и добавить их в слой GeoJsonLayer.

Предположим, что вы создали географический объект, который содержит точку с координатами 0, 0, имеет одну запись в свойствах и не имеет граничной рамки.

Java


GeoJsonPoint point = new GeoJsonPoint(new LatLng(0, 0));
HashMap<String, String> properties = new HashMap<>();
properties.put("Ocean", "South Atlantic");
GeoJsonFeature pointFeature = new GeoJsonFeature(point, "Origin", properties, null);

      

Kotlin


val point = GeoJsonPoint(LatLng(0.0, 0.0))
val properties = hashMapOf("Ocean" to "South Atlantic")
val pointFeature = GeoJsonFeature(point, "Origin", properties, null)

      

Чтобы добавить этот географический объект в слой, вызовите метод addFeature() и передайте ему этот объект.

Java


layer.addFeature(pointFeature);

      

Kotlin


layer.addFeature(pointFeature)

      

Чтобы удалить объект после того, как он был добавлен в слой, вызовите метод removeFeature() и передайте ему этот объект.

Java


layer.removeFeature(pointFeature);

      

Kotlin


layer.removeFeature(pointFeature)

      

Доступ к объектам GeoJsonFeature и их свойствам

Чтобы обратиться к любому объекту GeoJsonFeature, добавленному в слой, вызовите метод getFeatures() для созданного вами объекта GeoJsonLayer. Будет возвращен итерируемый массив объектов GeoJsonFeatures, которые можно обработать с помощью цикла for-each, как показано ниже.

Java


for (GeoJsonFeature feature : layer.getFeatures()) {
    // Do something to the feature
}

      

Kotlin


for (feature in layer.features) {
    // Do something to the feature
}

      

С помощью методов hasProperty() и getProperty() в сочетании с методом getFeatures() вы можете проверить, есть ли у каждого сохраненного объекта определенное свойство, и получить к нему доступ, если оно существует.

Java


if (feature.hasProperty("Ocean")) {
    String oceanProperty = feature.getProperty("Ocean");
}

      

Kotlin


if (feature.hasProperty("Ocean")) {
    val oceanProperty = feature.getProperty("Ocean")
}

      

События кликов по фигурам GeoJSON

С помощью метода GeoJsonLayer.OnFeatureClickListener() можно прослушивать события кликов по геометрическим объектам на карте. В приведенном ниже примере кода реализовано сохранение названия объекта на карте при клике по этому объекту.

Java


// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener(new Layer.OnFeatureClickListener() {
    @Override
    public void onFeatureClick(Feature feature) {
        Log.i("GeoJsonClick", "Feature clicked: " + feature.getProperty("title"));
    }
});

      

Kotlin


// Set a listener for geometry clicked events.
layer.setOnFeatureClickListener { feature ->
    Log.i("GeoJsonClick", "Feature clicked: ${feature.getProperty("title")}")
}

      

Как настроить стиль для GeoJsonLayer и GeoJsonFeature

Для слоя GeoJsonLayer можно выбрать стили по умолчанию или определить стиль для расположенных в этом слое отдельных объектов.

Стили по умолчанию

В слое GeoJsonLayer можно устанавливать стили по умолчанию для любых точек, ломаных линий и многоугольников, которые добавляются к слою. Стили по умолчанию применяются только в том случае, если вы не установили стиль для каких-либо геометрических компонентов объекта. Все изменения, выполненные для стиля по умолчанию, будут отражены во всех объектах, которые используют этот стиль.

Ниже приведены инструкции по настройке стиля по умолчанию.

  1. Получите соответствующий объект стиля по умолчанию. Это может быть GeoJsonPointStyle, GeoJsonLineStringStyle или GeoJsonPolygonStyle.
  2. Примените к стилю требуемые параметры.

Например, в приведенном ниже примере кода показано, как изменить стиль по умолчанию для точек. В результате точки станут перетаскиваемыми и у них появятся название и текстовый фрагмент.

Java


GeoJsonPointStyle pointStyle = layer.getDefaultPointStyle();
pointStyle.setDraggable(true);
pointStyle.setTitle("Hello, World!");
pointStyle.setSnippet("I am a draggable marker");

      

Kotlin


val pointStyle = layer.defaultPointStyle
pointStyle.isDraggable = true
pointStyle.title = "Hello, World!"
pointStyle.snippet = "I am a draggable marker"

      

Стили для отдельных объектов GeoJsonFeature

Вы также можете задавать стиль для отдельных объектов в слое. Чтобы применить стиль к объекту GeoJsonFeature, выполните следующие действия:

  1. Создайте нужный объект стиля (GeoJsonPointStyle, GeoJsonLineStringStyle или GeoJsonPolygonStyle).
  2. Примените к стилю требуемые параметры.
  3. Передайте объект стиля нужному методу объекта GeoJsonFeature (это может быть метод setPointStyle(), setLineStringStyle() или setPolygonStyle()).

В приведенном ниже примере кода показано, как задать красный цвет для ломаных линий в объекте GeoJsonFeature.

Java


// Create a new feature containing a linestring
List<LatLng> lineStringArray = new ArrayList<LatLng>();
lineStringArray.add(new LatLng(0, 0));
lineStringArray.add(new LatLng(50, 50));
GeoJsonLineString lineString = new GeoJsonLineString(lineStringArray);
GeoJsonFeature lineStringFeature = new GeoJsonFeature(lineString, null, null, null);

// Set the color of the linestring to red
GeoJsonLineStringStyle lineStringStyle = new GeoJsonLineStringStyle();
lineStringStyle.setColor(Color.RED);

// Set the style of the feature
lineStringFeature.setLineStringStyle(lineStringStyle);

      

Kotlin


// Create a new feature containing a linestring
val lineStringArray: MutableList<LatLng> = ArrayList()
lineStringArray.add(LatLng(0.0, 0.0))
lineStringArray.add(LatLng(50.0, 50.0))
val lineString = GeoJsonLineString(lineStringArray)
val lineStringFeature = GeoJsonFeature(lineString, null, null, null)

// Set the color of the linestring to red
val lineStringStyle = GeoJsonLineStringStyle()
lineStringStyle.color = Color.RED

// Set the style of the feature
lineStringFeature.lineStringStyle = lineStringStyle

      

Демонстрационное приложение

Пример импорта файла GeoJSON из указанного URL и создания слоя с помощью этого файла представлен в коде GeoJsonDemoActivity демонстрационного приложения из библиотеки утилит. В руководстве по настройке рассказывается, как запустить демонстрационное приложение.