2011-09-20 36 views
6

Chúng tôi có một bảng với các địa điểm và vĩ độ và kinh độ của chúng.Khoảng cách trả về giữa hai vị trí trong SQL Server 2008 sử dụng vĩ độ và kinh độ

Chúng tôi đang cố gắng tạo một hàm trong SQL Server 2008 để liệt kê các địa điểm trong vòng 25 km tiếp theo bằng cách sử dụng vĩ độ và kinh độ cụ thể làm điểm trung tâm.

tôi đã lang thang nếu điều này là một cách tốt để bắt đầu và kiểm tra chức năng của chúng tôi và nhận được khoảng cách hiện tại giữa một điểm trung tâm (vị trí hiện tại) và địa chỉ đích (@ vĩ độ/@ vĩ độ):

ALTER FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @myCurrentLatitude float, 
    @myCurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @radiusOfTheEarth int 
    SET @radiusOfTheEarth = 6371--km 

    DECLARE @distance int 
    SELECT @distance = (@radiusOfTheEarth 
     * acos(cos(radians(@myCurrentLatitude)) 
     * cos(radians(@latitude)) 
     * cos(radians(@longitude) - radians(@myCurrentLongitude)) + sin(radians(@myCurrentLatitude)) 
     * sin(radians(@latitude)))) 

    RETURN @distance 

END 

Có đúng hay chúng ta đang thiếu gì đó?

Trả lời

11

Dường như bạn đang sử dụng công thức great-circle distance, có thể đủ chính xác cho bạn, mặc dù bạn sẽ phải là thẩm phán về điều đó.

Nếu bạn muốn kiểm tra các kết quả của công thức, bạn có thể sử dụng các loại geography dữ liệu:

declare @geo1 geography = geography::Point(@lat1, @long1, 4326), 
     @geo2 geography = geography::Point(@lat2, @long2, 4326) 

select @geo1.STDistance(@geo2) 

và kể từ khi bạn đang làm một proximity search, bạn có thể muốn điều tra các dữ liệu geography gõ thêm.

+0

4326 là gì? Tôi đã cố gắng để xem MSDN nhưng không có bất kỳ thông tin về nó. –

+0

4326 là ID tham chiếu không gian cho hệ thống tham chiếu trên thế giới. Để biết thêm thông tin, hãy xem http://technet.microsoft.com/en-us/library/bb933811.aspx http://en.wikipedia.org/wiki/SRID và http://en.wikipedia.org/wiki/WGS84 –

0

Điều này có hợp lệ không?

CREATE FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @CurrentLatitude float, 
    @CurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @geo1 geography = geography::Point(@lat1, @long1, 4268), 
      @geo2 geography = geography::Point(@lat2, @long2, 4268) 

    DECLARE @distance int 
    SELECT @distance = @geo1.STDistance(@geo2) 

    RETURN @distance 

END 

Cảm ơn!

+0

Chào mừng bạn đến với Stack Overflow! Đây thực sự là một bình luận, không phải là một câu trả lời. Với đại diện nhiều hơn một chút, [bạn sẽ có thể đăng nhận xét] (// stackoverflow.com/privileges/comment). Tôi đang gắn cờ bài đăng này để xóa. –

Các vấn đề liên quan