sábado, 12 de março de 2011

Google Maps - Geocode pelo Endereço

Olá,

existe uma forma de retornar a Latitude/Longitude de um determinado endereço, utilizando-se a API do Google Maps, a partir do SQL Server.

No mundo real, acredito que tal aplicação não estaria dentro do banco de dados, e sim em uma aplicação CLR, porém, para ilustrar o recurso disponível no SQL, resolvi demonstrá-lo aqui.

O objeto a ser utilizado é o MSXML2.ServerXMLHttp, praticamente da mesma forma que é feito em AJAX, e é acessado através das Procedures de Automação OLE do SQL Server, e para isto, você precisa habilitar o recurso.

Testei no SQL 2005 e 2008, não sei dizer se funciona no SQL 2000.

Abstract: using the SQL Server to return the coordinates of an address at Google Maps with OLE Automation Procedures (XMLHttp GET).

Segue o código:

-- Para habilitar o uso de OLE
-- Activate OLE
sp_configure 'show advanced options', 1
go
reconfigure
go
sp_configure 'Ole Automation Procedures', 1
go
reconfigure
go

-- Variaveis
-- Variables
DECLARE @Response VARCHAR(8000)
DECLARE @XML XML
DECLARE @Obj INT
DECLARE @Result INT
DECLARE @HTTPStatus INT
DECLARE @ErrorMsg VARCHAR(MAX)
DECLARE @URL VARCHAR(MAX)
DECLARE @GPSLatitude NUMERIC(20,6)
DECLARE @GPSLongitude NUMERIC(20,6)
DECLARE @Endereco VARCHAR(100)

-- Endereco para teste
-- Test address
SELECT @Endereco = 'Av. Paulista, 500, Sao Paulo, SP'
SELECT @URL = 'http://maps.google.com/maps/api/geocode/xml?sensor=false&address=' + @Endereco

-- Criacao do objeto XMLHttp
-- Object XMLHttp creation
EXEC @Result = sp_OACreate 'MSXML2.ServerXMLHttp', @Obj OUT

-- Envio do comando GET
-- GET command
BEGIN TRY
EXEC @Result = sp_OAMethod @Obj, 'open', NULL, 'GET', @URL, false
EXEC @Result = sp_OAMethod @Obj, 'setRequestHeader', NULL,
'Content-Type', 'application/x-www-form-urlencoded'

EXEC @Result = sp_OAMethod @Obj, send, NULL, ''
EXEC @Result = sp_OAGetProperty @Obj, 'status', @HTTPStatus OUT
EXEC @Result = sp_OAGetProperty @Obj, 'responseXML.xml', @Response OUT
END TRY
BEGIN CATCH
-- Controle de Erro com bloco Try/Catch
-- Error Control
SELECT @ErrorMsg = ERROR_MESSAGE()
END CATCH

-- Destruicao do objeto
-- Object free
EXEC @Result = sp_OADestroy @Obj

-- Transformacao do resultado em XML
-- Convert result in XML Datatype
SELECT @XML = CAST(@Response AS XML)

-- Leitura dos valores desejados (latitude/longitude)
-- Gathering coordinates from XML
SELECT @GPSLatitude = @XML.value('(/GeocodeResponse/result/geometry/location/lat) [1]', 'numeric(10,6)')
SELECT @GPSLongitude = @XML.value('(/GeocodeResponse/result/geometry/location/lng) [1]', 'numeric(10,6)')

-- Exibicao dos resultados
-- Results
SELECT @GPSLatitude AS [Latitude], @GPSLongitude AS [Longitude], @XML AS [XML]
go

[]s

Péricles.
Postar um comentário