Утилита 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, которые нужно добавить в слой.

Kotlin



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

      

Java


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

      

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

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

Kotlin



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

      

Java


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

      

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

Kotlin



layer.addLayerToMap()

      

Java


layer.addLayerToMap();

      

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

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

Kotlin



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

      

Java


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

      

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

Kotlin



layer.removeLayerFromMap()

      

Java


layer.removeLayerFromMap();

      

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

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

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

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

Kotlin



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

      

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);

      

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

Kotlin



layer.addFeature(pointFeature)

      

Java


layer.addFeature(pointFeature);

      

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

Kotlin



layer.removeFeature(pointFeature)

      

Java


layer.removeFeature(pointFeature);

      

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

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

Kotlin



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

      

Java


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

      

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

Kotlin



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

      

Java


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

      

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

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

Kotlin



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

      

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"));
    }
});

      

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

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

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

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

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

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

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

Kotlin



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

      

Java


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

      

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

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

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

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

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

      

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);

      

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

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