项目的需求中,有一个设置围栏的功能。
高德地图的设置围栏,有2种类型,圆形和多边形。
多边形已经实现地图自动缩放。但是绘制圆形有问题,不能自动缩放,用户看到的圆形可能很小,或者很大。
我要讲解的是绘制圆形的自动缩放。
高德地图中的demo是不能自适应屏幕的,如上图所示。
我的思路是根据圆心的经纬度,和半径,计算出圆的上下左右的点的经纬度,然后调用多边形的缩放的接口方法。
说说代码的实现吧:
代码:
/**
* 假设地球为一半径为R的表面光滑圆球体,
表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600
表面上同一纬线圈上相差1"两点间的距离为 2πR×cos(纬度)/360/3600
当R取半径平均值6371km时,
地球表面上同一经线圈上相差1"两点间的距离约为30.887m
地球表面上同一纬线圈上相差1"两点间的距离约为30.887m×cos(纬度)
* @param boundsBuilder
* @param center
* @param radius
*/
private void calculateLl(LatLngBounds.Builder boundsBuilder,LatLng center,Double radius) {
double latitude = center.latitude;//维度
double longitude = center.longitude;//经度
//地球周长
Double perimeter = 2*Math.PI*6371000;
//纬度latitude的地球周长:latitude
Double perimeter_latitude = perimeter*Math.cos(Math.PI * latitude / 180);
//一米对应的经度(东西方向)1M实际度
double longitude_per_mi = 360 / perimeter_latitude;
double latitude_per_mi = 360 /perimeter;
LogUtil.showLog("经度(东西方向)1M实际度","=="+ longitude_per_mi);
LogUtil.showLog("纬度(南北方向)1M实际度","=="+ latitude_per_mi);
Double leftLo =longitude-(radius*longitude_per_mi);
Double rightLo =longitude+(radius*longitude_per_mi);
Double topLa =latitude+(radius*latitude_per_mi);
Double bottomLa =latitude-(radius*latitude_per_mi);
LatLng left = new LatLng(latitude,leftLo);
LatLng right = new LatLng(latitude,rightLo);
LatLng top = new LatLng(topLa,longitude);
LatLng bottom = new LatLng(bottomLa,longitude);
LogUtil.showLog("left","=="+ left.toString());
LogUtil.showLog("right","=="+ right.toString());
LogUtil.showLog("top","=="+ top.toString());
LogUtil.showLog("bottom","=="+ bottom.toString());
boundsBuilder.include(left);
boundsBuilder.include(right);
boundsBuilder.include(top);
boundsBuilder.include(bottom);
}
欢迎博友留言不同的方案。
更多工具: