PHP如何用公里计算经度、纬度

PHP如何用公里计算经度、纬度,php,mysql,Php,Mysql,可能重复: 我有一个使用MySQL数据库的约会PHP应用程序,用户在其中输入他们的位置,并根据它显示其他配置文件 表城市的结构: 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公里的所有城市 这里的问题不是SQ

可能重复:

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

城市的结构

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语法,而是实际的半径计算。

您可以使用大圆算法来实现这一点

下面是如何找到距离。你需要解lat2的方程

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


注意:系数69.1表示英里,系数115.1666667表示公里,您可以使用大圆算法进行此操作

下面是如何找到距离。你需要解lat2的方程

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


注意:系数69.1表示英里,系数115.1666667表示公里。这是两个纬度/经度点的球面距离计算。

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

这应该是您想要的

//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
//获取您的基地城市位置,例如纽约
$base_lat=12.32356;
$base_lng=23.20323;
//以英里为单位获取目标距离
$target_distance=31//50公里约31英里
//选择距离小于50公里(31英里)的所有城市
选择id,(3959*acos(弧度('.$base_-lat'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('.$base_-lng'))+sin(弧度('.$base_-lat'))*sin(弧度(纬度)))作为距离
来自城市
其中纬度不为空
经度不是空的
距离小于目标距离
按距离订购ASC
//选择超过50公里(31英里)的所有城市
选择id,(3959*acos(弧度('.$base_-lat'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('.$base_-lng'))+sin(弧度('.$base_-lat'))*sin(弧度(纬度)))作为距离
来自城市
其中纬度不为空
经度不是空的
距离>目标距离
按距离订购ASC

这应该是你想要的

//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
//获取您的基地城市位置,例如纽约
$base_lat=12.32356;
$base_lng=23.20323;
//以英里为单位获取目标距离
$target_distance=31//50公里约31英里
//选择距离小于50公里(31英里)的所有城市
选择id,(3959*acos(弧度('.$base_-lat'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('.$base_-lng'))+sin(弧度('.$base_-lat'))*sin(弧度(纬度)))作为距离
来自城市
其中纬度不为空
经度不是空的
距离小于目标距离
按距离订购ASC
//选择超过50公里(31英里)的所有城市
选择id,(3959*acos(弧度('.$base_-lat'))*cos(弧度(纬度))*cos(弧度(经度)-弧度('.$base_-lng'))+sin(弧度('.$base_-lat'))*sin(弧度(纬度)))作为距离
来自城市
其中纬度不为空
经度不是空的
距离>目标距离
按距离订购ASC

请参见经度单位的大小随纬度的不同而变化。两极越近,每度所代表的物理距离就越小。请看,经度单位的大小随纬度的不同而不同。极点越近,每度所代表的物理距离就越小。这是计算精确距离的正确方法。但是,除非你需要精确的距离,或者你要计算超过几百英里的距离,你可以使用这个方程的一个简单形式来计算平面上的距离。是的,这个算法用于计算两个长/纬度之间的距离,但是如果我想要相反的结果呢?用户选择50公里的半径,我想向他展示50公里半径内所有城市的概况。计算距离,然后求解lat2?一切都在那里!这是计算精确距离的正确方法。但是,除非你需要精确的距离,或者你要计算超过几百英里的距离,你可以使用这个方程的一个简单形式来计算平面上的距离。是的,这个算法用于计算两个长/纬度之间的距离,但是如果我想要相反的结果呢?用户选择50公里的半径,我想向他展示50公里半径内所有城市的概况。计算距离,然后求解lat2?一切都在那里!应该可以了,我现在要试试。它很有效,非常感谢!只是有一点小错误,用have代替WHERE和distance。好点,已经更新了。应该可以了,我现在就去试试。很有效,非常感谢!只有一点小错误,用有代替何处与距离。好点,有更新。