gps位于两个位置之间

时间:2012-07-03 09:44:48

标签: php geolocation gps

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

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

Geonames为当前街道提供一系列GPS位置,以便可以在地图上绘制。 “线”被赋予下一个交叉点。如果我们在每次位置改变时询问当前的街道名称,我们会过快地吃我们的门票但是在每个交叉路口怎么样?

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

非常感谢您提出的所有建议。

1 个答案:

答案 0 :(得分:2)

你的原始问题归结为一个简单的数学问题:找到一条线的方程,给出它经过的两个点。这部分很简单:比方说,你有两个点(lat1,lon1)和(lat2,lon2)坐标,那么该行的等式将是

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

现在,当你得到任何其他点(lat,lon)时,只需将这些坐标分别作为(X,Y)放入等式中。如果你得到0,那么这一点就行了。然后检查您的lat是否在lat1lat2之间,lon介于lon1lon2之间。如果是,则新点位于两个现有点之间的线上。

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

  1. GPS错误。为了解释这一点,你可以做一些近似,例如,不是比较为0,给它一些余地,例如从-err+err进行比较,其中err是您定义的某个值。

  2. 大多数街道不直的事实。下图显示了问题。如果你看看顶部街道两端之间的线,垂直街道的顶部将在那条线上 - 但这不是你想要的。
    enter image description here

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