2012-12-19 52 views
1

可能重複:
how to do location based search
Getting similar longitude and latitude from databasePHP如何計算經度,緯度與公里

我有一個約會的PHP應用程序以供用戶輸入自己的位置,MySQL數據庫以及基於工作在其上顯示其他配置文件。在表

int id PK 
int country_id FK 
varchar(50) name 
float longitude 
float latitude 

示例條目:

cities結構

1 | 1 | New York | 23.20323 | 12.32356 

我要選擇具有經度和緯度小於23.20323 + 50 km所有的城市,更多的則23.20323 - 分別爲50公里。

這裏的問題不是SQL語法,而是實際的半徑計算。

+0

請參閱http://stackoverflow.com/q/13951056/50866 –

+0

經度單位的大小根據緯度而變化。越接近極點,每個度數代表的物理距離越小。 – SDC

回答

1

這應該是你在追求什麼。

//Get your base city location e.g. New York 
$base_lat = 12.32356; 
$base_lng = 23.20323; 

//Get target distance in miles 
$target_distance = 31; //50km is approx 31 miles 

//Select all cities that are closer than 50km (31 miles) 
SELECT id, (3959 * acos(cos(radians('.$base_lat.')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$base_lng.')) + sin(radians('.$base_lat.')) * sin(radians(latitude)))) AS distance 
FROM cities 
WHERE latitude IS NOT NULL 
AND longitude IS NOT NULL 
HAVING distance < $target_distance 
ORDER BY distance ASC 

//Select all cities that are further than 50km (31 miles) 
SELECT id, (3959 * acos(cos(radians('.$base_lat.')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$base_lng.')) + sin(radians('.$base_lat.')) * sin(radians(latitude)))) AS distance 
FROM cities 
WHERE latitude IS NOT NULL 
AND longitude IS NOT NULL 
HAVING distance > $target_distance 
ORDER BY distance ASC 
+0

應該這樣做,我現在要試一試。 – kudlajz

+0

它的作品,非常感謝你! – kudlajz

+0

不客氣! –

4

你可以使用大圓算法來做到這一點。 http://en.wikipedia.org/wiki/Great-circle_distance

以下是如何找到距離。你需要解出lat2的等式。

距離=((因子*(LAT2-LAT1))^ 2 +(因子*(lng2 - lng1)* COS(LAT2/57.3))^ 2)^ 0.5

注:因子〜69.1對於里程~115.1666667爲公里

+1

這是計算準確距離的正確方法。但是,除非需要精確的距離,或者計算距離超過幾百英里的距離,則可以使用此方程的更簡單形式來計算平面上的距離。 – datasage

+0

是的,這個算法是用來計算兩個long/lat-itudes之間的距離,但是如果我想要相反的話呢?用戶選擇半徑50公里,我想向他展示來自50公里範圍內所有城市的個人資料。 – kudlajz

+0

計算距離,然後求解lat2?一切都在那裏! –

相關問題