4

我正在做一个项目,该项目将在车辆四处行驶时对其进行跟踪。车辆位置取自Geoloqi API,并显示在自动更新的地图上。坐标被传递给 Drupal 中的 AHAH 函数,该函数将通过其他一些 API:s 加载有关位置的更多信息。其中之一是 Geonames.org。

我不想太频繁地从远程服务器加载数据,因为这会增加负载并过快地使用我们的信用。然而。我确实希望它尽可能实时,因为这对项目至关重要。所以我想这样做:

Geonames 为当前街道提供一串 GPS 位置,以便可以在地图上绘制。“线”被赋予下一个交叉点。如果每次位置更改时都询问当前街道名称,我们会吃得太快,但是在每个十字路口呢?

是否可以在 PHP 中检查给定的 gps 坐标是否位于其他两个坐标之间的线上?如果这条线可以向各个方向延伸几米以清除任何偏移,那也是很好的。

非常感谢您的所有建议。

4

1 回答 1

2

您最初的问题归结为一个简单的数学问题:在给定两个点的情况下找到一条线的方程。这部分很简单:假设你有两个坐标为 (lat1, lon1) 和 (lat2, lon2) 的点,那么直线的方程将是

(lon2 - lon1) * X + (lat1 - lat2) * Y + (lat1 * lon2 + lat2 * lon1) = 0

现在,当你得到任何其他点(纬度,经度)时,只需将这些坐标分别作为(X,Y)放入方程中。如果你得到 0,那么这个点就在线上。然后检查您lat的介于lat1和之间lat2以及您lon的介于lon1和之间lon2。如果是,则新点位于两个现有点之间的线上。

更复杂的部分来自两件事:

  1. GPS 错误。考虑到这一点,您可以做一些近似,例如,不要与 0 比较,而是给它一些余地,例如比较-err您定义的某个值的+err位置。err

  2. 事实上,大多数街道并不直。下图显示了问题。如果您查看顶部街道两端之间的线,垂直街道的顶部将在那条线上 - 但这不是您想要的。
    在此处输入图像描述.

也许更好的方法是使用距离变化。如果 GPS 报告的距离变化小于某个预定义值,则不要重新查询位置。

于 2012-07-03T17:39:07.293 回答