之前在关于百度地图(四):点聚合及只显示屏幕范围内的marker这篇文章中写了只显示屏幕范围内的点,当时的操作是这样的:
if (llr.latitude < lat && lat < ll.latitude && ll.longitude < lng && lng < llr.longitude) {
infos.add(info);
}
由于当时是禁用了地图旋转,前几天需要开启旋转,在测试的时候发现,当旋转地图到一定角度(手机屏幕左上角的纬度低于右下角的纬度)的时候,那么marker是不会在这个范围内的。
那么如何解决这个问题呢?
如图,当地图的北面指针旋转到指向这样一个角度的时候,左下角的纬度是要比右上角的纬度低的,那么上面那个判断就不能用了。
这边我用了一个简单点,但也许不是太准的方法,就是取出四个点的所有经纬度,取最大与最小的经纬度,用最大与最小的经度得到一个区域,再最大与最小的纬度之间也得到一个区域,两个区域的重叠部分就是我要显示的marker。但是这个范围也是不准确的,因为下图:
其实花了绿线的区域,这部分是我们不想要的。所以其实这里感兴趣的可以去计算一下,把这一部分减掉。
好了,上我的代码:
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<lat&&lat<latMax)&&(lngMin<lng&&lng<lngMax)){
/**
* 这里就是屏幕范围内了
*/
}
转载自:https://blog.csdn.net/qq_35693043/article/details/79083764