【问题标题】:How to use Viewport Marker Management on Android如何在 Android 上使用视口标记管理
【发布时间】:2014-09-25 19:09:13
【问题描述】:

我还没有找到任何关于如何在 Android 上使用这种技术的完整解释,所以我决定创建一个问答线程。

如果您的应用必须在 google 地图上显示大量标记,并且将它们聚集在一起不足以防止您的应用运行太慢,那么您最好的选择之一就是使用这种视口标记管理技术。你可以在这里阅读理论解释:https://developers.google.com/maps/articles/toomanymarkers

我在下面写了一个简短的指南...

【问题讨论】:

    标签: android performance google-maps


    【解决方案1】:

    1°--- 在创建地图的活动中,您必须设置 OnCameraChangeListener 并获取屏幕边界,如下所示:

    mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
    
            @Override
            public void onCameraChange(CameraPosition arg0) {
    
            LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds;
    
            }
    

    2°--- 此步骤可能因您获取标记数据的方式而异。基本上,您要做的是计算每个标记的纬度和经度是否在屏幕范围内。我将通过从 SQLite 数据库中获取数据来向您展示如何做到这一点,该数据库将纬度和经度存储在标记表内的两个不同的 DOUBLE clomun 中。

    mMap.setOnCameraChangeListener(new OnCameraChangeListener() {
    
            @Override
            public void onCameraChange(CameraPosition arg0) {
    
            LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds;
    
            LatLng northeast = bounds.northeast;
            String boundLat = String.valueOf(northeast.latitude);
            String boundLong = String.valueOf(northeast.longitude);
    
            LatLng southwest = bounds.southwest;
    
            String boundLat2 = String.valueOf(southwest.latitude);
            String boundLong2 = String.valueOf(southwest.longitude);
    
            //Remove all markers from map
    
            mMap.clear(); // or if your a using cluster manager:
            //mClusterManager.clearItems();
    
            String[] fields = new String[] { "name", "latitude", "longitude" };
            String[] args = new String[] {boundLat, boundLong, boundLat2, boundLong2,};
    
            Cursor markers = dataBase.query("markers", fields, "latitude<=? AND longitude<=? AND latitude>=? AND longitude>=?");
    
            if (markers.moveToFirst()) {
                    do {
                        mMap.addMarker(new MarkerOptions()
                        .position(new LatLng(marker.getDouble(1), marker.getDouble(2)))
                        .title(marker.getString(0)) );
    
                         // or if you are using cluster manager create and add the items as you normaly do.
    
                       } while (c.moveToNext());
    
                       //if using cluster manager add :
                       //mClusterManager.cluster();
                       }
        }
    });
    

    这个想法很简单,只要记住标记 lat 和 longi 必须小于屏幕的东北角且大于西南角,或者使用 LatLngBounds.contains 函数。

    已编辑:

    为避免在单击尚未位于屏幕中心的标记时关闭 InfoWindow,您可以更改标记单击侦听器的默认操作,移除相机移动。

    map.setOnMarkerClickListener(new OnMarkerClickListener() {
    
            @Override
            public boolean onMarkerClick(Marker arg0) {
                arg0.showInfoWindow();
    
                return true; //must be true, if not, it will execute the default code after yours
            }
    
        });
    

    【讨论】:

    • 像魅力一样工作。但是,如何显示标记的标题?当我按下标记时, setOnCameraChangeListener() 被调用并再次关闭标题。你如何解决这个问题?谢谢!
    • 感谢 mauriF。我解决了它,但方式不同。我在markerClickListener上设置了一个布尔值,如果在onCameraChange中为真,则设置为false。最后仅在布尔值为 false 时更新相机位置。同样的结果。再次感谢您的宝贵时间!
    猜你喜欢
    • 2014-09-05
    • 2015-08-19
    • 1970-01-01
    • 2023-01-07
    • 2011-04-01
    • 2014-01-23
    • 2015-04-23
    • 1970-01-01
    • 2019-06-22
    相关资源
    最近更新 更多