1

可能重复:
如何进行基于位置的搜索
从数据库中获取相似的经度和纬度

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

表结构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 公里,大于 23.20323 - 50 公里的城市。

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

4

3 回答 3

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 公里

于 2012-12-19T15:57:33.710 回答
2

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

于 2012-12-19T15:57:45.160 回答
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
于 2012-12-19T16:05:44.060 回答