參考文章:地理空間距離計算優化
查詢附近的點,即需要對資料庫中的點與當地點的距離排序。
1.在乙個球體上,求任意兩點a和b的距離,相當於求乙個弧長,公式為:
d = (θ / 360) * (2 * π * r) = θ * π * r / 180
注:周長是弧長的360/θ倍。
只要求出夾角θ,就能求出弧長,即求出距離。
2.然後需要將乙個點的經緯度轉換為r=1的空間座標,公式為:
x = r * cos b * cos a = cos b * cos a
y = r * cos b * sin a = cos b * sin a
z = r * sin b = sin b
注:經度和緯度的意義為,先繞x軸旋轉的度數為緯度值,再繞z軸旋轉的度數為經度值。
計算出a和b的空間座標分別為(x1, y1, z1)和(x2, y2, z2)。
3.然後再求空間兩向量的夾角,公式為:
cosθ = (oa * ob) / (|oa| * |ob|) = (x1 * x2 + y1 * y2 + z1 * z2) / (r * r) = x1 * x2 + y1 * y2 + z1 * z2
最後使用arccos求出夾角θ,那麼a和b的弧長,即距離求得。
4.但是,對於所需的距離排序,是否真的需要求出兩個點的距離?
假設θ1 < θ2,那麼θ1 * π * r / 180 < θ2 * π * r / 180,即d1 < d2。
注:這裡的r是地球半徑,並不是1。
顯然是不需要求出距離的,使用夾角排序代替距離排序。
5.接著是否需要求出兩個點代表的向量夾角?
假設cos θ1 < cos θ2,那麼arccos(cos θ1) > arccos(cos θ2),即θ1 > θ2。
注:函式y = arccos x, y∈[0, π]的單調性為減函式,證明略。
夾角也是不需要求出的,使用cos θ的排序代替夾角的排序,也間接代替了距離排序。
6.對於範圍查詢,如查詢方圓5公里內。
由於上述公式中,使用cos θ排序代替距離排序,是不能計算出範圍進行排除的。
由於已經排序好,就可以使用二分法計算,比較,排除,但sql如何實現二分法,這是乙個疑問。
有了限定範圍的數值,就可以在排序之前進行剪枝,從而減少排序時計算和比較的次數。
剪枝的方法有矩形排除,目前我還研究著是否有更有效率的剪枝方法,其中想到乙個方向,就是相加。
不過這個方法只研究在平面上,思路是這樣的,平面上任意乙個點a(x, y),那麼x + y與|oa|的關係。
我們知道x = |oa| * cos a,y = |oa| * sin a。
那麼x + y = |oa| * sina + |oa| * cos a = |oa| * √2 * sin(a - 45)。
從公式中看出,當a為45度時,sin(a - 45)取最大值即為1,x + y的最大值為|oa| * √2。
假設我要搜尋的範圍為10,那麼x + y的最大值為10 * √2,使用x + y <= 10 * √2進行前枝,把不符合該不等式的點排除。
進一步,|ab|與固定點b(a, b),任意點a(x, y)的關係,(x - a) + (y - b) <= l * √2,l是給定的已知值。
那麼x + y <= l * √2 + a + b,其中x + y可以預先計算存入資料庫,l * √2 + a + b是查詢前計算出來,這個比較的效率是非常高的。
這種假想的剪枝方法是否適用於地理範圍查詢,尚在研究中。
到這裡,不知道我的思路是否正確,因為這篇文章《地理空間距離計算優化》裡並沒有講述到,希望有人能幫我參詳一下,查了很多資料也沒查詢到。
文章只是講到了乙個計算距離的公式優化。
優化1:
對於公式cosθ = x1 * x2 + y1 * y2 + z1 * z2,要計算出夾角θ,就得計算出cosθ,由於cosθ運算比較耗時,文章給出了優化方案。
我們知道sinθ ^ 2 + cosθ ^ 2 = 1,那麼公式就變為sinθ = √(1 - (x1 * x2 + y1 * y2 + z1 * z2))。
再者,這種優化方案適用於θ角非常小的情況下,sinθ ≈ θ,即√(1 - (x1 * x2 + y1 * y2 + z1 * z2)) ≈ θ。
優化2:
這種優化方案也是適用於θ角非常小的情況下,使用平面距離公式代替球面弧長公式。
優化3:
採用多項式來擬合cos三角函式,達到消除消除cos三角函式的目的。
關於地理距離排序的其它方法,還有geohash。
這個方法就像我們的居住位址一樣,生成乙個什麼省什麼市什麼村的位址串。
如何實現按距離排序 範圍查詢
現在幾乎所有的o2o應用中都會存在 按範圍搜素 離我最近 顯示距離 等等基於位置的互動,那這樣的功能是怎麼實現的呢?本文提供的實現方式,適用於所有資料庫。實現過程主要分為四步 1.搜尋 在資料庫中搜尋出接近指定範圍內的商戶,如 搜尋出1公里範圍內的。2.過濾 搜尋出來的結果可能會存在超過1公里的,需...
11 12 如何使用地理範圍?
地理範圍即行政區劃,用於定位使用者所在城市或設施所在位置,系統已經自動實現了中國的地理範圍,如果資料庫中地理範圍為空,系統自動為使用者初始化地理範圍。命名空間 ibeam.mdaa.objects 業務物件 用法舉例 通過 取得地理範圍 gblist geographicboundarylist.g...
mysql 範圍查詢 Mysql 範圍查詢優化
1.2 另外,對於btree索引,index和乙個常量值通過 between,或者 操作符做比較 1.3 對於所有型別的index,多範圍條件通過 or and關鍵字組合形式 常量值 在之前的描述中意味著 2.1 查詢字串的常量形式 2.2 const 或者system表的一列 也只有一列 的自連線...