Hola, chicos,
¿Cómo estás?

En esta publicación, demostraré cómo calcular la distancia y el tiempo entre dos puntos, ya sea ingresando el código postal, la dirección o la latitud y longitud. Para satisfacer esta necesidad, utilizaré la API de Google Maps, que realizará los cálculos, y CLR (C#) u OLE Automation para realizar solicitudes web para consultar y devolver los datos.

Luego de realizar la solicitud GET a la API de Google, los datos serán devueltos en formato XML, el cual es tratado y manipulado por la función nativa VALUE SQL Server. Para obtener más información sobre el manejo de cadenas y archivos XML, consulte la publicación SQL Server: cómo leer, importar y exportar datos desde archivos XML.

Si quieres utilizar una solución sin utilizar una API, solo con cálculos geométricos y matemáticos (especialmente útil en grandes volúmenes de datos), mira cómo en el artículo. SQL Server: cómo calcular la distancia entre dos ubicaciones usando latitud y longitud (sin API).

Es importante señalar que el cálculo sin API considera una línea recta entre los 2 puntos, mientras que la API de Google tiene en cuenta rutas y recorridos, según el medio de transporte elegido, los cuales pueden presentar valores más cercanos a los reales, según la necesidad, y muy diferentes al cálculo geométrico.

Consultar datos usando CLR

Para realizar esta consulta usando CLR (C#), simplemente use el Procedimiento almacenado stpWs_Requisicao, donde el código fuente está disponible en la publicación Realizar solicitudes POST y GET usando CLR (C#) en SQL Server.

Si no sabe o quiere saber más sobre SQLCLR (C#) en SQL Server, consulte estos 2 enlaces:

Ejemplo de uso:

DECLARE
    @Cep_Origem VARCHAR(MAX) = '29090370',
    @Cep_Destino VARCHAR(MAX) = '29101120',
    @Url VARCHAR(MAX),
    @Retorno VARCHAR(MAX),
    @Retorno_XML XML


SET @Url = 'http://maps.googleapis.com/maps/api/distancematrix/xml?origins=' + @Cep_Origem + '&destinations=' + @Cep_Destino + '&mode=driving&language=pt-BR&sensor=false'


EXEC CLR.dbo.stpWs_Requisicao
    @Ds_Url = @Url, -- nvarchar(max)
    @Ds_Metodo = N'GET', -- nvarchar(max)
    @Ds_Parametros = N'', -- nvarchar(max)
    @Ds_Codificacao = N'UTF-8', -- nvarchar(max)
    @Ds_Retorno_OUTPUT = @Retorno OUTPUT -- nvarchar(max)


SET @Retorno = REPLACE(@Retorno, '<?xml version="1.0" encoding="UTF-8"?>', '')
SET @Retorno_XML = CAST(@Retorno AS XML)


SELECT
    @Cep_Origem AS CEP_Origem,
    @Retorno_XML.value('(/DistanceMatrixResponse/origin_address)[1]', 'varchar(500)') AS Endereco_Origem,
    @Cep_Destino AS CEP_Destino,
    @Retorno_XML.value('(/DistanceMatrixResponse/destination_address)[1]', 'varchar(500)') AS Endereco_Destino,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/duration/value)[1]', 'varchar(500)') AS Qt_Duracao_Segundos,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/duration/text)[1]', 'varchar(500)') AS Qt_Duracao_Tempo,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/distance/value)[1]', 'varchar(500)') AS Qt_Distancia_Metros,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/distance/text)[1]', 'varchar(500)') AS Qt_Distancia_KM

Resultado:

Consulta de datos mediante automatización OLE

Para realizar esta consulta usando OLE Automation para realizar las solicitudes, simplemente use el objeto MSXML2.ServidorXMLHTTP.

Si no sabe o quiere saber más sobre OLE Automation en SQL Server, consulte estos 2 enlaces:

Ejemplo de uso:

DECLARE
    @Cep_Origem VARCHAR(MAX) = '29090370',
    @Cep_Destino VARCHAR(MAX) = '29101120',
    @Modo VARCHAR(50) = 'driving', -- BICYCLING | DRIVING | TRANSIT | WALKING
    @Url VARCHAR(600),
    @Retorno VARCHAR(4000),
    @Retorno_XML XML,
    @obj INT


SET @Url = 'http://maps.googleapis.com/maps/api/distancematrix/xml?origins=' + @Cep_Origem + '&destinations=' + @Cep_Destino + '&mode=' + @Modo + '&language=pt-BR&sensor=false'


EXEC sys.sp_OACreate 'MSXML2.ServerXMLHTTP', @obj OUT
EXEC sys.sp_OAMethod @obj, 'open', NULL, 'GET', @Url, FALSE
EXEC sys.sp_OAMethod @obj, 'send'
EXEC sys.sp_OAGetProperty @obj, 'responseText', @Retorno OUT
EXEC sys.sp_OADestroy @obj

SET @Retorno = REPLACE(@Retorno, '<?xml version="1.0" encoding="UTF-8"?>', '')
SET @Retorno_XML = CAST(@Retorno AS XML)

SELECT
    @Cep_Origem AS CEP_Origem,
    @Retorno_XML.value('(/DistanceMatrixResponse/origin_address)[1]', 'varchar(500)') AS Endereco_Origem,
    @Cep_Destino AS CEP_Destino,
    @Retorno_XML.value('(/DistanceMatrixResponse/destination_address)[1]', 'varchar(500)') AS Endereco_Destino,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/duration/value)[1]', 'varchar(500)') AS Qt_Duracao_Segundos,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/duration/text)[1]', 'varchar(500)') AS Qt_Duracao_Tempo,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/distance/value)[1]', 'varchar(500)') AS Qt_Distancia_Metros,
    @Retorno_XML.value('(/DistanceMatrixResponse/row/element/distance/text)[1]', 'varchar(500)') AS Qt_Distancia_KM

Resultado:

¡Eso es todo, amigos!
Espero que te haya gustado esta publicación.

¡Abrazo!

SQL Server: cómo calcular la distancia entre dos puntos calcular la distancia entre dos 2 puntos (CEP o dirección) código postal o dirección latitud longitud utilizando la API de Google

SQL Server: cómo calcular la distancia entre dos puntos calcular la distancia entre dos 2 puntos (CEP o dirección) código postal o dirección latitud longitud utilizando la API de Google