Usando GeoIP e Google Maps



Essa dica é pra quem, por algum motivo, gostaria de obter informações sobre a localização dos usuários que acessam seu site. E para completar, vamos usar esse informação para exibir a posição do usuário do Google Maps.

Obter esse tipo de informação é interessante quando temos, por exemplo, um site em vários idiomas. Podemos escolher automaticamente o idioma do visitante com base na sua localização. Outro motivo pelo qual muitos utilizam esse tipo de localização é para exibir propaganda de produtos que sejam do interesse do usuário por estar perto: por exemplo, o SmartAd, do MercadoLivre, exibe produtos que estejam próximos ao usuário e consequentemente, com o frete menor.

Mas como é possível saber de onde o usuário está acessando meu site?

.

Dados sobre o seu IP (78.51.30.54)
 
Código do País
DE
Nome do País
Germany
Estado
05
Cidade
Frankfurt Am Main
CEP
Latitude
50.1167
Longitude
8.6833

Não se preocupem. Saber exatamente de onde o usuário está acessando seu site (ou saber de onde você está acessando o site dos outros) ainda não é possível assim, com tanta exatidão. O que podemos fazer é descobrir, aproximadamente, onde está o provedor de Internet que o usuário utiliza para acessar a rede. Para tanto, vamos utilizar o protocolo GeoIP.

Todo mundo que se conecta à Internet tem um IP (número de identificação na pilha de protocolos TCP/IP. O seu por exemplo é: 78.51.30.54 ). Como você deve imaginar, existem poucos números de IP possíveis (comparado ao imenso número de computadores no mundo), por isso eles são mal divididos pelas organizações competentes, como a IANA e a LACNIC. Cada país pode usar uma determinada faixa de IP, e é assim que o GeoIP descobre, por exemplo, o seu país: verifica em que faixa de IP o seu endereço se encaixa. Vocês podem até ver o que o GeoIP “sabe” sobre vocês clicando aqui.

Então, vamos ao que interessa (finalmente!).

Utilizando a Biblioteca GeoIP e o Banco de Dados de Localização

Nós vamos utilizar o biblioteca GeoIP da MaxMind, que possui uma versão freeware. A biblioteca é a mesma para versão grátis e para a versão paga. A diferença está no banco de dados de localizações. A versão paga do banco só “promete” apresentar dados mais precisos, mas para nossos propósitos, a versão grátis já resolve.

Instalando a Biblioteca

Nós que ainda não somos provedores de nossos próprios sites, necessitaremos instalar a biblioteca utilizando o PEAR. Na página administrativa do seu site (provavelmente o CPANEL), você irá encontrar na categoria “Software / Services” a opção “PHP PEAR Packages“. É só clicar, digitar “geoip” no campo “Search” e pedir para buscar. Ele deverá encontrar um pacote chamado “Net_GeoIP“. É esse mesmo que queremos! Basta pedir para instalar.

Neste exemplo, eu instalei a biblioteca pelo método acima, e a mesma foi colocada em /home/maurilio/php/Net/GeoIP.php.

Já se você tem acesso direto ao servidor, e deseja instalar a biblioteca de outra maneira, pode olhar aqui vários outros métodos de instalação.

Instalando a Base de Dados de Localização

Como eu disse antes, a diferença entre a versão gratuita e a paga é a base de dados. E nas gratuitas, ainda existem dois tipos: a base dos países, que lhe dará a informação apenas do país e a base das cidades, que lhe informará, além do país, o estado e a cidade (dependendo do lugar). Nesse exemplo, vamos usar a base de dados gratuita de cidades, o GeoLiteCity.

Para instalar, basta baixar o arquivo de dados (17 MB aproximadamente) e colocá-lo no seu servidor. De preferência, coloque em uma pasta que não possa ser acessada pela web (fora da pasta “public_html”, por exemplo). No meu exemplo, a base de dados está em /home/maurilio/php/Net/GeoIP/GeoLiteCity.dat.

