Утилита Google Maps Android GeoJSON

  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 демонстрационного приложения из библиотеки утилит. В руководстве по настройке рассказывается, как запустить демонстрационное приложение.