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