美文网首页iOS学习开发iOS 开发技巧
iOS 百度地图根据已知的经纬度画折线(包括大头针的自定义)

iOS 百度地图根据已知的经纬度画折线(包括大头针的自定义)

作者: 其实你懂De | 来源:发表于2019-01-07 15:05 被阅读2次
    WechatIMG1483.jpeg

    大概的需求,效果就是这样!
    好了,废话不多说,地图如何构建大家都会了吧,这里就不多说了。折线明显是个数组(经纬度)。所以我们需要初始化一个存储经纬度的数组。

    
    @property (nonatomic, strong) NSMutableArray *dataArray;//后台给的经纬度是倒序的
    @property (nonatomic, strong) NSArray *daoxuArray;//用一个数组把经纬度数组正序
    
               NSArray *arr = result[@"data"][@"items"];    //一个带有经纬度的数组            
               self.dataArray = [NSMutableArray array];
                         for (NSDictionary *dic in arr ) {
                                COSOverlayModel *model = [COSOverlayModel modelWithDictionary:dic];
                                [self.dataArray addObject:model];
                                
                            }
                            if (self.dataArray.count != 0) {
                                self.daoxuArray = [[self.dataArray reverseObjectEnumerator]allObjects];
                                
                                //绘制路线
                                CLLocationCoordinate2D paths[self.daoxuArray.count];//一个结构体初始化个数
                                for (NSInteger i = 0; i < self.daoxuArray.count; i++) {
                                    COSOverlayModel *model = self.daoxuArray[i];
                                    CLLocationDegrees latitude = [model.latitude doubleValue];
                                    CLLocationDegrees longitude = [model.longitude doubleValue];
                                    //表示经纬度的结构体 - 经度 纬度
                                    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
                                    BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
                                    annotation.coordinate = coordinate;
                                    
                                    paths[i].latitude = [model.latitude doubleValue];
                                    paths[i].longitude = [model.longitude doubleValue];
                                    if (i== self.dataArray.count - 1) {//最终以最后一个纬度为地图中心
                                        
                                        self.mapView.centerCoordinate = coordinate;//更新当前坐标点最后一个位置到地图中间(即终点)
                                    }
                                    [self.mapView addAnnotation:annotation];
                                    
                                }
                                
                                
                                //                    NSLog(@"%f--%f", coors[idx].latitude, coors[idx].longitude);
                                //                    NSLog(@"%f--%f", [mo.latitude doubleValue], [mo.longitude doubleValue]);
                                weakself.polyline = [BMKPolyline polylineWithCoordinates:paths count:self.daoxuArray.count];//初始化折线
                                
                                [weakself.mapView addOverlay:weakself.polyline];//将折线加入地图中
    
    // 两个代理方法
    //设置折线图
    - (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
        if ([overlay isKindOfClass:[BMKPolyline class]]){
            BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
            polylineView.strokeColor = [UIColor blueColor];
            polylineView.lineWidth = 2.0;
            
            return polylineView;
        }
        return nil;
    }
    //自定义大头针
    - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation {
        if ([annotation isKindOfClass:[BMKPointAnnotation class]])
        {
            static NSString *reuseIndetifier = @"annotationReuseIndetifier";
            BMKAnnotationView *annotationView = (BMKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseIndetifier];
            if (annotationView == nil)
            {
                annotationView = [[BMKAnnotationView alloc] initWithAnnotation:annotation
                                                               reuseIdentifier:reuseIndetifier];
            }
           
            
           //这之前逻辑没捋清楚,导致废了1个小时的时间
            for (int i = 0; i < self.daoxuArray.count; i++) {
                COSOverlayModel *model = self.daoxuArray[i];
                CGFloat lat = [model.latitude doubleValue];
                CGFloat lng = [model.longitude doubleValue];
                if (annotation.coordinate.latitude == lat && annotation.coordinate.longitude == lng) {//判断经纬度是否一一对应,然再做处理
                    if (i == self.dataArray.count - 1) {
                        annotationView.image = [UIImage imageNamed:@"Image_end"];//结束点
                        
                    }
                    if (i == 0) {
                        annotationView.image = [UIImage imageNamed:@"Image_start"];//开始点
                    }
                    
                }
                
            }
            
           
            
            return annotationView;
        }
        
    
        return nil;
    }
    

    好了简单的百度地图绘制路线完成了,起始点的大头针很好设置,终点的大头针思路没捋好导致浪费了很长时间,自己记录一下,借此大家也能少踩坑。菜鸡一个,代码写的很粗糙,希望大家提意见。有不明白的可以问我。

    相关文章

      网友评论

        本文标题:iOS 百度地图根据已知的经纬度画折线(包括大头针的自定义)

        本文链接:https://www.haomeiwen.com/subject/ydjurqtx.html