APIs e Microsserviços

8 jan, 2014

Geocoding no Google Docs: limites GeoJSON com Koordinates

Publicidade

geojson-1

Em nossa receita de geocoding, você aprendeu a usar fórmulas do Google Sheets para converter automaticamente os nomes de locais em coordenadas em dados de sua planilha. Neste artigo, você vai aprender a levar a geocoding um passo adiante, convertendo coordenadas em limites GeoJSON – descrições legíveis por máquina dos limites das regiões geográficas, como países ou províncias usando a API Koordinates. A API Koordinates pega coordenadas de latitude e longitude e retorna marcações de fronteira que estão nas coordenadas ou perto delas.

Na receita de geocoding, você usou funções embutidas como ImportXML, CONCATENATE e JOIN para obter as coordenadas de nomes de lugares através de fórmulas como esta:

=JOIN(",", ImportXML(CONCATENATE("http://open.mapquestapi.com/nominatim/v1/search?format=xml&q=",A2), "//place[1]/@lat | //place[1]/@lon"))

Essa fórmula é possível porque a API MapQuest utilizado nesse artigo retorna dados XML, que você pode consultar usando strings XPath como / //place[1]/@lat com a função embutida ImportXML.

Mas Koordinates, a API de dados geoespaciais que estamos usando neste artigo, retorna os resultados em JSON em vez de em XML, e o Google Docs não tem nenhuma das funções embutidas para atravessar objetos JSON. Por isso nós vamos ter que definir o nosso próprio.

Para começar, você precisa criar uma conta com Koordinates e obter uma chave de API. Para criar uma chave, faça o login, clique no seu nome na parte superior da página, selecione APIs e Web Services e, em seguida, clique em Aceitar termos e criar chave. Faça uma cópia da chave que é gerada, pois você poderá usá-la em breve.

Agora vá para sua planilha, acesse o menu Ferramentas e selecione editor Script. Clique em Fechar para se livrar da caixa de diálogo que aparece. Assim que estiver no editor de script , exclua o texto da caixa de edição e salve o arquivo, dando-lhe um nome memorável (talvez Koordinates API function).

Agora digite o seguinte na caixa de edição vazia, inserindo sua chave API no local indicado:

function koords (coordsString) {
 /* Block 1. Formats lat-long coordinates for Koordinates API call. */ 
 coordsString = coordsString.replace(/\s/, "") ;
 var coords = coordsString.split(",") ;
 var xy = "&x=" + coords[1] + "&y=" + coords[0] ;

 /* Block 2. Formats API call, makes API call, parses the result, 
    and stores the resulting object in "json". */
 var key = "YOUR API KEY GOES HERE, INSIDE THESE QUOTATION MARKS" ; 
 var url = "http://api.koordinates.com/api/vectorQuery.json/?key=" + key + "&layer=1103&geometry=true" ; 
 var data = UrlFetchApp.fetch(url + xy) ;
 var text = data.getContentText() ;
 var json = JSON.parse(text) ;

 /* Block 3. Traverses "json" to find boundary data and returns it. */ var result = json["vectorQuery"]["layers"]["1103"]["features"][0]["geometry"] ; return JSON.stringify(result) ; 

} ;

Vamos passar bloco por bloco desse código.

O primeiro bloco de código converte uma representação de strings de latitude-longitude para o formato que o Koordinates espera, com a longitude em primeiro lugar. Ele joga fora todos os espaços na string (replace), divide a string no caractere “,” e cola novamente na ordem inversa. Ele também o recebe configurado para ser inserido na chamada API Koordinates, colocando o valor de longitude após “&y=” e a longitude depois de “&x=” .

O próximo bloco configura a URL para a chamada de API e, em seguida, faz a chamada. Ele pede uma camada do mapa 1103, que é uma camada para os limites do país. Também solicita “geometria”, que significa polígonos reais (em vez de apenas metadados, o padrão). A string JSON resultante é analisada em um objeto JavaScript com JSON.parse e colocada na variável jason.

O JSON retornado pela API se parece com isto:

geojson-2

O polígono de conteúdo que queremos, a “geometry”, está enterrada afastada e profundamente dentro do objeto. Para chegar a ela, é preciso cavar através de várias camadas de atributos. Isso é o que o último bloco de código faz, pegando a “geometry” no primeiro item (número do item 0) na lista de “features” de objetos de mapa voltada para a consulta. Ele também transforma o resultado em uma string com JSON.stringify e retorna como o valor da função.

Tente chamar a sua nova função personalizada, dando-lhe o nome de uma célula que contém coordenadas latitude-longitude (aqui, F4):

=koords(F4)

Você deve receber em troca uma blob de dados JSON – a rica representação geométrica do país que contém o ponto em F4.

Agora você pode usar koords como uma função comum do Google Apps. Por exemplo, você pode empacotar a fórmula da lição anterior para criar uma nova fórmula que vai direto a partir de nomes de lugares aos limites GeoJSON .

=koords(JOIN(",", ImportXML(CONCATENATE("http://open.mapquestapi.com/nominatim/v1/search?format=xml&q=",A2), "//place[1]/@lat | //place[1]/@lon")))

Neste exemplo, usamos a camada de mapa 1103, que contém os limites do país. Mas Koordinates tem muitas outras camadas que você pode achar útil. Confira a lista de camadas para ver o que mais você pode fazer com a API Koordinates.

***

Artigo escrito por Neil Ashton, linguista computacional e editor do blog School of Data. Publicado originalmente no portal Escola de Dados – http://schoolofdata.org/2013/10/31/geocoding-geojson-boundaries-koordinates/