Utilidad GeoJSON para Google Maps en Android

  1. Introducción
  2. Cómo agregar un objeto GeoJsonLayer a tu mapa
  3. Cómo quitar el objeto GeoJsonLayer
  4. Cómo agregar y quitar un objeto GeoJsonFeature
  5. Cómo acceder a los objetos GeoJsonFeature y a sus propiedades
  6. Cómo aplicar ajustes de estilo a GeoJsonLayer y GeoJsonFeature
  7. 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:

  1. Recupera el objeto de estilo predeterminado relevante, que puede ser GeoJsonPointStyle, GeoJsonLineStringStyle o GeoJsonPolygonStyle.
  2. Aplica tus opciones deseadas 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 funciones individuales en la capa. Los pasos para aplicar un estilo en un objeto GeoJsonFeature son los siguientes:

  1. Crea el objeto de estilo relevante, que puede ser GeoJsonPointStyle, GeoJsonLineStringStyle o GeoJsonPolygonStyle.
  2. Aplica las opciones que desees al estilo.
  3. Pasa el objeto de estilo al método relevante en GeoJsonFeature, que será setPointStyle(), setLineStringStyle() o setPolygonStyle().

De la siguiente manera, por ejemplo, se puede personalizar el estilo de LineString para GeoJsonFeature de modo que su color sea 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.