PHP如何用km计算经度,纬度

时间:2012-12-19 15:52:58

标签: php mysql

  

可能重复:
  how to do location based search
  Getting similar longitude and latitude from database

我有一个约会PHP应用程序使用MySQL数据库,用户输入他们的位置,并根据它,显示其他配置文件。

cities的结构:

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

表格中的示例条目:

1 | 1 | New York | 23.20323 | 12.32356

我想选择经度和纬度分别低于23.20323 + 50 km,然后分别为23.20323 - 50km的所有城市。

这里的问题不是SQL语法,而是实际的半径计算。

3 个答案:

答案 0 :(得分:4)

您可以使用Great Circle算法执行此操作。 http://en.wikipedia.org/wiki/Great-circle_distance

这是如何找到距离。你需要解决lat2的等式。

距离=((因子*(lat2-lat1))^ 2 +(因子*(lng2 - lng1)* cos(lat2 / 57.3))^ 2)^ .5

注意:因数~69.1英里~115.1666667 for km

答案 1 :(得分:2)

看看Haversine function。这是两个纬度/经度点的球面距离计算。

答案 2 :(得分: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