如何在 Android 的 Google 地图上绘制纬度超过 100k 的折线

How to draw a polyline with more than 100k LatLng on Google Maps in Android

提问人:Bernd 提问时间:11/13/2023 更新时间:11/13/2023 访问量:104

问:

我的问题如下:我正在谷歌地图中绘制一条实时折线,到目前为止效果很好。 现在我保存了所有获取的 LatLng 点,稍后我想加载我再次走过的路径。 一旦我有超过 100k,就需要几秒钟才能画出这条折线,如果我必须画出超过 100 万 LatLng 作为折线,则需要非常非常长的时间才能画出它。

现在我想知道是否有可能在合理的时间内绘制超过 100k LatLng 甚至更多的折线(合理时间意味着 1-2 秒! 或者我必须更改为某些 TileServer - 是否有“已经”内置的版本?

非常感谢您的帮助

Android 谷歌地图 多边形

评论

0赞 Alfred Woo 11/13/2023
一次 100k 折线似乎很荒谬。我认为绘画本身需要一秒钟以上的时间。也许您可以尝试对数据进行采样和分页。
0赞 Bernd 11/13/2023
采样数据是我已经在做的事情。如果我传递了相同的点,它将不会被添加到我的 ArrayList 中。由于我在 1.3 公里的赛道上参加超级马拉松比赛,因此我可能会一遍又一遍地通过同一个点,但最终如果我必须跑 100 小时甚至更长时间,我会收集超过 12 公里的积分。其他程序 他们在绘制具有那么多点的折线方面没有问题。唯一的问题是我看不到他们的源代码,因为它不是开源的。
0赞 blackapps 11/13/2023
12 小时后,你会跑超过 130 公里吗?所以在 100 公里的赛道上进行 1.3 轮。您想在轨道上显示 100 条线吗?为什么?
0赞 blackapps 11/13/2023
如果你从东到西跑 130 公里.那么如何在分辨率为 100 点的屏幕上显示 2000 K 点呢?
0赞 blackapps 11/13/2023
如果你查看他们的源代码,或者查看我的代码,你会发现他们只会每五分之一或更少。

答:

2赞 Cloverleaf 11/13/2023 #1

我建议以下两种解决方案之一:

  1. 减少保存的点数。我还记录了每一次跑步比赛、远足、骑自行车等,但即使在 8 小时后,我的 GPX 文件中也只有大约 10,000 分。我的录音软件大约每 4 秒或 40 米保存一次坐标(这对于马拉松来说绰绰有余)。

  2. 或者,您可以简化折线。有一个命令,如果中间点都或多或少都在一条直线上,则删除它们。通过这种方式,我能够将数据量减少到 5-10%,而不会使轨迹变得不那么准确,如以下示例所示。PolyUtil.simplify(fullLine, tolerance)

    原曲: Full Track

    简化轨道(公差 20m,8% 数据): Simplified Track (Tolerance 20m, 8% data)

评论

0赞 Bernd 11/13/2023
啊太好了,非常感谢:我不知道那个方法:PolyUtil.simplify(fullLine, tolerance)。我会看看的!减少点数是我已经在做的事情。我只是认为可能有一些东西可以处理它,而谷歌地图不适用于这么多数据。
0赞 Bernd 11/13/2023
谢谢。我尝试了 PolyUtil.simplify 方法,它将我的 350k 点减少到 9 点,公差为 40 米。现在我正在考虑如何加速保存/加载/dsiplaying。截至目前,我正在将所有点保存到我的sqlite数据库中,当我想显示路由时,我正在加载所有点并应用PolyUtil。方法。尽管我为列等使用索引,但仍然需要几秒钟才能显示简化的路径。希望我能弄清楚如何让它更快:读取/写入/显示。
0赞 Bernd 11/13/2023
有一个名为 Geo Tracker 的应用程序,虽然我将设置更改为:1 米,1 秒,但我能够立即显示整个路径。可悲的是,它是闭源的。这就是为什么我看不到他到底在做什么。我导出了一个持续了 12 小时的跑步,有 250k 个点,并立即显示出来。
0赞 Cloverleaf 11/13/2023
@Bernd:我读对了吗?您能够将 350k 点减少到 9(公差为 40m)?或者你的意思是 9k?只有 9 分是不可能的,除非你在半径只有 20m 的圆圈上无休止地奔跑;您是否在保存/加载时进行其他计算,例如加起来距离、计算速度等?在保存/加载/显示开始时写入日志文件,然后您可以立即看到需要花费大量时间的内容。
0赞 Cloverleaf 11/13/2023
@Bernd:如果你跑了 12 个小时,每秒保存一次坐标,那只能给你 60x60x12=43'200 点,离 350'000 很远。你怎么得到这么大的数字?