如何在Android上使用Viewport Marker Management

Mau*_*riF 5 performance android google-maps

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

如果您的应用必须在Google地图上显示大量标记,并且群集它们不足以阻止您的应用运行速度过慢,那么您最好的选择之一就是使用此视口标记管理技术.您可以在此处阅读理论解释:https://developers.google.com/maps/articles/toomanymarkers

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

Mau*_*riF 5

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

mMap.setOnCameraChangeListener(new OnCameraChangeListener() {

        @Override
        public void onCameraChange(CameraPosition arg0) {

        LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds;

        }
Run Code Online (Sandbox Code Playgroud)

2°---此步骤可能会根据您获取标记数据的方式而有所不同.基本上,您需要做的是计算每个标记的纬度和长度是否在屏幕边界内.我将通过从标记表中两个不同的DOUBLE clomuns中存储纬度和经度的SQLite数据库中获取数据来向您展示如何操作.

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();
                   }
    }
});
Run Code Online (Sandbox Code Playgroud)

这个想法是很容易的,只需要记住,你的标记lat和隆基必须比屏幕的东北位置比西南角小,大,或者仅使用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
        }

    });
Run Code Online (Sandbox Code Playgroud)

  • 谢谢mauriF.我解决了它,但是以一种不同的方式.我在markerClickListener上将布尔值设置为true,如果在onCameraChange中为true,则为false.最后,如果布尔值为false,则仅更新摄像机位置.同样的结果.感谢你的宝贵时间! (2认同)