Como buscar coordenadas de latitude e longitude via AdvPL

No artigo de hoje, vamos demonstrar em como buscar coordenadas de um ponto geográfico através de integrações com o Google Maps e Bing Maps.

Você já precisou de alguma forma, saber o ponto em latitude e longitude de um lugar? Vamos demonstrar 3 formas de como fazer isso via AdvPL.

 

Forma 1 – Usando a função TECGtCoord

Essa função, é disponível para quem utiliza o SIGATEC. Para utilizá-la é bem simples, onde você passa qual é o endereço, a cidade, o estado e o número de tentativas.

Será retornado um Array, onde a posição 1 será a latitude e a posição 2 será a longitude.

Abaixo um exemplo:

//Variáveis base
cEndereco := "Rua Gustavo Maciel"
cCidade   := "Bauru"
cEstado   := "SP"

//Aciona a função para buscar a latitude e longitude
aCoord := TECGtCoord(cEndereco, cCidade, cEstado, nTentativ)

//Se conseguiu buscar a latitude e longitude
If ! Empty(aCoord[1]) .And. ! Empty(aCoord[2])
	cLatitude  := aCoord[1]
	cLongitude := aCoord[2]
	
	//Ai aqui, você consegue usar essas variáveis
EndIf

Forma 2 – Usando integração com o Google Maps

Para usar a integração com o Google Maps, primeiro é necessário você criar uma conta corporativa e solicitar um Token de aplicativo.

Feito isso, você consegue fazer a requisição, conforme exemplo abaixo:

//Variáveis base
cEndereco := "Rua Gustavo Maciel"
cCEP      := "17010180"
cCidade   := "Bauru"
cEstado   := "SP"
cAppKey   := "XxXxXxXxXx" //Colocar seu Token aqui

//Monta o endereço completo
cEndCompl := cEndereco + " CEP " + cCep + " " + cCidade + " " + cEstado
cEndCompl := Escape(cEndCompl)

//Faz a busca do endereço no Google
cJson     := HttpGet('https://maps.googleapis.com/maps/api/geocode/json?address=' + cEndCompl + '&key=' + cAppKey)

//Transforma em um objeto JSON
jDados    := JsonObject():New()
cError    := jDados:FromJson(cJson)

//Se não houve nenhum erro
If Empty(cError)
    aResults := jDados:GetJsonObject("results")

    //Se tiver dados no Array
    If Type("aResults") == "A" .And. Len(aResults) > 0
        //Pega a informação de geometria
        jGeomet := aResults[1]:GetJsonObject("geometry")

        //Depois pega a localização
        jLocat  := jGeomet:GetJsonObject("location")

        //Ai por último busca a latitude e longitude
        nLatitude  := jLocat:GetJsonObject("lat")
	    nLongitude := jLocat:GetJsonObject("lng")
    EndIf
EndIf

Abaixo um print da requisição do Google Maps via navegador:

Exemplo de consumo do Google Maps

 

Forma 3 – Usando integração com o Bing Maps

Para usar a integração com o Bing Maps, é similar ao Google Maps, onde você precisa criar um token para depois usar na integração.

Feito isso, você consegue fazer a requisição, conforme exemplo abaixo:

//Variáveis base
cEndereco := "Rua Gustavo Maciel"
cCEP      := "17010180"
cCidade   := "Bauru"
cEstado   := "SP"
cAppKey   := "XxXxXxXxXx" //Colocar seu Token aqui

//Monta o endereço completo
cEndCompl := cEndereco + " CEP " + cCep + " " + cCidade + " " + cEstado
cEndCompl := Escape(cEndCompl)

//Faz a busca do endereço no Google
cJson     := HttpGet('http://dev.virtualearth.net/REST/v1/Locations/' + cEndCompl + '?key=' + cAppKey)

//Transforma em um objeto JSON
jDados    := JsonObject():New()
cError    := jDados:FromJson(cJson)

//Se não houve nenhum erro
If Empty(cError)
    aResources := jDados:GetJsonObject("resourceSets")
	
    //Se tiver as informações, busca o ponto e as coordenadas
    If Type("aResources[1]['resources'][1]") != "U"
        jPonto := aResources[1]['resources'][1]:GetJsonObject("point")
        aCoord := jPonto:GetJsonObject("coordinates")

        //Se for um Array, pega a latitude e longitude
        If Type("aCoord") == "A"
            nLatitude  := aCoord[1]
	        nLongitude := aCoord[2]
			
			//Ai aqui, você consegue usar essas variáveis
        EndIf
    EndIf
EndIf

Abaixo um print da requisição do Bing Maps via navegador:

Exemplo de consumo do Bing

 

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação