2011-12-29 16 views
9

Envío estos parámetros a mi script: Latitud: 41.0186 Longitud: 28.964701 (es muestra). Quiero encontrar el nombre de la ubicación más cercana. ¿como hacer esto? (Consulta es donde el código de debe ser cambiado)encuentre la ubicación más cercana en ms-sql

de consultas SQL:

SELECT Name FROM Location 
    WHERE Latitude = 41.0186 AND longitude= 28.964701 

ubicación de la tabla le gusta esto: (en bienes, esto es enorme mesa)

Latitude   longitude   Name 
41.0200500000 40.5234490000  a 
41.0185714000 37.0975924000  b 
41.0184913000 34.0373739000  c 
41.0166667000 39.5833333000  d 
41.0166667000 28.9333333000  e 
+1

buena pregunta 1 – evilone

Respuesta

4

Use esta función

CREATE FUNCTION dbo.DictanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 FLOAT) 
RETURNS FLOAT 
AS 
BEGIN 

    RETURN ACOS(SIN(PI()*@lat1/180.0)*SIN(PI()*@lat2/180.0)+COS(PI()*@lat1/180.0)*COS(PI()*@lat2/180.0)*COS(PI()*@lon2/180.0-PI()*@lon1/180.0))*6371 
END 

Usted puede ordenar por esta función, pero en grandes conjuntos de datos que será muy lenta, por lo que tratar de pre-filtrar el conjunto de registros

UPD:

Usando @ de datos de prueba de chopikadze:

declare @lat float, @lng float 
select @lat = 41.0186, @lng = 28.964701 

declare @Location table(Latitude float, Longtitude float, Name nvarchar(50)) 
insert into @Location(Latitude, Longtitude, Name) values (41.0200500000, 40.5234490000, 'a') 
insert into @Location(Latitude, Longtitude, Name) values (41.0185714000, 37.0975924000, 'b') 
insert into @Location(Latitude, Longtitude, Name) values (41.0184913000, 34.0373739000, 'c') 
insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 39.5833333000, 'd') 
insert into @Location(Latitude, Longtitude, Name) values (41.0166667000, 28.9333333000, 'e') 

SELECT ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude)) DistanceKm, * FROM @Location 
ORDER BY ABS(dbo.DictanceKM(@lat, Latitude, @lng, Longtitude)) 

Suponiendo que la Tierra no es un geoide, pero la pelota redonda, si es necesario bajo 1m fórmula exacta - puedo encontrarlo, no tiene con me

1

creo que esto no es tan fácil como se siente Debe hacer algunos cálculos de trigonometría para obtener la posición más cercana a su ubicación.

Encontrado buen ejemplo de JavaScript:

var R = 6371; // km Radius of earth 
var dLat = (lat2-lat1).toRad(); 
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
     Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
     Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c; 

Te da la distancia entre los puntos.

O puede tratar de pasar en un orden de clasificación de los valores delta cuadrados de largo y dorsales:

((<lat> - LAT_COLUMN) * (<lat> - LAT_COLUMN) + 
(<lng> - LNG_COLUMN) * (<lng> - LNG_COLUMN)) 
+0

Tenga en cuenta que los cálculos esferoide como estos tienen una precisión de unos 10 metros más de miles de km. Si se necesita una mayor precisión, use los algoritmos de Vincenty o Karney. – N8allan

1
declare @latitude float, @longitude float 
select @latitude = 41.0186, @longitude = 28.964701 

SELECT [Name] --, other columns 
     ,Distance 
     from 
     (
     select 
     [Name]  --, other columns 
     ,(3959 * acos(cos(radians(@latitude)) * cos(radians([Lattitude])) * cos(radians([Longitude]) 
     - radians(@longitude)) + sin(radians(@latitude)) * sin(radians([Lattitude])))) 
     AS Distance FROM [dbo].[Location] 
    ) as x 
    where Distance < 5 
    order by distance 
Cuestiones relacionadas