IOS6 IOS7 Mapkit draw Rout(地图划线)

IOS7  比较简单

    CLLocationCoordinate2D  _start2D;

    CLLocationCoordinate2D  _end2D;

 NSArray *_routes;

//公用方法 见后面

        [self centerMap:_routes];

 

IOS6 IOS7 Mapkit  draw  Rout(地图划线)
#pragma mark - ios7  mapView delegate
- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id<MKAnnotation>)annotation {
    MKAnnotationView *annView;
    if (annotation == _startPoint) {
        //标注
        annView = [[MKAnnotationView alloc] initWithAnnotation:_startPoint reuseIdentifier:@"_start2D"];
        annView.image= [UIImage imageNamed:@"start_location"];

    }
    if (annotation == _endPoint) {
        annView = [[MKAnnotationView alloc] initWithAnnotation:_endPoint reuseIdentifier:@"_end2D"];
        
        annView.image= [UIImage imageNamed:@"end_location"];
    }
    
    return annView;
}

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
    MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
    renderer.strokeColor = lineColor;
    renderer.lineWidth = lineW;
    return  renderer;
}
IOS6 IOS7 Mapkit  draw  Rout(地图划线)

回调

IOS6 IOS7 Mapkit  draw  Rout(地图划线)
#pragma mark - 请求路径
-(void)requestRoutWithSoure:(CLLocationCoordinate2D) start2D  Destination:(CLLocationCoordinate2D)end2D
{
    MKDirectionsRequest *directionsRequest = [[MKDirectionsRequest alloc] init];
    directionsRequest.transportType = MKDirectionsTransportTypeAutomobile;
    
    MKPlacemark *startMark = [[MKPlacemark    alloc] initWithCoordinate:start2D addressDictionary:nil];
    MKPlacemark *endMark = [[MKPlacemark    alloc] initWithCoordinate:end2D addressDictionary:nil];
    
    MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMark];
    MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMark];
    
    [directionsRequest setSource:startItem];
    [directionsRequest setDestination:endItem];
    
    MKDirections *directions = [[MKDirections alloc] initWithRequest:directionsRequest];
    //接收rout
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
        
        if (!response) {
            return ;
        }
        _routes  = [response routes];
        [_routes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            MKRoute *rout = obj;
            MKPolyline *line = [rout polyline];
            [_mapView addOverlay:line];
        }];
        //根据 routes  数据 确定region的呈现范围
        [self centerMap:_routes];
        
    }];
}
IOS6 IOS7 Mapkit  draw  Rout(地图划线)

 

IOS6

需要文件  ....google

#import "RegexKitLite.h"

 

   UIImageView *  _routeView;

    NSArray *_routes;

IOS6 IOS7 Mapkit  draw  Rout(地图划线)
_routeView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, _mapView.frame.size.width, _mapView.frame.size.height)];
        
        _routeView.userInteractionEnabled = NO;
        [_mapView addSubview:_routeView];
        if(_routes) {
            [_mapView removeAnnotations:[_mapView annotations]];
        }
        _routes = [self calculateRoutesFrom:_start2D to:_end2D] ;
        //根据数组画线
        [self updateRouteView:_routes RouteView:_routeView];
        //根据线路确定呈现范围
        [self centerMap:_routes];
IOS6 IOS7 Mapkit  draw  Rout(地图划线)
IOS6 IOS7 Mapkit  draw  Rout(地图划线)
#pragma mark - ios6 mapView

