关于百度地图的补充:只显示屏幕范围内的marker(旋转时的bug)

之前在关于百度地图(四):点聚合及只显示屏幕范围内的marker这篇文章中写了只显示屏幕范围内的点,当时的操作是这样的:

if (llr.latitude < lat && lat < ll.latitude && ll.longitude < lng && lng < llr.longitude) {
        infos.add(info);
  }

由于当时是禁用了地图旋转,前几天需要开启旋转,在测试的时候发现,当旋转地图到一定角度(手机屏幕左上角的纬度低于右下角的纬度)的时候,那么marker是不会在这个范围内的。
那么如何解决这个问题呢?
关于百度地图的补充:只显示屏幕范围内的marker(旋转时的bug)_第1张图片
如图,当地图的北面指针旋转到指向这样一个角度的时候,左下角的纬度是要比右上角的纬度低的,那么上面那个判断就不能用了。
这边我用了一个简单点,但也许不是太准的方法,就是取出四个点的所有经纬度,取最大与最小的经纬度,用最大与最小的经度得到一个区域,再最大与最小的纬度之间也得到一个区域,两个区域的重叠部分就是我要显示的marker。但是这个范围也是不准确的,因为下图:
关于百度地图的补充:只显示屏幕范围内的marker(旋转时的bug)_第2张图片
其实花了绿线的区域,这部分是我们不想要的。所以其实这里感兴趣的可以去计算一下,把这一部分减掉。
好了,上我的代码:

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics outMetrics = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(outMetrics);
        int width = outMetrics.widthPixels;
        int height = outMetrics.heightPixels;
//        Log.i("屏幕宽度和高度", width + "," + height);
        //1.左上
        Point pt = new Point();
        pt.x = 0;
        pt.y = 0;
        final LatLng ll = mBaiduMap.getProjection().fromScreenLocation(pt);
        //2.右上
        Point pttr = new Point();
        pttr.x = width;
        pttr.y = 0;
        final LatLng lltf = mBaiduMap.getProjection().fromScreenLocation(pttr);
        //3.左下
        Point ptbl = new Point();
        ptbl.x = 0;
        ptbl.y = height;
        final LatLng llbl = mBaiduMap.getProjection().fromScreenLocation(ptbl);
        //4.右下
        Point ptr = new Point();
        ptr.x = width;
        ptr.y = height;
        final LatLng llr = mBaiduMap.getProjection().fromScreenLocation(ptr);
        /**
         * 获取屏幕内范围:1.左上角,2右上角,3左下角,4右下角
         */
        double[] lats = new double[]{ll.latitude, lltf.latitude, llbl.latitude, llr.latitude};
        double[] lngs = new double[]{ll.longitude, lltf.longitude, llbl.longitude, llr.longitude};
        //排序
        Arrays.sort(lats);
        Arrays.sort(lngs);
        //最大经纬度与最小经纬度
        double latMax = lats[3];
        double latMin = lats[0];
        double lngMax = lngs[3];
        double lngMin = lngs[0];

那么这个时候,只要用你的marker的经纬度去判断就ok了

if ((latMin/**
        * 这里就是屏幕范围内了 
        */             
   }

你可能感兴趣的:(整理,只显示屏幕内)