我有2个坐标。坐标1是“人”。坐标2是目的地。
如何将坐标1 100米移近坐标2?
这将用于cron作业,因此只包含php和mysql。
例如:
人在:51.26667,3.4454
目的地是:51.575001,4.83889
我如何计算人物的新坐标距离更近?
答案 0 :(得分:10)
使用Haversine计算两点之间的差异(以米为单位);然后按比例调整人物坐标的值。
$radius = 6378100; // radius of earth in meters
$latDist = $lat - $lat2;
$lngDist = $lng - $lng2;
$latDistRad = deg2rad($latDist);
$lngDistRad = deg2rad($lngDist);
$sinLatD = sin($latDistRad);
$sinLngD = sin($lngDistRad);
$cosLat1 = cos(deg2rad($lat));
$cosLat2 = cos(deg2rad($lat2));
$a = ($sinLatD/2)*($sinLatD/2) + $cosLat1*$cosLat2*($sinLngD/2)*($sinLngD/2);
if($a<0) $a = -1*$a;
$c = 2*atan2(sqrt($a), sqrt(1-$a));
$distance = $radius*$c;
喂养你的价值观:
$lat = 51.26667; // Just South of Aardenburg in Belgium
$lng = 3.45417;
$lat2 = 51.575001; // To the East of Breda in Holland
$lng2 = 4.83889;
结果为102059.82251083米,102.06公里
要调整的比率为100 / 102059.82251083 = 0.0009798174985988102859004569070625
$newLat = $lat + (($lat2 - $lat) * $ratio);
$newLng = $lng + (($lng2 - $lng) * $ratio);
给出新的纬度51.266972108109和经度3.4555267728867
答案 1 :(得分:4)
如果您了解JavaScript,可能需要查看以下Stack Overflow帖子中的moveTowards()
方法:
此方法在给定起点,终点和沿该行行进的距离时返回目标点。您可以使用点1作为起点,点2作为终点,距离为100米。它是用JavaScript编写的,但我确信它可以很容易地移植到PHP或MySQL。
您可能还想查看实现上述JavaScript实现的一部分的其他Stack Overflow帖子,作为SQL Server 2008的用户定义函数,称为func_MoveTowardsPoint
:
以上使用SQL Server 2008的内置geography
数据类型。但是,您可以轻松地使用两种decimal
数据类型代替单geography
数据类型的纬度和经度。
SQL Server和JavaScript示例均基于Chris Veness的文章Calculate distance, bearing and more between Latitude/Longitude points的实现。
答案 2 :(得分:4)
找出x轴与人之间的矢量之间的角度θ。
theta = Atan2(dest.y-person.y, dest.x-person.x).
现在使用theta和你想要的数量来计算新点。
newPoint.x = advanceDistance * cos(theta) + person.x
newPoint.y = advanceDistance * sin(theta) + person.y