2011-12-29 68 views
9

Tôi gửi các tham số này tập lệnh của tôi: Vĩ độ: 41.0186 Kinh độ: 28.964701 (đó là mẫu). tôi muốn tìm tên địa điểm gần nhất. làm như thế nào? (Query là nơi mã phải được thay đổi)tìm vị trí gần nhất trong ms-sql

Sql Query:

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

bảng Location thích thế này: (trong thực tế, đây là bảng khổng lồ)

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

câu hỏi tốt +1 – evilone

Trả lời

4

Sử dụng chức năng này

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 

Bạn có thể đặt hàng qua chức năng này, NHƯNG trên các tập dữ liệu lớn, nó sẽ rất chậm, vì vậy hãy thử lọc trước recordset

UPD:

Sử dụng @ dữ liệu thử nghiệm chopikadze của:

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)) 

Giả sử rằng Trái Đất là không một geoid, nhưng bóng tròn, nếu bạn cần dưới 1m công thức chính xác - Tôi có thể tìm thấy nó, không có nó với me

1

Tôi nghĩ rằng đây không phải là quá dễ dàng như nó cảm thấy. Bạn phải thực hiện một số phép tính lượng giác để có được vị trí gần nhất với vị trí của bạn.

Tìm thấy thoải mái Javascript dụ:

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; 

Nó cung cấp cho bạn khoảng cách giữa các điểm.

Hoặc bạn có thể cố gắng vượt qua trong một thứ tự sắp xếp của các giá trị đồng bằng bình phương của dài và lats:

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

Lưu ý rằng tính toán hình cầu như thế này chính xác đến khoảng 10 mét trên hàng nghìn km. Nếu cần độ chính xác cao hơn, hãy sử dụng thuật toán của Vincenty hoặc 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 
Các vấn đề liên quan