CollectRegionsVC.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. //
  2. // CollectRegionsVC.m
  3. // LN_School
  4. //
  5. // Created by apple on 2017/12/7.
  6. // Copyright © 2017年 Danson. All rights reserved.
  7. //
  8. #import "CollectRegionsVC.h"
  9. #import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件
  10. #import <BMKLocationkit/BMKLocationComponent.h>//引入定位功能所有的头文件(新)
  11. #import <BaiduMapAPI_Utils/BMKUtilsComponent.h>//测量工具
  12. @interface CollectRegionsVC ()<BMKMapViewDelegate,BMKLocationManagerDelegate>
  13. {
  14. BMKMapView *_mapView;
  15. BMKLocationManager *_locService;
  16. CLLocationCoordinate2D preCoordinate;
  17. NSMutableArray *annotationArray;
  18. BOOL isEnd;
  19. NSInteger eArea;
  20. }
  21. @property (nonatomic, strong) BMKUserLocation *userLocation;//当前位置对象
  22. @end
  23. @implementation CollectRegionsVC
  24. - (void)viewDidLoad {
  25. [super viewDidLoad];
  26. self.navigationItem.title = @"围栏采集";
  27. self.view.backgroundColor = [UIColor whiteColor];
  28. self.navigationController.navigationBar.translucent = NO;
  29. [self goBackByNavigation];
  30. isEnd = NO;
  31. eArea = 0;
  32. annotationArray = [NSMutableArray array];
  33. //实例化地图
  34. _mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, kSize.width, kSize.height - 44 )];
  35. _mapView.delegate = self;
  36. _mapView.mapType = BMKMapTypeStandard;
  37. _mapView.userTrackingMode = BMKUserTrackingModeNone;
  38. _mapView.zoomLevel = 17;
  39. _mapView.showsUserLocation = YES;
  40. [self.view addSubview:_mapView];
  41. //定位功能
  42. _locService = [[BMKLocationManager alloc]init];
  43. _locService.delegate = self;
  44. [_locService startUpdatingLocation];
  45. //卫星/标准地图
  46. NSArray *segTitleArray = @[@"平面",@"卫星"];
  47. UISegmentedControl *segMent = [[UISegmentedControl alloc] initWithItems:segTitleArray];
  48. segMent.frame = CGRectMake(20, 25, 100, 40);
  49. [segMent borderCornorRadios:2];
  50. segMent.backgroundColor = [UIColor whiteColor];
  51. segMent.tintColor = RQMianColor;
  52. segMent.selectedSegmentIndex = 0;
  53. [segMent addTarget:self action:@selector(clickSegMent:) forControlEvents:UIControlEventValueChanged];
  54. [self.view addSubview:segMent];
  55. //按钮布局
  56. NSArray *titleArray = @[@"设置\n起点",@"过程\n采集",@"设置\n终点",@"重新\n采集",@"生成\n围栏"];
  57. for (int i = 0; i < titleArray.count; i ++) {
  58. UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(kSize.width - 50, kSize.height - 270 - kNavOffSet + i*50, 40, 40)];
  59. [btn borderColor:KContentTextColor width:1.2 cornorRadios:3];
  60. btn.backgroundColor = [UIColor whiteColor];
  61. [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  62. btn.titleLabel.font = [UIFont systemFontOfSize:12];
  63. btn.titleLabel.numberOfLines = 0;
  64. [btn setTitle:titleArray[i] forState:UIControlStateNormal];
  65. btn.tag = i + 1;
  66. [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
  67. [self.view addSubview:btn];
  68. }
  69. }
  70. //上传围栏
  71. - (void)updatePoint {
  72. }
  73. - (void)clickSegMent:(UISegmentedControl *)seg {
  74. if (seg.selectedSegmentIndex == 0) {
  75. _mapView.mapType = BMKMapTypeStandard;
  76. }
  77. if (seg.selectedSegmentIndex == 1) {
  78. _mapView.mapType = BMKMapTypeSatellite;
  79. }
  80. }
  81. - (void)btnClick:(UIButton *)sender {
  82. if (sender.tag == 1) {
  83. if (annotationArray.count > 0) {
  84. ShowMsg(@"起点已存在!");
  85. return;
  86. }
  87. //绘制起点
  88. BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
  89. annotation.coordinate = preCoordinate;
  90. annotation.title = @"起点";
  91. [_mapView addAnnotation:annotation];
  92. [annotationArray addObject:annotation];
  93. _mapView.centerCoordinate = preCoordinate;
  94. }
  95. if (sender.tag == 2) {
  96. if (annotationArray.count < 1) {
  97. ShowMsg(@"请先设置起点!");
  98. return;
  99. }
  100. if (isEnd) {
  101. ShowMsg(@"终点已存在!");
  102. return;
  103. }
  104. //绘制过程点
  105. BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
  106. annotation.coordinate = preCoordinate;
  107. annotation.title = @"过程点";
  108. [_mapView addAnnotation:annotation];
  109. [annotationArray addObject:annotation];
  110. _mapView.centerCoordinate = preCoordinate;
  111. if (annotationArray.count > 1) {
  112. //画线
  113. CLLocationCoordinate2D coor[2] = {0};
  114. annotation = annotationArray[annotationArray.count - 2];
  115. coor[0] = annotation.coordinate;
  116. coor[1] = preCoordinate;
  117. BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coor count:2];
  118. [_mapView addOverlay:polyline];
  119. //语音播报点距离
  120. BMKMapPoint point1 = BMKMapPointForCoordinate(coor[0]);
  121. BMKMapPoint point2 = BMKMapPointForCoordinate(coor[1]);
  122. CLLocationDistance distance = BMKMetersBetweenMapPoints(point1,point2);
  123. NSString *string = [NSString stringWithFormat:@"当前坐标与上一个坐标位置之间的距离为%d米",(int)distance];
  124. [Tools playAudioWithString:string];
  125. }
  126. }
  127. if (sender.tag == 3) {
  128. if (annotationArray.count < 2) {
  129. ShowMsg(@"请采集过程点!");
  130. return;
  131. }
  132. if (isEnd) {
  133. ShowMsg(@"终点已存在!");
  134. return;
  135. }
  136. isEnd = YES;
  137. //绘制终点
  138. BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
  139. annotation.coordinate = preCoordinate;
  140. annotation.title = @"终点";
  141. [_mapView addAnnotation:annotation];
  142. [annotationArray addObject:annotation];
  143. _mapView.centerCoordinate = preCoordinate;
  144. if (annotationArray.count > 1) {
  145. //画线
  146. CLLocationCoordinate2D coor[2] = {0};
  147. annotation = annotationArray[annotationArray.count - 2];
  148. coor[0] = annotation.coordinate;
  149. coor[1] = preCoordinate;
  150. BMKPolyline* polyline = [BMKPolyline polylineWithCoordinates:coor count:2];
  151. [_mapView addOverlay:polyline];
  152. //语音播报点距离
  153. BMKMapPoint point1 = BMKMapPointForCoordinate(coor[0]);
  154. BMKMapPoint point2 = BMKMapPointForCoordinate(coor[1]);
  155. CLLocationDistance distance = BMKMetersBetweenMapPoints(point1,point2);
  156. NSString *string = [NSString stringWithFormat:@"当前坐标与上一个坐标位置之间的距离为%d米",(int)distance];
  157. [Tools playAudioWithString:string];
  158. //首尾连接线
  159. coor[0] = preCoordinate;
  160. annotation = [annotationArray firstObject];
  161. coor[1] = annotation.coordinate;
  162. polyline = [BMKPolyline polylineWithCoordinates:coor count:2];
  163. [_mapView addOverlay:polyline];
  164. }
  165. }
  166. //重新采集
  167. if (sender.tag == 4) {
  168. //去掉点
  169. NSArray *array = [[NSArray alloc]initWithArray:_mapView.annotations];
  170. if (array.count > 0) {
  171. [_mapView removeAnnotations: array];
  172. }
  173. //取掉线、面
  174. array = _mapView.overlays;
  175. if (array.count > 0) {
  176. [_mapView removeOverlays:array];
  177. }
  178. isEnd = NO;
  179. [annotationArray removeAllObjects];
  180. }
  181. //生成围栏
  182. if (sender.tag == 5) {
  183. if (!isEnd) {
  184. ShowMsg(@"请设置终点!");
  185. return;
  186. }
  187. if (annotationArray.count > 100) {
  188. ShowMsg(@"围栏点不能大于100个");
  189. return;
  190. }
  191. //去掉点
  192. NSArray *array = [[NSArray alloc]initWithArray:_mapView.annotations];
  193. if (array.count > 0) {
  194. [_mapView removeAnnotations: array];
  195. }
  196. //取掉线、面
  197. array = _mapView.overlays;
  198. if (array.count > 0) {
  199. [_mapView removeOverlays:array];
  200. }
  201. //绘制面
  202. CLLocationCoordinate2D coords[100] = {0};
  203. for (int i = 0; i < annotationArray.count; i ++) {
  204. BMKPointAnnotation *annotation = annotationArray[i];
  205. coords[i] = annotation.coordinate;
  206. }
  207. BMKPolygon *polygon = [BMKPolygon polygonWithCoordinates:coords count:annotationArray.count];
  208. [_mapView addOverlay:polygon];
  209. //获取电子围栏面积
  210. [self getPolygonArea];
  211. // ShowMsg(@"正在计算围栏面积,请稍后!");
  212. }
  213. }
  214. #pragma mark 网络请求
  215. - (void)getPolygonArea{
  216. //判断网络是否连接
  217. if (![NetManager connectedToNetWork]) {
  218. showMsgUnconnect();
  219. return;
  220. }
  221. NSMutableArray *array = [NSMutableArray arrayWithCapacity:annotationArray.count];
  222. for (BMKPointAnnotation *annotation in annotationArray) {
  223. [array addObject:@{@"lat": [NSString stringWithFormat:@"%f",annotation.coordinate.latitude],@"lng":[NSString stringWithFormat:@"%f",annotation.coordinate.longitude]}];
  224. }
  225. NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
  226. [mdic setValue:array forKey:@"polygon"];
  227. [MBProgressHUD showLoadToView:self.view];
  228. [NetManager requestAnythingWithURL:@"getPolygonArea" dictionary:mdic dataArray:nil completion:^(NSDictionary *root) {
  229. [MBProgressHUD hideHUDForView:self.view];
  230. if (!root) {
  231. ShowMsg(@"数据请求失败,请重试");
  232. return;
  233. }
  234. if ([root[@"code"] integerValue] == 1) {
  235. ShowMsg(root[@"msg"]);
  236. return;
  237. }
  238. eArea = [root[@"body"] integerValue];
  239. if (eArea < 1) {
  240. ShowMsg(@"电子场地面积小于1(㎡),请重新采集!");
  241. return;
  242. }
  243. if (eArea <= [_infoDic[@"area"] floatValue] * 1.1) {
  244. //满足条件 可以提交
  245. UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:[NSString stringWithFormat:@"采集电子场地面积为%d(㎡),是否提交保存并送审?",(int)eArea] preferredStyle:UIAlertControllerStyleAlert];
  246. UIAlertAction * doneAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
  247. [self addRegion];
  248. }];
  249. UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"返回" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
  250. }];
  251. [alert addAction:doneAction];
  252. [alert addAction:cancelAction];
  253. [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alert animated:YES completion:nil];
  254. }else {
  255. //电子面积大于实际10% 重新采集或者修改实际面积
  256. UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:[NSString stringWithFormat:@"采集电子场地面积为%d(㎡),超出实际面积%@(㎡)的10%%,请重新采集围栏",(int)eArea,_infoDic[@"area"]] preferredStyle:UIAlertControllerStyleAlert];
  257. UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil];
  258. [alert addAction:cancelAction];
  259. [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentViewController:alert animated:YES completion:nil];
  260. }
  261. }];
  262. }
  263. - (void)addRegion{
  264. //判断网络是否连接
  265. if (![NetManager connectedToNetWork]) {
  266. showMsgUnconnect();
  267. return;
  268. }
  269. NSMutableArray *array = [NSMutableArray arrayWithCapacity:annotationArray.count];
  270. for (BMKPointAnnotation *annotation in annotationArray) {
  271. [array addObject:@{@"lat": [NSString stringWithFormat:@"%f",annotation.coordinate.latitude],@"lng":[NSString stringWithFormat:@"%f",annotation.coordinate.longitude]}];
  272. }
  273. NSMutableDictionary *mdic = [NSMutableDictionary dictionary];
  274. [mdic setValue:defUser.userDict[@"id"] forKey:@"userId"];
  275. [mdic setValue:_infoDic[@"name"] forKey:@"name"];
  276. [mdic setValue:[NSString stringWithFormat:@"%d",(int)eArea] forKey:@"area"];
  277. [mdic setValue:_infoDic[@"address"] forKey:@"address"];
  278. [mdic setValue:_infoDic[@"totalvehnum"] forKey:@"totalvehnum"];
  279. [mdic setValue:_infoDic[@"curvehnum"] forKey:@"curvehnum"];
  280. [mdic setValue:_infoDic[@"vehicletype"] forKey:@"vehicletype"];
  281. [mdic setValue:_infoDic[@"remark"] forKey:@"remark"];
  282. [mdic setValue:array forKey:@"dzwl"];
  283. [MBProgressHUD showLoadToView:self.view];
  284. [NetManager requestAnythingWithURL:@"addRegion" dictionary:mdic dataArray:nil completion:^(NSDictionary *root) {
  285. [MBProgressHUD hideHUDForView:self.view];
  286. if (!root) {
  287. ShowMsg(@"数据请求失败,请重试");
  288. return;
  289. }
  290. if ([root[@"code"] integerValue] == 1) {
  291. ShowMsg(root[@"msg"]);
  292. return;
  293. }
  294. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:root[@"msg"] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
  295. [alert show];
  296. }];
  297. }
  298. #pragma mark 地图
  299. //处理位置坐标更新
  300. - (void)BMKLocationManager:(BMKLocationManager *)manager didUpdateLocation:(BMKLocation *)location orError:(NSError *)error {
  301. self.userLocation.location = location.location;
  302. [_mapView updateLocationData:_userLocation];
  303. preCoordinate = _userLocation.location.coordinate;
  304. if (annotationArray.count < 1) {
  305. _mapView.centerCoordinate = _userLocation.location.coordinate;
  306. }
  307. }
  308. //标注的代理
  309. -(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
  310. {
  311. if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
  312. BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
  313. // newAnnotationView.pinColor = BMKPinAnnotationColorRed;
  314. if ([annotation.title isEqualToString:@"起点"]) {
  315. newAnnotationView.image = [UIImage imageNamed:@"icon_start"];
  316. }
  317. if ([annotation.title isEqualToString:@"过程点"]) {
  318. newAnnotationView.image = [UIImage imageNamed:@"icon_waypoint"];
  319. }
  320. if ([annotation.title isEqualToString:@"终点"]) {
  321. newAnnotationView.image = [UIImage imageNamed:@"icon_end"];
  322. }
  323. // 设置该标注点动画显示
  324. newAnnotationView.animatesDrop = NO;
  325. return newAnnotationView;
  326. }
  327. return nil;
  328. }
  329. //根据overlay生成对应的View
  330. - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay
  331. {
  332. if ([overlay isKindOfClass:[BMKPolyline class]]) {
  333. BMKPolylineView *polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
  334. polylineView.lineWidth = 3.0;
  335. polylineView.strokeColor = [UIColor redColor];
  336. return polylineView;
  337. }
  338. if ([overlay isKindOfClass:[BMKPolygon class]]){
  339. BMKPolygonView* polygonView = [[BMKPolygonView alloc] initWithOverlay:overlay];
  340. polygonView.strokeColor = [[UIColor redColor] colorWithAlphaComponent:1];
  341. polygonView.fillColor = [[UIColor redColor] colorWithAlphaComponent:0.3];
  342. polygonView.lineWidth = 3.0;
  343. polygonView.lineDash = YES;//虚实线
  344. return polygonView;
  345. }
  346. return nil;
  347. }
  348. - (BMKUserLocation *)userLocation {
  349. if (!_userLocation) {
  350. _userLocation = [[BMKUserLocation alloc] init];
  351. }
  352. return _userLocation;
  353. }
  354. @end