Capturar coordenadas lat & long, a partir do campo endereço

Olá amigos, tenho numa aplicação dados de endereço(tipo, nome, numero, cep, bairro), por uma necessidade da instituição far-se-á necessário a inclusão das coordenadas latitude e longitude, a minha dúvida é a seguinte:
Existe possibilidade de capturar, num campo, estas coordenadas pelos campos CEP e Número.

Desde já obrigado.

Orlando, Bom dia.
Conseguiu alguma coisa nesse sentido, estou a procura disso também.

O céu parece perto, mas não é não.

Totalmente impossível pegar coordenadas geográficas a partir do CEP, unica e exclusivamente via SC. Google disponibiliza algumas APIs que podem fazer isso, mas se a sua necessidade requer precisão então esqueça… tem que ser na munheca.

Forte abraço.

Fiz isso no projeto que faço no meu tempo livre, usei um código disponibilizado na net com a Google API.
Mais tarde posto aqui.

Grespon,

Assim que puder disponibilize… tenho um sistema de georeferenciamento, mas não consegui obter precisão com o CEP (em alguns pontos ficou MUUIITTO LONGE). Mande o seu código para eu dar uma analisada.

No aguardo.

Segue o código que eu coloquei no onBeforeInsert e onBeforeUpdate

"

//$address = {nm_bairro}.", “.{nm_cidade}.”, “.{nm_estado}.”, “.{nm_brasil};
$address = {CEP}.”,".“Brasil”;
$request_url = “http://maps.googleapis.com/maps/api/geocode/xml?address=".$address."&sensor=true”; // A URL que vc manda pro google para pegar o XML
$xml = simplexml_load_file($request_url) or die(“url not loading”);// request do XML
$status = $xml->status;// pega o status do request, já qe a API da google pode retornar vários tipos de respostas
if ($status==“OK”) {
//request returned completed time to get lat / lang for storage
$lat = $xml->result->geometry->location->lat;
$long = $xml->result->geometry->location->lng;
//echo “$lat,$long”;
{nm_lat} = $lat; // O campo latitude
{nm_long} = $long; // O campo longitude

}
if ($status=="ZERO_RESULTS") {

//indica que o geocode funcionou mas nao retornou resutados.
echo “Não Foi possível encontrar o local”;

}
if ($status=="OVER_QUERY_LIMIT") {
    //indica que sua cota diária de requests excedeu
	echo "A cota do GoogleMaps excedeu o limite diário";
}
if ($status=="REQUEST_DENIED") {
    //indica que seu request foi negado, geralmente por falta de um 'parametro de sensor?' 
	echo "Acesso Negado";
}
if ($status=="INVALID_REQUEST") {
    // geralmente indica que a query (address or latlng) está faltando.
	echo "Endereço não está preenchido corretamente";
}

"

Lembrem-se que existe uma cota diária de requisições pro geocode, por isso eu prefiro converter logo na inclusão dos dados e nunca em uma consulta por exemplo, assim pra cada registro só precisa converter uma vez.

Jovito,
Tive problema do CEP mandar lá pra longe. Por isso que eu incluí um “, Brasil”:

$address = {CEP}.",".“Brasil”;

Até agora não deu problema pra mim.

Boa tarde Crespon.
Fiz o teste aqui e ele gravou no banco de dados mysql as seguintes coordenas para o CEP 12513-070
Lat = -25.2912987
Lon = -57.6265412
Me mandou para o Paraguai, sendo que esse Cep é do Brasil cidade de Guaratinguetá, Rua Alberto Barbeta - São Dimas.
Será que fiz algo errado segue abaixo o código utilizado.

$address = {pe_cep}.",".“Brasil”;
$request_url = “http://maps.googleapis.com/maps/api/geocode/xml?address=".$address."&sensor=true”; // A URL que vc manda pro google para pegar o XML
$xml = simplexml_load_file($request_url) or die(“url not loading”);// request do XML
$status = $xml->status;// pega o status do request, já qe a API da google pode retornar vários tipos de respostas
if ($status==“OK”) {
//request returned completed time to get lat / lang for storage
$lat = $xml->result->geometry->location->lat;
$long = $xml->result->geometry->location->lng;
//echo “$lat,$long”;
{pe_latitude} = $lat; // O campo latitude
{pe_longitude} = $long; // O campo longitude

}
if ($status==“ZERO_RESULTS”) {
//indica que o geocode funcionou mas nao retornou resutados.
sc_alert(“Não Foi possível encontrar o local”);

}
if ($status==“OVER_QUERY_LIMIT”) {
//indica que sua cota diária de requests excedeu
sc_alert(“A cota do GoogleMaps excedeu o limite diário”);
}
if ($status==“REQUEST_DENIED”) {
//indica que seu request foi negado, geralmente por falta de um ‘parametro de sensor?’
sc_alert(“Acesso Negado”);
}
if ($status==“INVALID_REQUEST”) {
// geralmente indica que a query (address or latlng) está faltando.
sc_alert(“Endereço não está preenchido corretamente”);
}

