Geolocalización en SQL Server

Para cierto proyecto con el que estoy, toca localizar la tienda más cercana a tu posición actual por lo que me he puesto a investigar el tipo de datos de geolocalización que tiene SQL server y que todavía no lo había usado. En vez de guardar latitud y longitud, guarda los datos en su propio formato por lo que toca transformar los valores antes de insertarlos en base de datos:


DECLARE @origen GEOGRAPHY
SET @origen = GEOGRAPHY::STPointFromText('POINT(40.455013 -3.597037)',4326)

Y para calcular la distancia entre dos puntos, solo hay que hacerlo de la siguiente forma:


DECLARE @origen GEOGRAPHY
SET @origen = GEOGRAPHY::STPointFromText('POINT(40.455013 -3.597037)',4326)
DECLARE @destino GEOGRAPHY
SET @destino = GEOGRAPHY::STPointFromText('POINT(42.341155 -7.527836)',4326)

SELECT @origen.STDistance(@destino)/1000 'Km';

Y ya como ejemplo práctico, si tenemos una tabla con los posicionamientos y queremos conocer el punto más cercano a otro dado:

-- tabla donde tenemos las distintas posiciones
DECLARE @ciudades table (
 ciudad varchar(50),
 posicion GEOGRAPHY
)

insert into @ciudades (ciudad, posicion) values 
 ('Madrid', GEOGRAPHY::STPointFromText('POINT(40.455013 -3.597037)',4326))
,('Pradomao', GEOGRAPHY::STPointFromText('POINT(42.341155 -7.527836)',4326))
,('Guadalajara', GEOGRAPHY::STPointFromText('POINT(40.655639 -3.175507)',4326))
,('Andorra', GEOGRAPHY::STPointFromText('POINT(42.585444 1.600341)',4326))

-- el origen desde donde haremos el calculo
declare @origen GEOGRAPHY
set @origen = GEOGRAPHY::STPointFromText('POINT(40.420357 -3.531518)',4326)

select ciudad, posicion.STDistance(@origen)/1000 as 'Km'
from @ciudades order by posicion.STDistance(@origen) 

O en mi caso que no tenemos el campo de geolocalización sino la longitud y la latitud:

-- tabla donde tenemos las distintas posiciones
DECLARE @ciudades table (
 ciudad varchar(50),
 longitud varchar(50),
 latitud varchar(50)
)

insert into @ciudades (ciudad, longitud, latitud) values 
 ('Madrid', '40.455013', '-3.597037')
,('Pradomao', '42.341155', '-7.527836')
,('Guadalajara', '40.655639', '-3.175507')
,('Andorra',  '42.585444', '1.600341')

-- el origen desde donde haremos el calculo
declare @origen GEOGRAPHY
set @origen = GEOGRAPHY::STPointFromText('POINT(40.420357 -3.531518)',4326)


select ciudad, geography::STPointFromText('POINT(' + CAST(longitud AS VARCHAR(20)) + ' ' + CAST(latitud AS VARCHAR(20)) + ')', 4326).STDistance(@origen)/1000 as 'Km'
from @ciudades 
order by geography::STPointFromText('POINT(' + CAST(longitud AS VARCHAR(20)) + ' ' + CAST(latitud AS VARCHAR(20)) + ')', 4326).STDistance(@origen) 

Más sencillo imposible

Dejar un comentario?

0 Comentarios.

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.