Utilitário GeoJSON do Google Maps para Android

  1. Introdução
  2. Adicionar uma GeoJsonLayer ao mapa
  3. Remover a GeoJsonLayer
  4. Adicionar e remover um GeoJsonFeature
  5. Acessar os GeoJsonFeatures e as propriedades deles
  6. Aplicar estilo à GeoJsonLayer e aos GeoJsonFeatures
  7. Ver o app de demonstração

Introdução

GeoJSON é uma extensão do formato de dados JSON e representa dados geográficos. O uso desse utilitário permite armazenar componentes geográficos no formato GeoJSON e renderizá-los como uma camada sobre o mapa. Para adicionar e remover dados GeoJSON do mapa, chame addLayerToMap() e removeLayerFromMap(), respectivamente. Da mesma forma, é possível adicionar e remover recursos individuais chamando addFeature() e removeFeature() e transmitindo um objeto GeoJsonFeature. Se você quiser acessar os recursos, chame getFeatures() para receber um iterável de todos os objetos GeoJsonFeature que foram adicionados à camada.

Também é possível definir estilos padrão para aplicação a recursos antes de adicioná-los à camada chamando getDefaultPointStyle(), getDefaultLineStringStyle() ou getDefaultPolygonStyle() e definindo opções de estilo individualmente. Como alternativa, você pode definir o estilo de um GeoJsonFeature específico chamando setPointStyle(), setLineStringStyle() ou setPolygonStyle() no recurso e passando o objeto de estilo relevante.

Adicionar uma GeoJsonLayer ao mapa

Para adicionar uma camada do GeoJson ao mapa, primeiro crie uma instância da classe GeoJsonLayer. Há duas formas de instanciar a GeoJsonLayer.

Para importar de um JSONObject, você precisa do seguinte:

  • Objeto GoogleMap em que a camada será renderizada
  • JSONObject contendo os dados GeoJSON a serem adicionados à camada.

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 importá-la de um arquivo GeoJSON local, são necessários:

  • Objeto GoogleMap em que a camada será renderizada
  • Arquivo de recursos local contendo os dados GeoJSON
  • O objeto Context, que é necessário para abrir um arquivo de recurso local.

Java

GeoJsonLayer layer = new GeoJsonLayer(map, R.raw.geojson_file, context);
      

Kotlin

val layer = GeoJsonLayer(map, R.raw.geojson_file, context)
      

Depois de criar o GeoJsonLayer, chame addLayerToMap() para adicionar os dados importados ao mapa:

Java

layer.addLayerToMap();
      

Kotlin

layer.addLayerToMap()
      

Remover a GeoJsonLayer

Vamos supor que você adicionou esta camada

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 limpar a GeoJsonLayer, chame removeLayerFromMap().

Java

layer.removeLayerFromMap();
      

Kotlin

layer.removeLayerFromMap()
      

Adicionar e remover um GeoJsonFeature

No GeoJSON, um recurso tem o tipo "feature". Ele contém uma geometria, um membro de propriedade e, opcionalmente, uma caixa delimitadora ou um ID.

Você pode criar objetos GeoJsonFeature individualmente e adicioná-los ao GeoJsonLayer.

Vamos supor que você criou um recurso contendo um ponto em 0, 0 com uma entrada nas suas propriedades e sem caixa delimitadora.

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)
      

Para adicionar o recurso à camada, chame addFeature() e passe o recurso.

Java

layer.addFeature(pointFeature);
      

Kotlin

layer.addFeature(pointFeature)
      

Para remover um recurso após adicioná-lo à camada, chame removeFeature() e passe o recurso.

Java

layer.removeFeature(pointFeature);
      

Kotlin

layer.removeFeature(pointFeature)
      

Acessar os GeoJsonFeatures e as propriedades deles

Para acessar todos os GeoJsonFeatures que foram adicionados à camada, chame getFeatures() no GeoJsonLayer que você criou. Isso retornará um iterável de GeoJsonFeatures, que pode ser acessado usando um loop for-each, como mostrado a seguir.

Java

for (GeoJsonFeature feature : layer.getFeatures()) {
    // Do something to the feature
}
      

Kotlin

for (feature in layer.features) {
    // Do something to the feature
}
      

Use os métodos hasProperty() e getProperty() junto com getFeatures() para verificar se cada recurso armazenado tem uma propriedade específica e acesse-o se ele existir.

Java

if (feature.hasProperty("Ocean")) {
    String oceanProperty = feature.getProperty("Ocean");
}
      

Kotlin

if (feature.hasProperty("Ocean")) {
    val oceanProperty = feature.getProperty("Ocean")
}
      

Eventos de clique de geometria GeoJSON

É possível usar GeoJsonLayer.OnFeatureClickListener() para ouvir os eventos de cliques nos recursos de geometria no mapa. O exemplo a seguir registra o título de um recurso quando o usuário clica nele:

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")}")
}
      

Aplicar estilo à GeoJsonLayer e aos GeoJsonFeatures

Você pode definir estilos padrão a uma GeoJsonLayer ou a recursos individuais na camada.

Estilos padrão

Em uma GeoJsonLayer, é possível definir estilos padrão para qualquer ponto, LineString e polígono adicionado à camada. Os estilos padrão serão aplicados apenas se o recurso não tiver um estilo definido para nenhuma das geometrias dele. Todas as alterações feitas no estilo padrão serão também aplicadas aos recursos que usam o estilo padrão.

Veja a seguir as etapas a serem aplicadas a um estilo padrão

  1. Recupere o objeto de estilo padrão relevante, que pode ser GeoJsonPointStyle, GeoJsonLineStringStyle ou GeoJsonPolygonStyle.
  2. Aplique as opções desejadas ao estilo.

Por exemplo, o exemplo de código a seguir mostra como modificar o estilo de ponto padrão para tornar os pontos arrastáveis com um título e um 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 um GeoJsonFeature

Como alternativa, você pode aplicar estilo a recursos individuais na camada. As etapas para aplicar um estilo em um GeoJsonFeature, da seguinte maneira:

  1. Crie o objeto de estilo relevante. Ele pode ser GeoJsonPointStyle, GeoJsonLineStringStyle ou GeoJsonPolygonStyle.
  2. Aplique as opções desejadas ao estilo
  3. Transmita o objeto de estilo para o método relevante no GeoJsonFeature, que será setPointStyle(), setLineStringStyle() ou setPolygonStyle()

Por exemplo, é assim que se personaliza o estilo LineString de um GeoJsonFeature para que a cor dele seja vermelha.

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
      

Ver o app de demonstração

Para ver um exemplo de como importar um arquivo GeoJSON de um URL e criar uma camada com ele, confira GeoJsonDemoActivity no app de demonstração que acompanha a biblioteca de utilitários. O guia de configuração mostra como executá-lo.