2011-06-05 21 views
2

我需要找到我周圍的廁所內50KM說,我有經緯度的期限我的位置,在數據庫廁所的樣子:SQL選擇:某個位置50KM以內的廁所?

Toilet ID (primary) 
Address 
Latitude 
Longitude 

my location: my_lat, my_lon 

是有可能構建一個返回所有廁所聲明在(my_lat,my_lon)的50KM範圍內?類似於

select * from ToiletTable where 
    SQRT((Latitude - my_lat)^2 + (Longitude - my_lon)^2) < 50 

謝謝!

+0

HTTP ://johndyer.name/post/LatitudeLongitude-Distance-Calculation-in-SQL-Server.aspx? – Rich 2011-06-05 07:24:40

+3

如果他只是以「請!我絕望!」結束這個問題! – 2011-06-05 07:25:39

+0

[用SQLite計算大圓距離]的可能重複(http://stackoverflow.com/questions/2083182/calculating-great-circle-distance-with-sqlite) – 2011-06-05 08:34:43

回答

0

假設你在極地或太平洋地區卻沒有,我會使用:

where pow(2*(latitude - ?), 2) + pow(longitude - ?, 2) < distance 
1

您正在尋找Haversine formula

這裏有兩個完整的實現,一個在SQL:Haversine Implementation

編輯:

Here's a Haversine implementation of a UDF in SQLite。不幸的是,它不利於iPhone,但至少你有你需要的確切實現。現在你只需要確定如何將其插入

SQL內聯下面

CREATE FUNCTION [dbo].[GetDistance] 

(
    @lat1 Float(8), 
    @long1 Float(8), 
    @lat2 Float(8), 
    @long2 Float(8) 
) 
RETURNS Float(8) 
AS 
BEGIN 
    DECLARE @R Float(8); 
    DECLARE @dLat Float(8); 
    DECLARE @dLon Float(8); 
    DECLARE @a Float(8); 
    DECLARE @c Float(8); 
    DECLARE @d Float(8); 
    SET @R = 6371; --This value is 6371 for kilometers, 3960 for miles. 
    SET @dLat = RADIANS(@lat2 - @lat1); 
    SET @dLon = RADIANS(@long2 - @long1); 
    SET @a = SIN(@dLat/2) * SIN(@dLat/2) + COS(RADIANS(@lat1)) 
        * COS(RADIANS(@lat2)) * SIN(@dLon/2) * SIN(@dLon/2); 
    SET @c = 2 * ASIN(MIN(SQRT(@a))); 
    SET @d = @R * @c; 
    RETURN @d; 
END 
GO 
+0

感謝您的回覆,問題是,我正在使用Android中的SQLite數據庫(即文件),所以我不知道除了數據庫之外是否還可以創建自己的函數。另外,即使使用該函數,我如何構建SQL語句? – hzxu 2011-06-05 07:30:30

+0

此鏈接爲Android開發和Haversine提供了一些信息。它可能會讓你指向正確的方向。 http://devdiscoveries.wordpress.com/2010/02/01/android-distance-between-two-points-on-the-earth/ – Khepri 2011-06-05 07:37:34

相關問題