無人機這段時間一直在風(fēng)口浪尖上,6月1號開始無人機起飛重量超過250克的要進(jìn)行實名登記鹃觉,前段時間的杭州無人機割傷眼球事件屈芜,
我們的禁飛區(qū)判斷也要實時更新,而且之前的方法把禁飛區(qū)只是畫了個圓喻粹,現(xiàn)在要把禁飛區(qū)精確蟆融,有可能是多邊形,這就要判斷當(dāng)前位置是不是在禁飛區(qū)內(nèi)了守呜。
1.之前的方法很簡單就只判斷當(dāng)前的點是不是在禁飛區(qū)這個圓內(nèi)直接用系統(tǒng)方法算出當(dāng)前位置和禁飛區(qū)中心的距離在比較大小是否超過禁飛區(qū)的半徑型酥,定位的頭文件#import <CoreLocation/CoreLocation.h>,比較距離的代碼
//第一個坐標(biāo) CLLocation *current=[[CLLocation alloc] initWithLatitude:lat longitude:lon]; //第二個坐標(biāo) CLLocation *before=[[CLLocation alloc] initWithLatitude:obj.lat longitude:obj.lng]; // 計算距離 CLLocationDistance meters=[current distanceFromLocation:before]; if (meters <= 6*1000) { // 在禁飛區(qū)里 }
2.當(dāng)禁飛區(qū)不是一個圓查乒,比如機場弥喉,跑到周圍都是禁飛區(qū),那有可能就是一個多邊形了所以就要換方法判斷玛迄,一個點是不是在一個多邊形內(nèi)由境,也就是求過當(dāng)前位置點的水平線和多邊形的交點偶數(shù)就在內(nèi)奇數(shù)就不在內(nèi)
-(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坐標(biāo) 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++;//只統(tǒng)計單邊交點 } } return (nCross % 2 == 1); }
其中arrSome就是多邊形頂點的坐標(biāo),MyPoint對象是我定義的存放多邊形頂點的蓖议,只有l(wèi)at,lng兩個屬性虏杰。