可能重复:
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语法,而是实际的半径计算。
答案 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