谷歌地图 android 上的折线用于每次位置更改、新折线或 setPoints?

Posted

技术标签:

【中文标题】谷歌地图 android 上的折线用于每次位置更改、新折线或 setPoints?【英文标题】:PolyLines on google maps android for every location change, new polyline or setPoints? 【发布时间】:2016-11-26 23:34:26 【问题描述】:

在我的应用程序中,我在徒步旅行时为每个位置变化绘制一条折线。这可能是 8 小时的背包徒步旅行,所以我可能有数万个点要绘制。

在我的测试中,我注意到当我放大得相当接近时(比如 17 或 18),即使在绘制了数千条线之后它也能很好地工作,但是当我缩小并且地图必须渲染所有这些线路,因为我的手机正在尝试处理所有内容,所以它变得迟缓。

我知道绘制折线的另一个选项是创建我所有点 (LatLng) 的集合 (ArrayList),并将其传递给绘制单条线的折线的 setPoints() 方法。在事后回顾跋涉时,这显然效果很好,但我想 setPoints() 的内部必须循环整个集合,以便添加每个新点以绘制一条线,这最终可能会更糟糕的性能明智,因为无论旧点是否可见(在视口内),它都必须这样做。

两者之间有什么关系吗? polyline.addPoint() 方法将是完美的,但我找不到类似的东西......现在作为权宜之计,我刚刚使我的折线可见性可切换,以便在我放大时可以隐藏它们并且需要移动地图,正如我所说,当我仔细放大时,这不是问题,因为它只需要渲染一个相当小的子集。

非常感谢任何想法/建议。

TIA

【问题讨论】:

【参考方案1】:

这是我想出的解决方案。它可能不是最优雅的,但我只是在我的车里开了 40 多英里,当我缩小时,我没有任何延迟。我还认为,通过每 100 个点创建一条大线(大约每 100 秒,因为我的位置侦听器每秒触发一次),我节省了必须为每次位置更改循环我的 latlng 数组的处理。现在我只需要在真正的跋涉中测试一下:)

// create and add new poly line to map from previos location to new location
            PolylineOptions lineOptions = new PolylineOptions()
                    .add(new LatLng(previousLocation.getLatitude(), previousLocation.getLongitude()))
                    .add(new LatLng(location.getLatitude(), location.getLongitude()))
                    .color(Color.GREEN)
                    .width(5);
            // add the polyline to the map
            Polyline polyline = map.addPolyline(lineOptions);
            // set the zindex so that the poly line stays on top of my tile overlays
            polyline.setZIndex(1000);
            // add the poly line to the array so they can all be removed if necessary
            polylines.add(polyline);
            // add the latlng from this point to the array
            allLatLngs.add(currentLocationLatLng);

            // check if the positions added is a multiple of 100, if so, redraw all of the polylines as one line (this helps with rendering the map when there are thousands of points)
            if(allLatLngs.size() % 100 == 0) 
                // first remove all of the existing polylines
                for(Polyline pline : polylines) 
                    pline.remove();
                
                // create one new large polyline
                Polyline routeSoFar = map.addPolyline(new PolylineOptions().color(Color.GREEN).width(5));
                // draw the polyline for the route so far
                routeSoFar.setPoints(allLatLngs);
                // set the zindex so that the poly line stays on top of my tile overlays
                routeSoFar.setZIndex(1000);
                // clear the polylines array
                polylines.clear();
                // add the new poly line as the first element in the polylines array
                polylines.add(routeSoFar);
            

【讨论】:

以上是关于谷歌地图 android 上的折线用于每次位置更改、新折线或 setPoints?的主要内容,如果未能解决你的问题,请参考以下文章

绘制折线捕捉到道路Android谷歌地图应用程序

如何在谷歌地图android中显示当前位置的平滑移动

如何在Android的谷歌地图片段中更改默认的蓝色圆形位置图标?

如何根据gps位置纬度动态扩展谷歌地图的折线

使用当前位置将折线绘制到目的地,并在谷歌地图上添加标记,标记颤动

当标记向目的地移动时减少谷歌地图中的折线(Android)