- Введение
- Как добавить слой GeoJsonLayer на карту
- Как удалить слой GeoJsonLayer
- Как добавить или удалить объект GeoJsonFeature
- Доступ к объектам GeoJsonFeature и их свойствам
- Как настроить стиль для GeoJsonLayer и GeoJsonFeature
- Демонстрационное приложение
Введение
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 можно устанавливать стили по умолчанию для любых точек, ломаных линий и многоугольников, которые добавляются к слою. Стили по умолчанию применяются только в том случае, если вы не установили стиль для каких-либо геометрических компонентов объекта. Все изменения, выполненные для стиля по умолчанию, будут отражены во всех объектах, которые используют этот стиль.
Ниже приведены инструкции по настройке стиля по умолчанию.
- Получите соответствующий объект стиля по умолчанию. Это может быть
GeoJsonPointStyle
,GeoJsonLineStringStyle
илиGeoJsonPolygonStyle
. - Примените к стилю требуемые параметры.
Например, в приведенном ниже примере кода показано, как изменить стиль по умолчанию для точек. В результате точки станут перетаскиваемыми и у них появятся название и текстовый фрагмент.
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
, выполните следующие действия:
- Создайте нужный объект стиля (
GeoJsonPointStyle
,GeoJsonLineStringStyle
илиGeoJsonPolygonStyle
). - Примените к стилю требуемые параметры.
- Передайте объект стиля нужному методу объекта
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
демонстрационного приложения из библиотеки утилит. В руководстве по настройке рассказывается, как запустить демонстрационное приложение.