先上图:

首先我们只单说画扇形的需求
需求:把最佳123位置点显示在扇形区域内,(这里分两种情况:1扇形不跟随移动,这个就没什么了,初始画出来就行了,2,扇形跟随移动,初始肯定是显示在区域内的,随着定位点的移动,扇形跟随移动)
条件:画出扇形要有几个条件,两条边的夹角度数、中心点(即定位点)、半径
这里比较有争议的是两条边的夹角度数,根据需求和实际情况看是后台计算好返回还是前端来计算处理
下面接着上代码:
方法入口
//我这里直接传入的是百度地图sdk返回的定位夹度度数 angle =location.getDirection()
private void drawRadius(double angle) {
OverlayOptions op = new PolygonOptions()
.points(sector(new LatLng("纬度", "经度"), "半径参数", "开始角度angle-60","结束角度angle+60")
.stroke(new Stroke(0, Color.parseColor("#ffffff"))).fillColor(Color.parseColor("#201c3d6f"));
radiuOverlay = mBaiduMap.addOverlay(op);//把计算的扇形添加到百度地图上
}
词义
入口方法中的中文的方法需替换为所需参数:
经度纬度为百度定位所得,
开始结束角度:有两种方法:1、后台给出,2、根据百度地图sdk定位返回
angle =location.getDirection()
百度定位回调方法中的BDLocation location
location.getDirection()//获取到的方向信息,顺时针0-360
//这里拿到的只是一个角度数,需要用这个角度数获取范围,
//比如location.getDirection()-60,location.getDirection()+60;
这样就得出一个120度范围的距离了,然后以这两个边为扇形的两边通过算法得出整个扇形的两边及头部的弧形坐标
.stroke()方法 是定义画笔的大小、颜色
.fillColor() 定义区域内的填充颜色
方法拆解
画扇形用的是百度地图SDK中的new PolygonOptions() 多边形类方法
其中 op.points(...)是传递给百度地图SDK一个经纬度list 用来画图形的边的,那么sector()方法就是计算这个扇形的所经过的边的坐标咯,方法如下:
//以画多边形区域的方法画扇形区域
// 画出以point点为圆心,radius为半径,夹角从startAngle到endAngle的扇形
public List<LatLng> sector(LatLng point, long radius, int startAngle, int endAngle) {
//创建构成多边形的坐标点数组
List<LatLng> sectorPoints = new ArrayList<>();
//根据扇形的总夹角确定每步夹角度数,最大为10
int step = (endAngle- startAngle)/10 > 10 ? 10 : endAngle- startAngle;
sectorPoints.add(point);
for (int i = sDegree; i < eDegree + 0.001; i ++) {
//循环获取每步的圆弧上点的坐标,存入点数组
sectorPoints.add(offsetBearing(point, radius, i));
}
return sectorPoints;
}
圆弧所需的坐标点,(计算出弧度的坐标点以LatLng 经纬度返回)
//扇形的圆弧坐标算法
public LatLng offsetBearing(LatLng point, long dist, int bearing) {
//计算1经度与原点的距离
double lngConv = DistanceUtil.getDistance(point, new LatLng(point.latitude, point.longitude + 0.1));
//计算1纬度与原点的距离
double latConv = DistanceUtil.getDistance(point, new LatLng(point.latitude + 0.1, point.longitude));
//正弦计算待获取的点的纬度与原点纬度差
double lat = dist * Math.sin(bearing * Math.PI / 180) / latConv;
//余弦计算待获取的点的经度与原点经度差
double lng = dist * Math.cos(bearing * Math.PI / 180) / lngConv;
return new LatLng(point.latitude + lat, point.longitude + lng);
}
最后可以定义个Overlay 对象
private Overlay radiuOverlay;
radiuOverlay = mBaiduMap.addOverlay(op);//对应入口方法中 (把计算的扇形添加到百度地图上)
然后可以动态操作,如:
if (radiuOverlay != null) {
radiuOverlay.remove();//把扇形移除
}
以上就是画扇形的处理方法,并不复杂,欢迎各位道友指正,匆喷_(呵呵哒)
网友评论