如何用坐标移动标记100米

时间:2010-06-18 21:50:26

标签: php mysql google-maps geolocation coordinates

我有2个坐标。坐标1是“人”。坐标2是目的地。

如何将坐标1 100米移近坐标2?

这将用于cron作业,因此只包含php和mysql。

例如:

  

人在:51.26667,3.4454

     

目的地是:51.575001,4.83889

我如何计算人物的新坐标距离更近?

3 个答案:

答案 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