2012-02-19 44 views

回答

2

選項1: 通過切換到支持的GeoIP數據庫做數據庫的計算。

選項2: 做數據庫的計算:如果你使用MySQL,所以下面的存儲過程應該可以幫助

CREATE FUNCTION distance (latA double, lonA double, latB double, LonB double) 
    RETURNS double DETERMINISTIC 
BEGIN 
    SET @RlatA = radians(latA); 
    SET @RlonA = radians(lonA); 
    SET @RlatB = radians(latB); 
    SET @RlonB = radians(LonB); 
    SET @deltaLat = @RlatA - @RlatB; 
    SET @deltaLon = @RlonA - @RlonB; 
    SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) + 
    COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2); 
    RETURN 2 * ASIN(SQRT(@d)) * 6371.01; 
END// 

方案3: 如果你有一個指數緯度和經度,你可以通過用你選擇的腳本語言(minLat,maxLat,minLong和maxLong)計算一個初始邊界框,並將行限制爲一個子集來減少需要計算的計算次數您的條目基於(WHERE緯度BETWEEN minLat和maxLat和minLong和maxLong之間的經度)。那麼MySQL只需要執行該行子集的距離計算。

如果您使用SQL語句或存儲過程來計算距離,則SQL仍需查看數據庫中的每條記錄,並計算數據庫中每條記錄的距離,然後才能決定是否返回該行或丟棄它。 由於計算執行起來相對較慢,因此如果您可以減少需要計算的行集合,消除明顯超出所需距離的行,那麼會更好,因此我們只執行昂貴的計算爲更少的行數。

使用邊界框就像在地圖上首先繪製一個正方形,左邊,右邊,頂部和底部邊距離我們中心點的適當距離。然後我們的圈子將被繪製在該框內,圓圈上最北端,最東端,最南端和最西端的點與框的邊界接觸。有些行將落在該框之外,所以SQL甚至不打算計算這些行的距離。它僅計算落在邊界框內的那些行的距離,以查看它們是否落入圓內。

相關問題