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