Utilizando a biblioteca GeoIP

Basta seguir o exemplo:

<?php require_once("'/home/maurilio/php/Net/GeoIP.php");
    $geoip = Net_GeoIP::getInstance('/home/maurilio/php/Net/GeoIP/GeoLiteCity.dat');
    try {
        $location = $geoip->lookupLocation($_SERVER['REMOTE_ADDR']);
    } catch (Exception $e) {
        die("Erro: Falha ao localizar a pessoa pelo IP.");
    }
    //exibindo valores na tela (quando estivermos utilizando o Google Maps, não vamos usar
    //estas duas linhas a seguir.
    echo "<br />Sua Latitude é: ".$location->latitude;
    echo "<br />Sua Longitude é: ".$location->longitude;
?> 

Mais detalhes sobre todos os atributos de $location, você pode encontrar na documentação do Net_GeoIP.

Nós vamos usar dois atributos da variável $location: a latitude e a logintude.

Usando o Google Maps: adiquirindo uma chave

Agora para usar o Google Maps API é necessário adiquirir uma chave (um código que vai identificar seu site e permitir que ele utilize o sistema. Cada site precisa de uma chave diferente). Para adiquirir essa chave é só entrar no site do Google Maps e requisitar uma. É grátis e a chave é fornecida na hora.

Uma vez adiquirida a chave, basta adicionar o script do Google Maps API na nossa página, como no exemplo (lembrando que você deve substituir o texto “SUA_CHAVE_AQUI” pela sua chave do Google Maps API):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="pt-BR">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAA5cC-CgjxS54p2O7rOn1lbBSRQKFJjaqbfu0v61A0zFD0baA7vRTSRjhn-tiZLjkohnFuNNNRJyF6Gw" type="text/javascript"></script>
<script type="text/javascript">
	function iniciar() {
		if (GBrowserIsCompatible()) {
			var map = new GMap2(document.getElementById("map_canvas"));
			map.setCenter(new GLatLng(<?php echo $location->latitude;?>,<?php echo $location->longitude;?>), 6);
			map.addControl(new GLargeMapControl());
			var mapControl = new GMapTypeControl();
			map.addControl(mapControl);
			map.openInfoWindow(map.getCenter(), document.createTextNode("Seu IP sugere que você esteja aqui!"));
		}
	}
	old = window.onload;
	window.onload = function() { if (old != null) old(); iniciar();};
</script>
</head>
<body>
<center>
<div id="map_canvas" style="border: 1px solid #c0c0c0; width: 590px; height: 300px; margin-bottom: 20px;">.</div>
</center>
</body>
</html>

Prente atenção na linha 29: GLatLng recebe dois parâmetros: a latitude e a logintude. É aí que usamos o GeoIP: <?echo $location->latitude;?>, <?echo $location->longitude;?>. O parâmetro “6”, da função setCenter, é o nível de zoom.

Caso precise, aqui vai os links da documentação do Google Maps API:

  1. Conceitos do Google Maps
  2. Referência da API (todas as funções e o que fazem)
  3. Exemplos (nada melhor que exemplos, não é?)

Espero que essa dica seja útil. O artigo ficou grande, mas ainda faltou alguns detalhes. Caso se mostre necessário, eu acrescento depois com alguns updates, tá certo?

[UPDATE]
Pessoal, como mudei muito o blog, o exemplo tinha parado de funcionar (problemas com o jQuery: muitos plugins carregam seu próprio jQuery, e um monte junto, com versões diferentes, já viu né). Então modifiquei o código, para não usar mais. Também deixei o arquivo de exemplo online aqui. Tenho novidades sobre esse assunto, espero postar em breve, se Deus quiser… se vocês tiverem alguma dúvida podem dividi-la comigo… talvez não a resolva, mas ficarei noites tentando.. hehehe.. Abraços.
[/UPDATE]

Sobre maverick