我正在开发一个项目,可以跟踪车辆行驶时的情况.车辆的位置取自
Geoloqi API并显示在自动更新的地图上.坐标传递给Drupal中的AHAH函数,该函数将通过其他API加载更多关于位置的信息:s.其中一个是Geonames.org.
我不想经常从远程服务器加载数据,因为这会增加负载并过快地使用我们的信用.然而.我确实希望它尽可能实时,因为这对项目至关重要.所以我想这样做:
Geonames为当前街道提供一系列GPS位置,以便可以在地图上绘制. “线”被赋予下一个交叉点.如果我们在每次位置改变时询问当前的街道名称,我们会过快地吃我们的门票但是在每个交叉路口怎么样?
在PHP中,是否可以检查给定的gps坐标是否位于另外两个坐标之间的线上?如果这条线可以在所有方向上延伸几米以便清除任何偏移量也是好的.
非常感谢你提出的所有建议.
最佳答案 您的原始问题归结为一个简单的数学问题:找到一条线的方程,给出它经过的两个点.这部分很简单:比方说,你有两个点(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报告的距离变化小于某个预定义值,则不要重新查询位置.