我已经开始创建一个网站,用户可以被有效地跟踪(他们知道他们正在被跟踪) . 用户将走一条特定的路线(更准确地说是英国曼彻斯特),其中有10个检查站 . 检查点是 Map 上的静态位置 . 使用Google Maps API我知道我可以在 Map 上绘制一个位置,即检查点 . 我还存储用户到达所述检查点的时间 . 考虑到检查点之间的距离,我可以使用基本数学计算它们的平均速度 .
现在我想做的是根据他们的速度绘制他们的估计位置 . 我遇到的困难是从当前位置 along the route 绘制一个新的位置x英里/米(任何单位) .
如果它是一条直线,这将是简单的 .
-
有没有办法计算沿路线当前位置的距离?
-
点数有限制吗?
-
是否有特定的方法可以避免这种情况?
To expand my example with an image:
想象一下,用户在上午07:00到达第一位置标记,并且估计他们将在上午09:00到达第二位置标记 . 现在(例如)的时间是上午08:00,意味着(估计)用户应该在标记之间的大约一半 . 然后我会计算他们走过的距离(再次,估计)并在 Map 上绘制距离第一位标记“距离”的位置 .
希望我已经清楚地解释了这个场景,让人们理解 .
我对Google Maps API比较陌生,所以任何想法都会有所帮助 . 其他类似的问题已在SO上提出,但从我所看到的情况来看,没有人回答或要求我提供尽可能多的细节 .
提前致谢 .
UPDATE: 花了很多时间试图解决这个问题我失败了 . 这就是我所知道的:
-
我应该使用PolyLine创建路径(我可以这样做,我有一个lat / lng列表)
-
有一个名为epoly.js的JS扩展,但这与V3不兼容
-
使用spherical.interpolate不会工作,因为它不遵循路径 .
5 回答
作为一名制图师,我曾经在过去的生活中做过很多这样的事情 . 您的折线由一系列点(纬度/长坐标)组成 . 在每个连续点之间计算距离,随着时间的推移将其加起来,直到达到所需的距离 .
真正的技巧是计算两个纬度/长点之间的距离,这两个点是球面坐标(即曲面上的点) . 由于您处理的距离相当小,因此可以将纬度/经度坐标转换为局部 Map 网格系统(平面) . 然后两点之间的距离是直线向前直角毕达哥拉斯(平方和的总和) . Movable Type网站在这个here上有很多好的(javascript)代码 .
第二种方法是进行球面距离计算 - 不是很漂亮,但你可以看到它here
就个人而言,我会将坐标转换为本地网格系统,在英国应该是OSGB . 它是最少扭曲的方法 .
希望这可以帮助
Edit: 我在api的第3版中完成了这个,但它应该是直截了当的 . 此外,折线坐标应该非常接近,您不需要插入中间点 - 只需 grab 最近的折线坐标(节省您必须进行方位和距离计算) .
Edit2 - With Code
我有时间在你的时限内完成它(我确实有工作) . 你应该能够获得这个数字 . 坐标转换代码从可移动类型的网站和谷歌的一个示例中提取基本谷歌 Map . 基本上它用鼠标点击绘制折线,将每个鼠标点击的lat / long放在表字段中,将坐标转换为OSGB,然后转换为OS Grid(参见here) . 首次点击后,然后计算每个后续点之间的距离 . 希望这能让你上路 .
Map.js:
我认为你正在寻找类似于this函数的东西,它在给定的行上返回一个特定百分比的点 . 不幸的是,我可能值得一看 .
与此同时,这是一个快速的黑客概念,可以为您提供足够的细节,满足您的需求:
从您的折线开始(为简单起见,假设您只有一条路径,那么是一系列LatLngs)
当你想估计这个人的位置时,按照时间确定路径的百分比(例如,早上8点它们是50%)
现在,对于路径中的每个LatLng,通过添加LatLng之间的距离来计算它沿路径总长度的小数距离(您可以使用computeLength作为路径,使用computeDistanceBetween作为每个LatLng)
一旦你得到> 50%的分数(在这种情况下),你知道这个人在这个LatLng和前一个之间 . 然后,如果您愿意,您可以确切地计算出确切位置的距离,或者只是跳过这一步,如果它是一个非常短的段并将它们的标记放在这些LatLng中的一个上 .
以上是一般概念,但当然你应该通过为每个路径预先计算每个LatLng的百分比距离并将其存储在一个单独的对象中进行优化,并跟踪路径中的最后一个索引,这样就不会下次计算他们的距离时从头开始,等等 .
希望这可以帮助 .
我认为你已经得到了答案,除了我没有看到任何人明确提到的一个小细节:你需要使用
steps
中编码的polyline
到达你将在两点之间进行插值的点 . 足够接近,使它们之间的直线很好地接近路线的形状 .我们来看一个例子:
从马德里到托莱多的行车路线:
http://maps.googleapis.com/maps/api/directions/json?origin=Toledo&destination=Madrid®ion=es&sensor=false
中间点(整个路线的中间点)将位于最近的长度为近50公里的某个地方:
我担心这条折线太长(2856个字符)到display it directly in the Static Maps API,但是's not necessary, it'只是在这里显示折线的好方法 . 无论如何,您可以使用Interactive Polyline Encoder Utility粘贴此编码折线(在用
\
替换\\
之后)来查看它 .现在,让我们想象你需要在这条路线中找到正好20公里的点 . 从这一步开始 . 也就是说,
start_location
和end_location
之间的点距离start_location
,距上述折线定义的路线为20,000米 .在您的应用程序中,您将使用几何库中的Encoding Methods(您需要load explicitly)将此折线解码为整个LatLng点阵列 . 然后,您可以使用每两个相邻点之间的computeDistanceBetween来确定哪一个是该折线中的第一个LatLng点(
Y
),该点距离start_location
超过20,000 . 然后你取这个点加上前一个点(X
)并在X
和Y
之间进行直线插值 . 此时,您可以指望这两个点之间的直线是路线形状的合理近似值 .请注意,这是一个相当详细的计算,可能会变得太昂贵 . 如果由于折线的大尺寸而遇到性能问题,可以通过删除部分点来简化它 . 巧妙地进行这种简化可能同样昂贵,所以我会保持简单;)
我会说这是可行的 . :-)这是我想象它的方式,但我还没有测试过它 .
首先根据用户应该采用的“猜测路线”定义PolyLine . 将其存储在js中的局部变量中 . 有很多分数会很方便,使得估计点更好 .
然后设置一个间隔(window.setInterval)来检查用户位置的更新,比如说每30秒 . 如果位置比间隔更新 - 显示已知位置并从上一个已知位置绘制实线,则创建一行已知数据 . (的setpath)
如果没有新数据,请使用最新的几个已知点进行简单的速度计算 .
使用速度和时间帧计算估计的行程距离 .
使用计算的距离,加载您的估计路线对象并在“猜测路线”中逐点“行走”,直到伪步距离几乎等于您的估计值 . 然后返回到达正确距离的点 .
从最后一个已知位置画一条虚线到猜到的位置 .
祝好运!
PS .
PolyLine是由许多路径和航点组成的线对象
使用geometry spherical命名空间函数"computeLength"计算点之间的长度
该网站:http://www.gmap-pedometer.com/可能是有意义的,因为它允许用户绘制路线,并添加英里或公里标记沿着路线,所以它必须做一个你需要的计算 .