Utilidad GeoJSON para Google Maps en Android

Selecciona la plataforma: Android iOS JavaScript
  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 diseño a GeoJsonLayer y GeoJsonFeature
  7. 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:

  1. Recupera el objeto de diseño predeterminado relevante, que puede ser GeoJsonPointStyle, GeoJsonLineStringStyle o GeoJsonPolygonStyle.
  2. 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:

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

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.