Show route between current and desired location on iPhone MapView

前端 未结 3 1725
说谎
说谎 2020-12-28 11:24

I want to show a route on a MKMapView between the current location and a desired location as an annotation.

What is the best way to do this?

相关标签:
3条回答
  • 2020-12-28 11:53

    I have try following code...it works very well in my project...try it..

    First download KMLParser.h and KMLParser.m from this link:-

    Also download DDAnnotation.h and DDAnnotation.m file from this link:-

    Now Create a View Controller Like SomeViewController.

    Add following library:-

    1. CoreLocation.framework
    2. MapKit.framework
    3. QuartzCore.framework

    In SomeViewController.h import KMLParser.h file.

    Write following code in SomeViewController.h

    #import <UIKit/UIKit.h>
    #import <MapKit/MapKit.h>
    #import "KMLParser.h"
    @interface SomeViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate, MKOverlay>{
    
        double currentLat;
        double currentLong;
    
        double desiredLatitude;
        double desiredLongitude;
    
        MKMapView *mapView;
        KMLParser *kml;
        NSMutableArray *annotations;
    
    } @property(nonatomic, retain)IBOutlet MKMapView *mapView;
    
    @end
    

    Now in the SomeViewController.xib drag and drop the MapView and give link it with mapView from File's Owner. Also set delegate of MapView to File's owner.

    Now in SomeViewController Write the following code:-

    #import "SomeViewController.h"
    #import <QuartzCore/QuartzCore.h>
    #import "DDAnnotation.h"
    
    @implementation SomeViewController
    @synthesize mapView;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        currentLat = 21.215538; //You can set current latitude here. 
        currentLong = 72.858753; //You can set current longitude here.
    
        desiredLatitude = 21.211976; //You can set destination latitude here.
        desiredLongitude = 72.851593; //You can set destination longitude here.
    
        MKCoordinateRegion region = {{0.0f, 0.0f}, {100.0f, 100.0f}};
        CLLocation* currentLocation = [[CLLocation alloc] initWithLatitude:currentLat longitude:currentLong];
        region.center = currentLocation.coordinate;
        region.span.longitudeDelta = 0.05;
        region.span.latitudeDelta  = 0.05;
    
        [self.mapView setRegion:region animated:YES];
    
        annotations=[[NSMutableArray alloc] init];
    
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = currentLat;
        theCoordinate.longitude = currentLong;
    
        DDAnnotation* myAnnotation=[[DDAnnotation alloc] init];
    
        myAnnotation.coordinate=theCoordinate;
        myAnnotation.title=@"You are here";
        myAnnotation.subtitle=@"Current location";
    
        [mapView addAnnotation:myAnnotation];
        [annotations addObject:myAnnotation];
    
        CLLocationCoordinate2D theCoordinate1;
        theCoordinate1.latitude = desiredLatitude;
        theCoordinate1.longitude = desiredLongitude;
    
        DDAnnotation* myAnnotation1=[[DDAnnotation alloc] init];
    
        myAnnotation1.coordinate=theCoordinate1;
        myAnnotation1.title=@"Desired Location's Title";
        myAnnotation1.subtitle= @"Desired Location's Sub-title";
    
        [mapView addAnnotation:myAnnotation1];
        [annotations addObject:myAnnotation1];
    
        NSString *path = [NSString stringWithFormat:@"http://maps.google.com/maps?f=d&hl=en&saddr=%f,%f&daddr=%f,%f&ie=UTF8&0&om=0&output=kml",currentLat,currentLong,desiredLatitude,desiredLongitude];
        NSLog(@" Path String : %@", path); 
        kml = [[KMLParser alloc] initWithURL:[NSURL URLWithString:path]];
        [kml parseKML];
    
        // Add all of the MKOverlay objects parsed from the KML file to the map.
        NSArray *overlays = [kml overlays];
        [self.mapView addOverlays:overlays];
    
    }
    
    
    #pragma mark MKMapViewDelegate
    
    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
    {
        return [kml viewForOverlay:overlay];
    }
    
    - (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation{
    
        // if it's the user location, just return nil.
        if ([annotation isKindOfClass:[MKUserLocation class]]){
            return nil;
        }
        else{
    
            static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
            MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc]
                                             initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];
            pinView.animatesDrop=YES;
            pinView.canShowCallout=YES;
            pinView.pinColor=MKPinAnnotationColorGreen;
    
    
            return pinView;
        }   
    }
    
    0 讨论(0)
  • 2020-12-28 11:55

    You have to compute your self the way points and draw the route as a layer. The is no public api to show route in a MKMapView.

    The fastest solution is to open maps app of the phone with the route.

    0 讨论(0)
  • 2020-12-28 12:04

    ///in .h add delegate MKMapViewDelegate

    ///in .m file

    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation     *)newLocation fromLocation:(CLLocation *)oldLocation
    {
    
         CLLocationCoordinate2D newcordinate =   newLocation.coordinate;
         CLLocationCoordinate2D oldcordinate =   oldLocation.coordinate;
    
           MKMapPoint * pointsArray =
                   malloc(sizeof(CLLocationCoordinate2D)*2);
    
               pointsArray[0]= MKMapPointForCoordinate(oldcordinate); 
               pointsArray[1]= MKMapPointForCoordinate(newcordinate);    
    
                MKPolyline *  routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
               free(pointsArray);
    
                [MapView addOverlay:routeLine];  //MkMapView declared in .h
    }
    
    //MKMapViewDelegate
    
    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
    {
        MKOverlayView* overlayView = nil;
    
    
              MKPolylineView  * _routeLineView = [[[MKPolylineView alloc]                   initWithPolyline:self.routeLine] autorelease];
                _routeLineView.fillColor = self.PathColor;
               _routeLineView.strokeColor = self.PathColor;
              _routeLineView.lineWidth = 15;
                _routeLineView.lineCap = kCGLineCapSquare;
    
    
                overlayView = _routeLineView;
    
                return overlayView;
    
    }
    
    0 讨论(0)
提交回复
热议问题