- 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 diseño a GeoJsonLayer y GeoJsonFeature
- Cómo consultar la app de demo
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. También puedes agregar y quitar componentes individuales llamando a addFeature()
y removeFeature()
, y pasando un objeto GeoJsonFeature
. Si deseas acceder a los componentes, puedes llamar a getFeatures()
para obtener un elemento iterable de todos los objetos
GeoJsonFeature
que se agregaron a la capa.
Además, puedes configurar diseños predeterminados que deben aplicarse a los componentes antes de agregarlos a la capa. Para ello, llama a los objetos getDefaultPointStyle()
, getDefaultLineStringStyle()
o
getDefaultPolygonStyle()
y configura opciones de diseño en cada uno.
Como alternativa, puedes configurar el diseño para un objeto GeoJsonFeature
individual si llamas a setPointStyle()
, setLineStringStyle()
o setPolygonStyle()
en el componente y pasas el objeto de diseño 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
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);
Para importar datos 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
Kotlin
val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
Java
GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
Después de crear GeoJsonLayer
, llama a addLayerToMap()
para agregar los datos importados al mapa.
Kotlin
layer.addLayerToMap()
Java
layer.addLayerToMap();
Cómo quitar el objeto GeoJsonLayer
Supongamos que agregaste la siguiente capa:
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);
Para borrar el objeto GeoJsonLayer, llama a removeLayerFromMap()
.
Kotlin
layer.removeLayerFromMap()
Java
layer.removeLayerFromMap();
Cómo agregar y quitar un objeto GeoJsonFeature
En GeoJSON, los componentes tienen 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 un componente que contiene un punto en 0 y un 0 en una entrada de sus propiedades, y que no incluye ningún cuadro delimitador.
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);
Para agregar el componente a la capa, llama a addFeature()
y pasa el componente que deseas agregar.
Kotlin
layer.addFeature(pointFeature)
Java
layer.addFeature(pointFeature);
Si deseas quitar un componente después de agregarlo a la capa, llama a removeFeature()
y pasa el componente para quitarlo.
Kotlin
layer.removeFeature(pointFeature)
Java
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 devolverá un elemento iterable de GeoJsonFeatures
al que puedes acceder con un bucle individual, como se indica a continuación:
Kotlin
for (feature in layer.features) { // Do something to the feature }
Java
for (GeoJsonFeature feature : layer.getFeatures()) { // Do something to the feature }
Usa los métodos hasProperty()
y getProperty()
junto con el método getFeatures()
para verificar si cada componente almacenado tiene una propiedad en particular y acceder a ella si existe.
Kotlin
if (feature.hasProperty("Ocean")) { val oceanProperty = feature.getProperty("Ocean") }
Java
if (feature.hasProperty("Ocean")) { String oceanProperty = feature.getProperty("Ocean"); }
Eventos de clic de geometría de GeoJSON
Puedes utilizar GeoJsonLayer.OnFeatureClickListener()
para escuchar eventos de clic en los componentes de geometría del mapa. En el siguiente ejemplo, se registra el título de un componente cuando el usuario hace clic en él:
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")); } });
Cómo aplicar ajustes de diseño a GeoJsonLayer y GeoJsonFeature
Puedes configurar diseños predeterminados para un objeto GeoJsonLayer o aplicar ajustes de diseño a componentes individuales en la capa.
Diseños predeterminados
En un objeto GeoJsonLayer, puedes configurar diseños predeterminados para puntos, LineString y polígonos que se agregan a la capa. Los diseños predeterminados solo se aplican si el componente no tiene configurado un diseño para ninguna de sus geometrías. Los cambios que realices en el diseño predeterminado también se reflejarán en todos los componentes que usen ese diseño.
Los pasos para aplicar un diseño predeterminado son los siguientes:
- Recupera el objeto de diseño predeterminado relevante, que puede ser
GeoJsonPointStyle
,GeoJsonLineStringStyle
oGeoJsonPolygonStyle
. - Aplica las opciones que desees al diseño.
En la siguiente muestra de código, se indica cómo modificar el diseño predeterminado de los puntos para que se puedan arrastrar y muestren un título y un fragmento.
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");
Diseños específicos de un objeto GeoJsonFeature
También puedes aplicar ajustes de diseño a componentes individuales en la capa. Los pasos para aplicar un diseño en un objeto GeoJsonFeature
son los siguientes:
- Crea el objeto de diseño relevante, que puede ser
GeoJsonPointStyle
,GeoJsonLineStringStyle
oGeoJsonPolygonStyle
. - Aplica las opciones que desees al diseño.
- Pasa el objeto de diseño al método relevante en
GeoJsonFeature
, que serásetPointStyle()
,setLineStringStyle()
osetPolygonStyle()
.
Por ejemplo, a continuación, se muestra cómo personalizar el diseño de LineString de un objeto GeoJsonFeature
para que sea de color rojo:
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);
Consulta la app de demo
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.