2011-12-22 187 views
2

我有一個帶有空間點的MySQL表,並需要計算距離。我使用Haversine公式發現了很多材料,但是所有這些都假設點之間的距離很大。就我而言,我只關心短距離(< 1英里),所以我不需要糾正地球的曲率。我的直覺是使用Haversine公式在如此小的距離上是不準確的。有什麼建議麼?計算緯度/長點之間的短距離

+1

你可能將這些條目視爲一個平面三角形,並簡單地使用正弦定律。然而,Haversine不會因爲小的或大的距離而不準確......它比假設地球是平坦的更準確。 Haversine是正弦法球形模擬的特例。 – 2011-12-22 15:10:09

回答

3

你的直覺是不正確的。考慮haversine公式,和半正矢的定義,根據維基百科(φ是緯度和ψ是經度):

haversin(d/r) = haversin(φ_2 - φ_1) + cos(φ_1) cos(φ_2) haversin(ψ_2 - ψ_1)

haversin(θ) = sin(θ/2)^2

存在進一步的事實是相關的:對於小值θ,sin θ近似等於l至θ;更相關地,它大約是線性 in θ。因此,散射角θ將近似爲(θ/2)2。當θ接近零時,這個近似變得更好

如果緯度和經度併攏,然後φ₂ - φ₁和ψ₂ - ψ₁,這是什麼樣的半正矢函數應用到這裏,將接近零的,這意味着式近似

(d/2R)2 =((φ₂ - φ₁)/ 2)2 + cos(φ₁)COS(φ₂)((ψ₂ - ψ₁)/ 2)²

現在注意,此式具有相同的形式在兩個維度上與一些任意縮放因子作爲歐幾里得距離(記住(KX)2 = ķ²X²所以我們可以進出的平方舉動常數):

ķd²= ķ₂Δφ²+ ķ₃Δψ²

最後,我斷言沒有證明這些任意縮放因子變成是相同的那些它將緯度/經度的變化轉換成線性距離。

因此,半正定公式確實是而不是對於很小的距離會變得不準確;與小距離極限下的普通歐式距離計算完全相同。

0
  1. 在 MyISAM表創建一個使用幾何數據類型的點值的點

  2. 創建這些點上空間索引

使用MBRContains()來查找值:

SELECT * 
FROM table 
WHERE MBRContains(LineFromText(CONCAT(
     '(' 
     , @lon + 10/(111.1/cos(RADIANS(@lon))) 
     , ' ' 
     , @lat + 10/111.1 
     , ',' 
     , @lon - 10/(111.1/cos(RADIANS(@lat))) 
     , ' ' 
     , @lat - 10/111.1 
     , ')') 
     ,mypoint) 

,或者,在MySQL 5.1及更高版本中:

SELECT * 
FROM table 
WHERE MBRContains 
       (
       LineString 
         (
         Point 
           (
           @lon + 10/(111.1/COS(RADIANS(@lat))), 
           @lat + 10/111.1 
           ) 
         Point 
           (
           @lon - 10/(111.1/COS(RADIANS(@lat))), 
           @lat - 10/111.1 
           ) 
         ), 
       mypoint 
       ) 

這將選擇框內大概的所有點(@lat +/- 10 km,@lon +/- 10km)。

這實際上不是一個盒子,而是一個球形矩形:球體的經度和緯度邊界部分。這可能與Franz Joseph Land上的一個簡單的矩形不同,但在大多數有人居住的地方非常接近。

應用額外的過濾選擇圓(而不是正方形)

可能適用額外的精細過濾,佔大圈距離內的一切(對大的距離)

here following solution to click

相關問題