【问题标题】:android google map v2 drawing 1k circles performance issueandroid google map v2 绘制 1k 圆圈性能问题
【发布时间】:2021-01-08 23:32:59
【问题描述】:

我正在尝试在谷歌地图 v2 上画很多圆圈(大约 1k)。不幸的是,有些东西很慢,绘制所有圆圈时地图也很迟钝。我在 stackoverflow 上阅读了很多内容,但还没有找到解决方法。

圆圈代表 GPS 路径(步行),因此此处显示 1k 或数百个点是有意义的(当然取决于缩放级别)。

我想我正在创建许多导致性能问题的对象:

 CircleOptions circleOptions = new CircleOptions();
        circleOptions.center(new LatLng(latitude, longitude)).clickable(false).strokeWidth(2).strokeColor(Color.BLACK).fillColor(colorInHex)
                .radius(0.7);
 Circle circle = googleMap.addCircle(circleOptions);

从房间数据库中检索数据

   repository.getByLatLngBounds(projection.northeast.latitude, projection.northeast.longitude, projection.southwest.latitude, projection.southwest.longitude, new callback() {

                    @Override
                    public void loaded(List<MyPoint> points) {
                        if (points != null && googleMap != null) {
                          // iterate and draw points with circle
                        }
             }
});

解释:

  1. 我无法减少圆圈的数量,因为我已经只针对地图的可见边界
  2. 数据(圆的坐标)是从房间数据库中检索的,但实际上不到 1 秒就可以得到结果(来自异步任务)
  3. 如果用户在地图上移动,我不会重绘所有点(我会跟踪所有绘图点,如果该点已经绘制,我什么也不做)
  4. 我使用的是安卓谷歌地图 v2
  5. 我没有尝试使用自定义可绘制对象(性能应该更差)。
  6. 问题不在于标记显示,而是绘制点(因为我不想在这里绘制多边形)

基准测试数字:1227 分需要 10 秒才能绘制,听起来很慢不是吗?

在这种情况下,提高性能的方法是什么?任何帮助将不胜感激。

【问题讨论】:

  • 即使在可见范围内,用户也无法识别价值 2k 的不同对象。在不知道圆圈代表什么或您所处的缩放级别的情况下,我会使用热图或加权标记(圆圈)将事物聚集在一起,并且仅在缩小时放大/隐藏时显示(参见视频: developers.google.com/maps/documentation/android-sdk/utility/…)
  • 它可以被识别,但用户因为我绘制“路径”(但不是多边形,单个圆圈)。据我所知,聚类是显示标记而不是简单的圆圈。问题不在于标记,而在于这里的绘图点。如果您能提供帮助,我已经编辑了更多信息。问候。
  • 我认为画一个 2k 的圆圈来显示路径是一种矫枉过正,你需要排除在同一条线上的点,并以某种方式在这组点的两个边缘点之间绘制一条路径.
  • 这不是矫枉过正,因为它不完全是“路径”。我可以尝试绘制折线,但这不是这里的目的。我也做了基准测试,你可以看到显示 1227 个点大约需要 10 秒,这听起来很慢,不是吗?

标签: android performance google-maps google-api


【解决方案1】:

我终于找到了解决办法。我检查了折线的性能,它的速度大约快了 12 倍。好吧,如果你的点太多,画圆是不可能的。

所以想法是画一条折线,然后添加一个带点的图案。

  PolylineOptions polylineOptions = new PolylineOptions();
  polylineOptions.width(3);
  polylineOptions.color(Color.RED);
  for(MyPoint point : pointsToDraw){
     polylineOptions.add(new LatLng(point.getLatitude(), point.getLongitude()));
  }
  Polyline polyline = googleMap.addPolyline(entry.getValue());
  // the key is here with the pattern
  List<PatternItem> pattern = Arrays.asList(new Dot());
  polyline.setPattern(pattern);  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2013-03-12
    • 2013-02-26
    • 2013-12-21
    • 2017-07-03
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    相关资源
    最近更新 更多