Muito boa essa API do google!

Nem sempre a coisa é gritante assim… no meu caso nunca foi… a diferença ficava na casa dos 30 a 40m, tinha casos em que mudava de bairro, mas tudo perto. Porém, o simples fato de não estar correto (seja por 10 ou 100 m) já não me serve.

É, Jovito, se a diferença era pequena talvez o problema seja da própria geolocalização do Google mesmo. Na verdade o CEP não dá essa precisão mesmo. Talvez teria que usar rua e número.

Ticelso,
Bem esquisito isso. Acho que a Google API confundiu com uma rua chamada Brasil, no Paraguai com essa latidute/longitude. Talvez seja melhor incluir tb mais algum parâmetro na conversão, tipo: $address = {CEP}.", “.{UF}.”, ".“Brasil”;

Edit: Outra solução, acho que melhor ainda(Acabei de testar no Google Maps): $address = "Cep “. {CEP}.”, ".“Brasil”;

Bom dia Grespon.

Fiz os testes aqui

$address = {CEP}.", “.{UF}.”, ".“Brasil”;
e
$address = "Cep “. {CEP}.”, ".“Brasil”;

No caso do Cep: 12.513-070 não deu diferença continua indicando o Paraguai, não sei dizer o porque disso.

Ticelso,

Cara, vai por mim… se a coisa requer precisão, então esqueça, manda um sujeito pra campo, pega pelo menos uma coordenada e a partir daí calcula o resto que você precisa (vai exigir cálculo matemático largamente disponibilizado na web). A seguir faça o georeferenciamento.

Agora, se não requer tanta precisão então vai utilizando a API e verificando… caso haja diferença grande, refaz só o que estiver com problema e considera o resto correto.

Infelizmente, rapadura é doce mas não é mole não!!!

Forte abraço.

Base de Dados Completa com mais de 900 mil CEPs com Latitude, Longitude, dados IBGE e distancia até capitais.

Acesse www.mapacep.com.br

Gostaria de agradecer ao Grespon. por ter disponibilizado o código que me ajudou muito, porém como os outros colegas citaram, não dá com precisão, pois ele só está pegando o “CEP”.
Depois de muitos testes (pois sou leigo) querendo que o código pegue a localização exata (numero,rua,cidade) consegui achar uma solução

//Numero,Rua,Cidade, coloca-se de acordo com o campo que você criou.
$ende1 = urlencode(utf8_encode("{Numero}"));
$ende2 = urlencode(utf8_encode("{Rua}"));
$ende3 = urlencode(utf8_encode("{Cidade}"));
$address = {ende1}.",".{ende2}.",".{ende3};
$request_url = “http://maps.googleapis.com/maps/api/geocode/xml?address=".$address."&sensor=true”; // A URL que vc manda pro google para pegar o XML
$xml = simplexml_load_file($request_url) or die(“url not loading”);// request do XML
$status = $xml->status;// pega o status do request, já qe a API da google pode retornar vários tipos de respostas
if ($status==“OK”) {
//request returned completed time to get lat / lang for storage
$lat = $xml->result->geometry->location->lat;
$long = $xml->result->geometry->location->lng;
//echo “$lat,$long”;
{nm_lat} = $lat; // O campo latitude
{nm_long} = $long; // O campo longitude

}
if ($status=="ZERO_RESULTS") {

//indica que o geocode funcionou mas nao retornou resutados.
echo “Não Foi possível encontrar o local”;

}
if ($status=="OVER_QUERY_LIMIT") {
    //indica que sua cota diária de requests excedeu
  echo "A cota do GoogleMaps excedeu o limite diário";
}
if ($status=="REQUEST_DENIED") {
    //indica que seu request foi negado, geralmente por falta de um 'parametro de sensor?' 
  echo "Acesso Negado";
}
if ($status=="INVALID_REQUEST") {
    // geralmente indica que a query (address or latlng) está faltando.
  echo "Endereço não está preenchido corretamente";
}

Cole nos EVENTOS “onBeforeInsert” e “onAfterInsert” o mesmo código e depois fazendo a alteração dos campos correspondentes.
Sei que o post está muito antigo, mas espero que ajude outros como eu :slight_smile:

1 Curtida

Alex,

Muito bom. Obrigado por compartilhar!!

Muito obrigado pela iniciativa de compartilhar o código.
Com certeza vai ajudar em muito a todos nós.

Obrigado.