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
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:
- Habilitación de la automatización OLE a través de T-SQL en SQL Server
- Publicaciones sobre automatización OLE
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
¡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

Comentários (0)
Carregando comentários…