Desenvolvimento

2 jul, 2014

Colocando pontos no Maps usando GeoJSON criado pela Open Refine

Publicidade

Ter acesso a geo-data (dados geo-localizados) é uma coisa, esboçar rapidamente para um mapa é outra. Neste artigo, vamos ver como é possível usar o OpenRefine para obter alguns dados tabulares e exportá-los em um formato que pode ser visualizado rapidamente em um mapa interativo.

Na Escola de Dados, tentamos promover uma abordagem baseada em padrões abertos: se você inserir os seus dados em um formato padrão, é possível conectá-los diretamente em um aplicativo que outra pessoa construiu nesse padrão, confiante de que deveria “só funcionar”. Isso nem sempre é verdade, claro, mas vivemos na esperança.

No mundo dos dados geolocalizados, o padrão GeoJSON define um formato que oferece uma forma relativamente leve de representar dados associados com pontos (marcadores individuais em um mapa), linhas (linhas em um mapa) e polígonos (formas ou regiões em um mapa).

Muitos aplicativos podem ler e gravar dados nesse formato. Particularmente, o serviço gist do GitHub permite que você cole um arquivo de dados GeoJSON em um gist, que depois ele vai renderizar para você (Gist encontra GeoJSON).

geojson-1

Então, como podemos obter dados tabulares que se pareçam com isto?

geojson-2

Nos dados do GeoJSON, quais se parecem com o que está exibido abaixo?

{"features": [ {"geometry":
        { "coordinates": [ 0.124862,
               52.2033051
         ],
         "type": "Point"},
        "id": "Cambridge,UK",
        "properties": {}, "type": "Feature"
     },
    {"geometry":
         { "coordinates": [ 151.2164539,
                -33.8548157
          ],
          "type": "Point"},
        "id": "Sydney, Australia",
        "properties": {}, "type": "Feature"
    }], "type": "FeatureCollection"}

[Estamos assumindo que já tenhamos feito o geocode do local para obter as coordenadas de latitude e longitude para ele. Para aprender como fazer geocode em seus próprios dados, consulte o School of Data lessons on geocoding ou este tutorial em Geocoding Using the Google Maps Geocoder via OpenRefine].

Uma abordagem consiste em utilizar OpenRefine. Ele permite que você crie seus próprios formatos de exportação personalizados, por isso, se nós sabemos como que o GeoJSON teria que parecer (e o padrão nos diz isso), podemos criar um template para exportar os dados nesse formato.

Passos para usar o Open Refine

Localize o template de exportação que está no menu drop-down do Open Refine Export:

geojson-3

Defina o template para o nosso formato de exportação modelado. A forma como o template é aplicado consiste em criar um cabeçalho padrão (o prefixo), aplicar o template para cada linha, separando a saída modeladapara cada linha especificada por um delimitador e, em seguida, adicionar um rodapé padrão (o sufixo).

geojson-4

Uma vez que uma pessoa trabalhou na definição de template e compartilhou com uma licença aberta, o resto de nós pode copiar, reutilizar, desenvolver, melhorar e, se necessário, corrigir … 🙂 As definições de template que usei aqui são somente uma primeira tentativa e representam uma demonstração de prova de conceito.

Seria bom se OpenRefine suportasse a capacidade de salvar e importar vários arquivos de configuração de exportação de template, talvez até permitindo que sejam importados e salvos em um gist. O ideal seria que o seletor de menu permitisse que os nomes das colunas fossem selecionados a partir do arquivo de dados atual e, em seguida, usados no template.

Aqui estão as configurações de template para o template, o qual terá uma coluna denominada “Place”, uma chamada “Lat”, contendo um valor de latitude numérica, e uma chamada “Long”, contendo uma longitude numérica, e vai gerar um arquivo GeoJSON que permite que os pontos sejam processado em um mapa.

Prefixo:

{"features": [

Template de linha:

{"geometry":
       { "coordinates": [ {{cells["Long"].value}},
             {{cells["Lat"].value}}
         ],
         "type": "Point"},
       "id": {{jsonize(cells["Place"].value)}},
       "properties": {}, "type": "Feature"
    }

Separador de linha:

,

Sufixo:

], "type": "FeatureCollection"}

Essa informação do template também está disponível como um gist: OpenRefine – template do formato de exportação de pontos do GeoJSON.

Outro tipo de dados que a gente pode querer renderizar em um mapa é um conjunto de marcadores que estão ligados entre si por linhas.

Por exemplo, aqui estão alguns dados que poderiam ser vistos como descrevendo as conexões entre dois lugares que estão mencionados na mesma linha de dados:

geojson-5

O template a seguir gera um marcador local para cada nome de lugar e também uma característica de linha que conecta os dois lugares.

Prefixo:

{"features": [

Template de linha:

{"geometry":
       { "coordinates": [ {{cells["from_lon"].value}},
             {{cells["from_lat"].value}}
         ],
         "type": "Point"},
       "id": {{jsonize(cells["from"].value)}},
       "properties": {}, "type": "Feature"
   },
{"geometry":
        { "coordinates": [ {{cells["to_lon"].value}},
              {{cells["to_lat"].value}}
          ],
          "type": "Point"},
       "id": {{jsonize(cells["to"].value)}},
       "properties": {}, "type": "Feature"
   },
{"geometry": {"coordinates": 
[[{{cells["from_lon"].value}},
{{cells["from_lat"].value}}], 
[{{cells["to_lon"].value}}, {{cells["to_lat"].value}}]],
"type": "LineString"}, 
"id": null, "properties": {}, "type": "Feature"}

 

Separador de linha:

,

Sufixo:

], "type": "FeatureCollection"}

Se copiarmos a saída GeoJSON da janela de visualização, podemos colá-lo em um gist para gerar um mapa de visualização desse jeito ou então testá-lo em um verificador no formato, como GeoJSONLint:

geojson-6

Eu colei uma cópia do template OpenRefine que eu usei para gerar “as linhas conectando pontos” aqui:  OpenRefine export template: connected places geojson.

Finalmente, é importante notar que é possível definir uma forma padronizada de descrever as saídas geradas por  template geradas a partir de conjuntos de dados tabulares, as bibliotecas podem ser escritas para outras ferramentas de programação ou outras linguagens, tais como R ou Python. Essas bibliotecas poderiam ler em um arquivo de definição de template(como os gists baseados nas definições de template  de exportação OpenRefine que estão ligados a acima) e, então, como uma consequência direta oferecer suporte para conversões de formatos de dados exportados em “table2format”.

O que me faz perguntar: já existe, talvez, um padrão para a definição de formatos de exportação personalizado modelados a partir de um conjunto de dados tabulares?

***

Artigo escrito por Tony Hirst, que trabalha para a Escola de Dados moldando materiais, organizando o blog e ministrando workshops. Publicado originalmente no portal Escola de Dados: http://schoolofdata.org/2014/05/19/putting-points-on-maps-using-geojson-created-by-open-refine/