2014-02-18 67 views
0

我對使用MySql的空間sql查詢有疑問, 我有一張桌子,上面有經度和緯度的圓柱; 我想用我的距離(半徑)得到我的地理位置最近的所有點。 我嘗試此查詢:使用MySQL查找距離的點數

SELECT 
    id, (
     6371 * acos (
     cos (radians(78.3232)) 
     * cos(radians(lat)) 
     * cos(radians(lng) - radians(65.3234)) 
     + sin (radians(78.3232)) 
     * sin(radians(lat)) 
    ) 
) AS distance 
FROM markers 
HAVING distance < 30 
ORDER BY distance 
LIMIT 0 , 20; 
  • 這是查詢有關性能的好辦法?
  • 如果我考慮一個包含點的正方形,我該如何更改此查詢?最好是使用正方形?
+0

它足夠我[見](http://daviestrachan.co.uk/maps/stationmap8a.php)3K mysql數據庫 –

回答

0

我不能在MySQL的性能問題發言,但在SQL Server的同一問題工作時,我簡單地驗證爲LatLongWHERE條快速構建基於我distance比我可以限制結果一箱在邊界內。此時它變成簡單的算術比較。當我縮小結果的數量後,我從原始點檢查Distance

首先構建一個盒子的關鍵是減少涉及複雜數學計算的記錄數量。

這是我從SQL Server的例子。原

DECLARE @Lat DECIMAL(20, 13) = 35.7862 
    ,@Long DECIMAL(20, 13) = -80.3095 
    ,@Radius DECIMAL(7, 2) = 5 
    ,@Distance DECIMAL(10, 2) 
    ,@Earth_Radius INT = 6371000; 

SET @Distance = @Radius * 1609.344; 

DECLARE @NorthLat DECIMAL(20, 13) = @Lat + DEGREES(@distance/@Earth_Radius) 
    ,@SouthLat DECIMAL(20, 13) = @Lat - DEGREES(@distance/@Earth_Radius) 
    ,@EastLong DECIMAL(20, 13) = @Long + DEGREES(@distance/@Earth_Radius/COS(RADIANS(@Lat))) 
    ,@WestLong DECIMAL(20, 13) = @Long - DEGREES(@distance/@Earth_Radius/COS(RADIANS(@Lat))); 

SELECT * 
    FROM CustomerPosition AS cp 
    WHERE (
      cp.Lat >= @SouthLat 
      AND cp.Lat <= @NorthLat) 
     AND (
       cp.Long >= @WestLong 
       AND cp.Long <= @EastLong) 

結果選擇我把它存儲到臨時表和比對其進行評估,以確定哪些實際Within指定的距離。