我正在开展一个项目,该项目将跟踪车辆行驶时的情况。车辆的位置取自Geoloqi API并显示在自动更新的地图上。坐标传递给Drupal中的AHAH函数,该函数将通过其他API加载更多关于位置的信息:s。其中一个是Geonames.org。
我不想经常从远程服务器加载数据,因为这会增加负载并过快地使用我们的信用。然而。我确实希望它尽可能实时,因为这对项目至关重要。所以我想这样做:
Geonames为当前街道提供一系列GPS位置,以便可以在地图上绘制。 “线”被赋予下一个交叉点。如果我们在每次位置改变时询问当前的街道名称,我们会过快地吃我们的门票但是在每个交叉路口怎么样?
在PHP中,是否可以检查给定的gps坐标是否位于另外两个坐标之间的线上?如果这条线可以在所有方向上延伸几米以清除任何偏移量也是好的。
非常感谢您提出的所有建议。
答案 0 :(得分:2)
你的原始问题归结为一个简单的数学问题:找到一条线的方程,给出它经过的两个点。这部分很简单:比方说,你有两个点(lat1,lon1)和(lat2,lon2)坐标,那么该行的等式将是
(lon2 - lon1) * X + (lat1 - lat2) * Y + (lat1 * lon2 + lat2 * lon1) = 0
现在,当你得到任何其他点(lat,lon)时,只需将这些坐标分别作为(X,Y)放入等式中。如果你得到0,那么这一点就行了。然后检查您的lat
是否在lat1
和lat2
之间,lon
介于lon1
和lon2
之间。如果是,则新点位于两个现有点之间的线上。
更复杂的部分来自两件事:
GPS错误。为了解释这一点,你可以做一些近似,例如,不是比较为0,给它一些余地,例如从-err
到+err
进行比较,其中err
是您定义的某个值。
大多数街道不直的事实。下图显示了问题。如果你看看顶部街道两端之间的线,垂直街道的顶部将在那条线上 - 但这不是你想要的。
。
也许更好的方法是使用距离变化。如果GPS报告的距离变化小于某个预定义值,则不要重新查询位置。