- Introducción
- Cómo agregar un objeto GeoJsonLayer a tu mapa
- Cómo quitar el objeto GeoJsonLayer
- Cómo agregar y quitar un objeto GeoJsonFeature
- Cómo acceder a los objetos GeoJsonFeature y a sus propiedades
- Cómo aplicar ajustes de estilo a GeoJsonLayer y GeoJsonFeature
- Cómo consultar la app de demostración
Introducción
GeoJSON es una extensión del formato de datos JSON y representa datos geográficos. Con esta utilidad, puedes almacenar accidentes geográficos en formato GeoJSON y renderizarlos como una capa sobre el mapa. Para agregar tus datos de GeoJSON al mapa y quitarlos de él, llama a addLayerToMap()
y removeLayerFromMap()
respectivamente. Asimismo, puedes agregar y quitar funciones individuales si llamas a addFeature()
y removeFeature()
, y pasas un objeto GeoJsonFeature
. Si deseas acceder a las funciones, puedes llamar a getFeatures()
para obtener un elemento iterable de todos los objetos
GeoJsonFeature
que se agregaron a la capa.
También puedes configurar estilos predeterminados que deben aplicarse a las funciones antes de agregarlas a la capa. Para ello, llama a los objetos getDefaultPointStyle()
, getDefaultLineStringStyle()
o
getDefaultPolygonStyle()
y configura opciones de estilo en cada uno.
A su vez, puedes configurar el estilo para un objeto GeoJsonFeature
individual si llamas a setPointStyle()
, setLineStringStyle()
o setPolygonStyle()
en la función y pasas el objeto de estilo correspondiente.
Cómo agregar un objeto GeoJsonLayer a tu mapa
Para agregar una capa GeoJson al mapa, primero crea una instancia de una clase GeoJsonLayer. Existen dos maneras de crear una instancia de GeoJsonLayer.
Para realizar importaciones de un objeto JSONObject
, necesitarás lo siguiente:
- Un objeto
GoogleMap
en el que se renderizará la capa - Un objeto
JSONObject
que contenga los datos de GeoJSON que deben agregarse a la capa
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)
Para realizar importaciones de un archivo GeoJSON local, necesitarás lo siguiente:
- Un objeto
GoogleMap
en el que se renderizará la capa - Un archivo de recursos local que contenga los datos de GeoJSON
- Un objeto
Context
, que se necesita para abrir un archivo de recursos local
Java
GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
Kotlin
val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
Después de crear GeoJsonLayer
, llama a addLayerToMap()
para agregar los datos importados al mapa.
Java
layer.addLayerToMap();
Kotlin
layer.addLayerToMap()
Cómo quitar el objeto GeoJsonLayer
Supongamos que agregaste la siguiente capa:
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)
Para borrar el objeto GeoJsonLayer, llama a removeLayerFromMap()
.
Java
layer.removeLayerFromMap();
Kotlin
layer.removeLayerFromMap()
Cómo agregar y quitar un objeto GeoJsonFeature
En GeoJSON, una función tiene el tipo "feature". Contiene una geometría, un miembro de propiedad y, opcionalmente, un cuadro de límite o un id.
Puedes crear objetos GeoJsonFeature
de manera individual y agregarlos a GeoJsonLayer
.
Supongamos que creaste una función que contiene un punto en 0 y un 0 en una entrada de sus propiedades, y que no contiene ningún cuadro de límite.
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)
Si deseas agregar la función a la capa, llama a addFeature()
y pasa la función que deseas agregar.
Java
layer.addFeature(pointFeature);
Kotlin
layer.addFeature(pointFeature)
Si deseas quitar una función después de agregarla a la capa, llama a removeFeature()
y pasa la función para quitarla.
Java
layer.removeFeature(pointFeature);
Kotlin
layer.removeFeature(pointFeature)
Cómo acceder a los objetos GeoJsonFeature y a sus propiedades
Para acceder a todos los objetos GeoJsonFeature agregados a la capa, puedes llamar a getFeatures()
en el objeto GeoJsonLayer
que creaste. Se mostrará un elemento iterable de GeoJsonFeatures
al que puedes acceder con un bucle individual, como se indica a continuación.
Java
for (GeoJsonFeature feature : layer.getFeatures()) { // Do something to the feature }
Kotlin
for (feature in layer.features) { // Do something to the feature }
Usa los métodos hasProperty()
y getProperty()
junto con el método getFeatures()
para verificar si cada función almacenada tiene una propiedad en particular y acceder a ella si existe.
Java
if (feature.hasProperty("Ocean")) { String oceanProperty = feature.getProperty("Ocean"); }
Kotlin
if (feature.hasProperty("Ocean")) { val oceanProperty = feature.getProperty("Ocean") }
Eventos de clic de geometría de GeoJSON
Puedes utilizar GeoJsonLayer.OnFeatureClickListener()
para escuchar eventos de clic en las funciones de geometría del mapa. En el siguiente ejemplo, se registra el título de una función cuando el usuario hace clic en ella:
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")}") }
Cómo aplicar ajustes de estilo a GeoJsonLayer y GeoJsonFeature
Puedes configurar estilos predeterminados para un objeto GeoJsonLayer o aplicar ajustes de estilo a funciones individuales en la capa.
Estilos predeterminados
En un objeto GeoJsonLayer, puedes configurar estilos predeterminados para puntos, LineString y polígonos que se agregan a la capa. Los estilos predeterminados solo se aplican si la función no tiene configurado un estilo para ninguna de sus geometrías. Los cambios que realices en el estilo predeterminado también se reflejarán en todas las funciones que usen dicho estilo.
Los pasos para aplicar un estilo predeterminado son los siguientes:
- Recupera el objeto de estilo predeterminado relevante, que puede ser
GeoJsonPointStyle
,GeoJsonLineStringStyle
oGeoJsonPolygonStyle
. - Aplica las opciones que desees al estilo.
En la siguiente muestra de código, se indica cómo modificar el estilo de punto predeterminado que permitirá arrastrar puntos con un título y un fragmento.
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"
Estilos específicos de un objeto GeoJsonFeature
También puedes aplicar ajustes de estilo a componentes individuales en la capa. Los pasos para aplicar un estilo en un objeto GeoJsonFeature
son los siguientes:
- Crea el objeto de estilo relevante, que puede ser
GeoJsonPointStyle
,GeoJsonLineStringStyle
oGeoJsonPolygonStyle
. - Aplica las opciones que desees al estilo.
- Pasa el objeto de estilo al método relevante en
GeoJsonFeature
, que serásetPointStyle()
,setLineStringStyle()
osetPolygonStyle()
.
Por ejemplo, así se puede personalizar el estilo de LineString de un objeto GeoJsonFeature
para que sea de color rojo.
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
Cómo consultar la app de demostración
Para ver un ejemplo de cómo importar un archivo GeoJSON desde una URL y crear una capa a partir de este, consulta GeoJsonDemoActivity
en la app de demostración que se incluye con la biblioteca de utilidades. En la guía de configuración, se muestra cómo ejecutar la app de demostración.