Показать маршрут между текущим и желаемым местоположением на iPhone MapView - PullRequest
4 голосов
/ 22 декабря 2011

Я хочу показать маршрут в MKMapView между текущим местоположением и желаемым местоположением в качестве аннотации.

Каков наилучший способ сделать это?

Ответы [ 3 ]

8 голосов
/ 22 декабря 2011

/// в .h добавить делегата MKMapViewDelegate

/// в .m файле

- (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;

}
2 голосов
/ 24 декабря 2011

Я попробую следующий код ... он очень хорошо работает в моем проекте ... попробуйте ..

Сначала загрузите KMLParser.h и KMLParser.m по этой ссылке:-

Также загрузите файлы DDAnnotation.h и DDAnnotation.m из этой ссылки: -

Теперь создайте контроллер представления, например SomeViewController.

Добавить следующеебиблиотека: -

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

В SomeViewController.h импортировать KMLParser.hфайл.

Запишите следующий код в 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

Теперь в SomeViewController.xib перетащите MapView и дайте ссылку на него с mapView от владельца файла.Также установите делегата MapView на владельца файла.

Теперь в SomeViewController Напишите следующий код: -

#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 голосов
/ 22 декабря 2011

Вы должны самостоятельно рассчитать путевые точки и нарисовать маршрут в виде слоя.Это не общедоступный API для отображения маршрута в MKMapView.

Самое быстрое решение - открыть приложение карты телефона с маршрутом.

...