iOS MapKit通过道路在地图上连接多个点

我正在使用此代码连接折线上的针脚(地图上的点):

CLLocationCoordinate2D coordinates[allLocations.count]; int i = 0; for (locHolder *location in allLocations) { coordinates[i] = CLLocationCoordinate2DMake([location.lat floatValue], [location floatValue]); i++; } MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinates count:[allLocations count]]; self->polyline = polyline; [self.mapView addOverlay:self->polyline level:MKOverlayLevelAboveRoads]; 

但是这个代码将它们连接在空中(忽略道路),是否有可能将多个CLLocationCoordinate2D位置连接到沿着道路的多段线?

**还有一个小问题,[allLocations count]和allLocations.count之间的性能是否有差异?

谢谢。

在这些日子里,我遇到了同样的问题,在这里和那里寻找答案,我发现Rob的 这个答案对这种情况非常有用。

首先,在MapViewController中包含一个包含一个目标的对象数组,每一个对象的types都是CLLocationCoordinate2D

在你的MapViewController.h中

 @property (nonatomic, strong) NSArray *locations; 

然后,在实现中,用一些像这样的数据填充该数组:

 _locations = [NSArray arrayWithObjects: [RouteObject routeWithOrigin:CLLocationCoordinate2DMake(-23.595571, -46.684408) destination:CLLocationCoordinate2DMake(-23.597886, -46.673950)], [RouteObject routeWithOrigin:CLLocationCoordinate2DMake(-23.597886, -46.673950) destination:CLLocationCoordinate2DMake(-23.597591, -46.666805)], [RouteObject routeWithOrigin:CLLocationCoordinate2DMake(-23.597591, -46.666805) destination:CLLocationCoordinate2DMake(-23.604061, -46.662728)], nil]; 

现在你已经有了你的原点和目的地,你可以开始在它们之间画一条路线(从A到B,从B到C,从C到D)。

添加一个button,然后连接一个IBAction所以在这个方法中你将要做的魔法。

 - (IBAction)btnDirectionsPressed:(id)sender { [self enableUI:NO]; // This method enables or disables all the UI elements that interact with the user dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // Create the semaphore __block NSMutableArray *routes = [[NSMutableArray alloc] init]; // Arrays to store MKRoute objects and MKAnnotationPoint objects, so then we can draw them on the map __block NSMutableArray *annotations = [[NSMutableArray alloc] init]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ for (RouteObject *routeObject in _locations) { MKDirectionsRequest *directionsRequest = [MKDirectionsRequest new]; [directionsRequest setTransportType:MKDirectionsTransportTypeAutomobile]; [directionsRequest setSource:[routeObject originMapItem]]; [directionsRequest setDestination:[routeObject destinationMapItem]]; [directionsRequest setRequestsAlternateRoutes:NO]; MKDirections *direction = [[MKDirections alloc] initWithRequest:directionsRequest]; // For each object in the locations array, we request that route from its origin and its destination [direction calculateDirectionsWithCompletionHandler: ^(MKDirectionsResponse *response, NSError *error) { if (error) { NSLog(@"There was an error getting your directions"); return; } MKRoute *route = [response.routes firstObject]; [routes addObject:route]; [annotations addObject:[routeObject destinationAnnotation]]; dispatch_semaphore_signal(semaphore); // Send the signal that one semaphore is ready to consume }]; } }); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ for (int i = 0; i < _locations.count; i++) { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); // Wait until one semaphore is ready to consume dispatch_async(dispatch_get_main_queue(), ^{ // For each element, dispatch to the main queue to draw route and annotation corresponding to that location MKRoute *route = routes[i]; [self.mapView addOverlay:route.polyline]; [self.mapView addAnnotation:annotations[i]]; }); } dispatch_async(dispatch_get_main_queue(), ^{ // Finally, dispatch to the main queue enabling elements and resizing map to show all the annotations [self enableUI:YES]; [self fitRegionToRoutes]; }); }); } 

希望这个帮助!

乔尔。