iOS学习开发iOS 开发技巧

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

2019-01-07  本文已影响2人  其实你懂De
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;
}

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

上一篇下一篇

猜你喜欢

热点阅读