-(NSArray*) calculateRoutesFrom:(CLLocationCoordinate2D) f to: (CLLocationCoordinate2D) t {
    
    NSString* saddr;
    NSString* daddr;
    
    saddr = [NSString stringWithFormat:@"%f,%f", f.latitude, f.longitude];
    daddr = [NSString stringWithFormat:@"%f,%f", t.latitude, t.longitude];
    
    
    NSString* apiUrlStr = [NSString stringWithFormat:@"http://maps.google.com/maps?output=dragdir&saddr=%@&daddr=%@", saddr, daddr];
    
    NSURL* apiUrl = [NSURL URLWithString:apiUrlStr];
    NSString *apiResponse = [NSString stringWithContentsOfURL:apiUrl encoding:NSASCIIStringEncoding error:nil];
    
    NSString *encodedPoints = [apiResponse stringByMatching:@"points:\\\"([^\\\"]*)\\\"" capture:1L];
    
    return [self decodePolyLine:[encodedPoints mutableCopy]:f to:t];
}
//解码
-(NSMutableArray *)decodePolyLine: (NSMutableString *)encoded :(CLLocationCoordinate2D)f to: (CLLocationCoordinate2D) t {
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                options:NSLiteralSearch
                                  range:NSMakeRange(0, [encoded length])];
    NSInteger len = [encoded length];
    NSInteger index = 0;
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSInteger lat=0;
    NSInteger lng=0;
    while (index < len) {
        NSInteger b;
        NSInteger shift = 0;
        NSInteger result = 0;
        do {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5];
        NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5];
        CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue]
                                                     longitude:[longitude floatValue]];
        [array addObject:loc];
    }
    CLLocation *first = [[CLLocation alloc] initWithLatitude:[[NSNumber numberWithFloat:f.latitude] floatValue]
                                                   longitude:[[NSNumber numberWithFloat:f.longitude] floatValue] ];
    CLLocation *end = [[CLLocation alloc] initWithLatitude:[[NSNumber numberWithFloat:t.latitude] floatValue]
                                                 longitude:[[NSNumber numberWithFloat:t.longitude] floatValue] ];
    [array insertObject:first atIndex:0];
    [array addObject:end];
    
    return array;
}
//用routes数组的内容 确定region的呈现范围
-(void) centerMap:(NSArray *)routesArr {
    MKCoordinateRegion region;
    
    CLLocationDegrees maxLat = -90;
    CLLocationDegrees maxLon = -180;
    CLLocationDegrees minLat = 90;
    CLLocationDegrees minLon = 180;
    for(int idx = 0; idx < routesArr.count; idx++)
    {
        CLLocation* currentLocation = [routesArr objectAtIndex:idx];
        if(currentLocation.coordinate.latitude > maxLat)
            maxLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.latitude < minLat)
            minLat = currentLocation.coordinate.latitude;
        if(currentLocation.coordinate.longitude > maxLon)
            maxLon = currentLocation.coordinate.longitude;
        if(currentLocation.coordinate.longitude < minLon)
            minLon = currentLocation.coordinate.longitude;
    }
    region.center.latitude     = (maxLat + minLat) / 2;
    region.center.longitude    = (maxLon + minLon) / 2;
    region.span.latitudeDelta  = maxLat - minLat;
    region.span.longitudeDelta = maxLon - minLon;
    
    [_mapView setRegion:region animated:YES];
}

//用routes数组的内容  在 UIImageView 上画线
-(void) updateRouteView:(NSArray *)routesArr RouteView:(UIImageView *)routeImg {
    CGContextRef context = CGBitmapContextCreate(nil,
                                                 routeImg.frame.size.width,
                                                 routeImg.frame.size.height,
                                                 8,
                                                 4 * routeImg.frame.size.width,
                                                 CGColorSpaceCreateDeviceRGB(),
                                                 kCGImageAlphaPremultipliedLast);
    
    CGContextSetStrokeColorWithColor(context, lineColor.CGColor);
    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
    CGContextSetLineWidth(context, lineW);
    
    for(int i = 0; i < routesArr.count; i++) {
        CLLocation* location = [routesArr objectAtIndex:i];
        CGPoint point = [_mapView convertCoordinate:location.coordinate toPointToView:routeImg];
        
        if(i == 0) {
            CGContextMoveToPoint(context, point.x, routeImg.frame.size.height - point.y);
        } else {
            CGContextAddLineToPoint(context, point.x, routeImg.frame.size.height - point.y);
        }
    }
    
    CGContextStrokePath(context);
    
    CGImageRef image = CGBitmapContextCreateImage(context);
    UIImage* img = [UIImage imageWithCGImage:image];
    
    routeImg.image = img;
    CGContextRelease(context);
    
}

#pragma mark mapView delegate functions
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    _routeView.hidden = YES;
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    [self updateRouteView:_routes RouteView:_routeView];
    _routeView.hidden = NO;
    [_routeView setNeedsDisplay];
}
IOS6 IOS7 Mapkit  draw  Rout(地图划线)

IOS6 IOS7 Mapkit draw Rout(地图划线),布布扣,bubuko.com

IOS6 IOS7 Mapkit draw Rout(地图划线)

上一篇:Create new Android Virtual Device时不能创建


下一篇:ThinkAndroid框架 网络状态监听原理