2014-01-27 48 views
1

我一直在嘗試不同的方法來加速網站上的位置搜索,我一直在從http://www.movable-type.co.uk/scripts/latlong-db.html處獲取指令。使用邊界圈距離地理標記不準確

的代碼已經針對我的表,並且輸入變量,所以我可以通過phpmyadmin運行

Select id, outcode, lat, lng, acos(sin(57.101)*sin(radians(lat)) + 
cos(57.101)*cos(radians(lat))*cos(radians(lng)-'-2.27')) * 3959 As D 
From 
    (Select id, outcode, lat, lng 
    From car_postcodes 
    WHERE 
    lat Between 52.7593142577 And 61.4426857423 
    And 
    lng Between -10.2633856968 And 5.72338569684 
    ) As FirstCut 
Where acos(sin(57.101)*sin(radians(lat)) + 
cos(57.101)*cos(radians(lat))*cos(radians(lng)-'-2.27)) * 3959 < 7000 
Order by D 

的問題是,搜索結果是從顯示的最小距離5448(哩?)遠位置,這是不正確的,因爲所有的郵編都在英國境內。 (因此「< 7000)

這是用於找到最小/最大經度&緯度的代碼:

$lat = 57.101; // latitude of centre of bounding circle in degrees 
$lon = -2.27; // longitude of centre of bounding circle in degrees 
$rad = 300; // radius of bounding circle in kilometers 

$R = 3959; // earth's mean radius, m 

// first-cut bounding box (in degrees) 
$maxLat = $lat + rad2deg($rad/$R); 
$minLat = $lat - rad2deg($rad/$R); 
// compensate for degrees longitude getting smaller with increasing latitude 
$maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat))); 
$minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat))); 

前三名結果示出:

ID  postcode  lat  lng  D  
1143 HS2   58.249 -6.468 5428.525603021315 
1142 HS1   58.213 -6.381 5432.53243648885 
1144 HS3   57.879 -6.853 5435.933627885293 

LNG & LAT列在表中存儲爲二進制,並索引。

任何意見將不勝感激。

+0

我沒有時間來幫助你,但我懷疑在度數和弧度之間存在單位問題。 –

回答

0

您可以使用:start_lat,:start_lng,:min_distance:max_distance來運行此操作,d以英里爲單位。我的代碼中沒有速度問題,但讓我知道它是如何運行的。

SELECT SQL_CALC_FOUND_ROWS 
       * 
       FROM (SELECT id, outcode, lat, lng, (3959*(2*ASIN(SQRT(POW(SIN(((car_postcodes.lat-:start_lat)*(PI()/180))/2),2)+COS(car_postcodes.lat*0.017453293)*COS(:start_lat*0.017453293)*POW(SIN(((car_postcodes.lng-:start_lgn)*(PI()/180))/2),2))))) AS d 
        FROM car_postcodes 
       WHERE 1) AS tmp_tbl 
      WHERE d <= :max_distance AND d >= :min_distance 
      ORDER BY d ASC 
+0

它運行,但我有一個類似的問題,因爲我用前面的代碼。使用AB14的示例郵政編碼,半徑在0到200英里之間,而最近的(唯一的)郵編是北愛爾蘭。 –

+0

我檢查了其他一些郵政編碼,它似乎在200英里左右。測試CV3,從某處顯示結果是斯希利島。所以至少與其一致 –