A receita de bolo do BitchMaps (parte 2 de 3)

2 de maio de 2008

Na primeira parte desta série vimos alguns caminhos para esquadrinhar um site em busca de endereços físicos. A identificação destes endereços no meio de textos é um assunto complexo, que ficamos longe de esgotar. Mas é hora de seguir em frente, o que nos leva à…

Parte II – Geocoding

Seja através de dados alheios ou do seu próprio cadastro, você já deve ter um banco de dados de endereços físicos, e provavelmente gostaria de mostrá-los em um mapa. Antes disso isso é preciso executar um passo: transformar cada um destes endereços em coordenadas globais (latitude e longitude). Este processo é conhecido como geocoding.

Existem vários geocoders, isto é, sites que fazem esta transformação. Eles costumam permitir a transformação de uma quantidade limitada de endereços por período de tempo gratuitamente, passando a cobrar quando o volume é maior. Por conta disso, alguns vão exigir que você cadastre sua aplicação para obter uma “chave” que identificará as chamadas vindas dela. Este passo varia de site para site.

Para ter flexibilidade na escolha de um geocoder, é recomendável codificar sua aplicação de forma independente do serviço escolhido. No caso do BitchMaps foi crucial trabalhar assim, já que, embora não passe de uma experiência bem-humorada, alguns geocoders poderiam se recusar a processar os endereços devido à natureza dos mesmos.

É aí que entra o GeoKit, um plug-in para Rails que faz essa ponte entre sua aplicação e o geocoder. Ele tem várias capacidades, tais como calcular distâncias e localizar pontos dentro de um raio de distância, mas o que vamos usar mesmo é o básico: transformar um endereço textual em coordenadas globais.

Para fazer isso basta chamar a classe corespondente ao geocoder que você quer usar. Todas essas classes têm como base a classe Geocoder, portanto, se você mudar de classe no futuro, não é preciso alterar o restante do código.

O arquivo geocoders.rb contém as classes possíveis, a saber:

# * Google Geocoder - requires an API key.
# * Yahoo Geocoder - requires an API key.
# * Geocoder.us - may require authentication if performing more than the free request limit.
# * Geocoder.ca - for Canada; may require authentication as well.
# * IP Geocoder - geocodes an IP address using hostip.info's web service.
# * Multi Geocoder - provides failover for the physical location geocoders.

Digamos que você vá usar o Yahoo Geocoder (é só um exemplo – note que nem todos os geocoders funcionam em todos os países/cidades – teste com endereços gringos primeiro). Você entra no site para conseguir uma chave para a sua aplicação, abre o environment.rb e substitui a chave na linha:

GeoKit::Geocoders::yahoo = 'REPLACE_WITH_YOUR_YAHOO_KEY'

Uma vez feito isso, basta ter o endereço em mãos e chamar a biblioteca. Se o endereço for encontrado, você terá latitude e longitude (além de outras informações). No caso do BitchMaps, a chamada só é feita se o tópico ainda não estiver no banco de dados (para evitar a busca de endereços já geocodificados ou que não foram reconhecidos). E o código para buscar é tão simples quanto:

# endereco_limpo e cidade_estado foram obtidos do fórum
searched_address = endereco_limpo + " - " + cidade_estado + ", BRA"
loc = YahooGeocoder.geocode(place.searched_address)
if loc.success
  lat = loc.lat
  lng = loc.lng
  end_norm = loc.full_address
  # lat e lng contém a latitude/longitude, e end_norm o endereço "normalizado"
end

Experimente um pouco com este código (sugestão: use o console da sua aplicação), tentando diferentes endreços e geocoders. Você pode testar os pontos encontrados digitando os valores de latitude e longitude neste site.

Recomendo guardar o endereço normalizado (isto é, no formato padrão do site) no banco de dados, para ajudar em uma eventual limpeza da base no futuro. Não fiz isso no BitchMaps, mas você provavelmente vai querer: há casos em que parte do nome da rua ou o nome do bairro são confundidos com a cidades, entre outros problemas. Se você tiver o CEP, verifique o formato em que o GeoCoder o devolve no endereço normalizado e use-o – ajuda um bocado!

Foi mais fácil que capturar os endereços, não? A única ressalva é que, assim como você tomou cuidado para respeitar os limites do site, é bom prestar atenção nos limites e termos de serviço do geocoder utilizado, especialmente se a sua aplicação crescer. E em breve vem a última parte, na qual finalmente veremos um mapa com endereços. Até mais!

0 Comentários em A receita de bolo do BitchMaps (parte 2 de 3)
Comentários

Comentários


Related Posts Plugin for WordPress, Blogger...