无人机这段时间一直在风口浪尖上,6月1号开始无人机起飞重量超过250克的要进行实名登记,前段时间的杭州无人机割伤眼球事件,
我们的禁飞区判断也要实时更新,而且之前的方法把禁飞区只是画了个圆,现在要把禁飞区精确,有可能是多边形,这就要判断当前位置是不是在禁飞区内了。
1.之前的方法很简单就只判断当前的点是不是在禁飞区这个圆内直接用系统方法算出当前位置和禁飞区中心的距离在比较大小是否超过禁飞区的半径,定位的头文件#import <CoreLocation/CoreLocation.h>,比较距离的代码
//第一个坐标 CLLocation *current=[[CLLocation alloc] initWithLatitude:lat longitude:lon]; //第二个坐标 CLLocation *before=[[CLLocation alloc] initWithLatitude:obj.lat longitude:obj.lng]; // 计算距离 CLLocationDistance meters=[current distanceFromLocation:before]; if (meters <= 6*1000) { // 在禁飞区里 }
2.当禁飞区不是一个圆,比如机场,跑到周围都是禁飞区,那有可能就是一个多边形了所以就要换方法判断,一个点是不是在一个多边形内,也就是求过当前位置点的水平线和多边形的交点偶数就在内奇数就不在内
-(BOOL)mutableBoundConrtolAction:(NSMutableArray *)arrSome location:(CLLocationCoordinate2D )myCoordinate4{ if (arrSome.count==0) { return 1; } int nCross = 0; for (int i= 0; i<arrSome.count; i++) { MyPoint *p1 = [MyPoint mj_objectWithKeyValues:arrSome[i]]; int j =(i+1) % arrSome.count; MyPoint *p2 = [MyPoint mj_objectWithKeyValues:arrSome[j]]; // 平行了 if (p1.lng == p2.lng) { continue; } //交点在p1p2延长线 if (myCoordinate4.longitude<(MIN(p1.lng, p2.lng))) { continue; } //交点在p1p2延长线 if (myCoordinate4.longitude>=(MAX(p1.lng, p2.lng))) { continue; } //交点的x坐标 double x = (double)(myCoordinate4.longitude-p1.lng)*(double)(p2.lat-p1.lat)/(double)(p2.lng-p1.lng)+(double)p1.lat; if (x > myCoordinate4.latitude) { nCross++;//只统计单边交点 } } return (nCross % 2 == 1); }
其中arrSome就是多边形顶点的坐标,MyPoint对象是我定义的存放多边形顶点的,只有lat,lng两个属性。