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
0 Comentarios.