【问题标题】:How to move a marker 100 meters with coordinates如何使用坐标将标记移动 100 米
【发布时间】:2011-03-05 15:15:41
【问题描述】:

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

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

这将用于 cron 作业,因此仅包括 php 和 mysql。

例如:

联系人在:51.26667, 3.45417

目的地是:51.575001, 4.83889

我将如何计算距离 Person 更近 100 米的新坐标?

【问题讨论】:

  • 坐标是米还是纬度/经度?如果是后者,您必须将坐标投影到 WGS84 或类似的椭球体中,以便获得以米为单位的坐标。然后,假设您想沿直线移动 100 近(无需考虑街道或墙壁),您可以使用欧几里得距离公式
  • 那些是纬度,经度坐标。谷歌地图使用

标签: php mysql google-maps geolocation coordinates


【解决方案1】:

使用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

【讨论】:

  • 有趣,Haversine。你会用什么作为 R?
  • 我知道如何计算距离。但不知道如何正确调整
  • @Vinko 取决于您想要的数字有多准确。我知道它不允许极地展平,但我的代码中的半径数字应该与大多数 GPS 系统一样准确
  • @Topener Haversine 为您提供两点之间的距离 x。你想移动 100m,所以你调整 lat 和 long 的比例为 100/x
【解决方案2】:

如果您了解 JavaScript,您可能需要查看以下 Stack Overflow 帖子中的 moveTowards() 方法:

当给定起点、终点和沿该线行进的距离时,此方法返回目的地点。可以以点1为起点,以点2为终点,距离为100米。它是用 JavaScript 编写的,但我确信它可以很容易地移植到 PHP 或 MySQL。

您可能还想查看另一个 Stack Overflow 帖子,它实现了上述 JavaScript 实现的一部分,作为 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 中的实现。

【讨论】:

  • 有趣的帖子和链接
【解决方案3】:

求 x 轴与从人到目的地的向量之间的角度 theta。

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

【讨论】:

  • 这个解决方案的问题是它没有将地球视为一个球体......纬度是平行的并且相距约111公里,但赤道的经度最宽为111公里并在两极逐渐收敛到零。
  • 我仍然会在此处保留答案,因为它仍然相关(至少与问题的标题相关)......您可能只是想对此进行说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
相关资源
最近更新 更多