2013-11-04 3 views
26

Google지도는 최고의지도라고 알려져 있지만, 추가 라이브러리와 그 모든 것을 다운로드해야합니다. 나는 A 지점에서 B 지점으로의 빠른 경로를 얻고 그 지점에서 끝내기 위해 빠르고 간단하게하기를 원합니다. 내장 된 함수/라이브러리를 사용하여이를 수행 할 수있는 방법이 있습니까? 누군가 올바른 방향으로 나를 가리킬 수 있습니까?mkmapview에서 사과 API를 사용하여 길 찾기를 할 수있는 방법이 있습니까?

내 경우에는 회전 방향 또는 아무것도에 의해 켜려고하고 있지 않다

편집, 난 그냥 처음부터 끝까지 선을 그릴 싶습니다. 어쩌면 어떤 경로를 택할 지에 대한 옵션을 제공하십시오. 그것을 할 수있는 방법이 있습니까?

답변

64

iOS 7에서는 MKDirectionsRequest을 사용하여 길 찾기를하고 표시 할 수 있습니다. 당신이 아이폰 OS 7의 새로운면

MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init]; 
[request setSource:[MKMapItem mapItemForCurrentLocation]]; 
[request setDestination:myMapItem]; 
[request setTransportType:MKDirectionsTransportTypeAny]; // This can be limited to automobile and walking directions. 
[request setRequestsAlternateRoutes:YES]; // Gives you several route options. 
MKDirections *directions = [[MKDirections alloc] initWithRequest:request]; 
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { 
    if (!error) { 
     for (MKRoute *route in [response routes]) { 
      [myMapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels. 
      // You can also get turn-by-turn steps, distance, advisory notices, ETA, etc by accessing various route properties. 
     } 
    } 
}]; 

것은, 당신이 어떤 오버레이를 표시하기위한 mapView:rendererForOverlay: 방법을 구현해야합니다 : 여기

다른지도 항목으로 현재 위치에서 방향을 표시하기위한 몇 가지 예제 코드입니다 . 예 :

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolyline class]]) { 
     MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; 
     [renderer setStrokeColor:[UIColor blueColor]]; 
     [renderer setLineWidth:5.0]; 
     return renderer; 
    } 
    return nil; 
} 
+0

의 대리인이'MKMapItem'이 좌표 스위프트 버전 핵심 데이터. 어떻게 그 좌표를 다시'MKMapItem'으로 바꾸겠습니까? – Adrian

+1

@AdrianB 늦게 답변을 드려 죄송합니다. 좌표에서 인스턴스화 할 수있는 MKPlacemark를 사용하여 MKMapItem을 초기화 할 수 있습니다. – Kamaros

1

또 다른 가능성은 Apple지도 앱에 주소를 보내는 것입니다. 나는 이것이 전문적인 환경에서 이루어진 것을 보았고, 그것은 선택된 방법이었습니다. 당신이 만드는 당신이 핀에 태핑 경고 대화 상자를 표시하려면

-3

:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view  calloutAccessoryControlTapped:(UIControl *)control { 
[mapView deselectAnnotation:view.annotation animated:YES]; 

    if ([view.annotation isKindOfClass:[PinOfProject class]]) 
    { 
     CLLocationCoordinate2D coordinate = [view.annotation coordinate]; 
     MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil]; 
     MKMapItem *mapitem = [[MKMapItem alloc] initWithPlacemark:placemark]; 
     self.mapItem = mapitem; 

     CGPoint pin = [mapView convertCoordinate:view.annotation.coordinate toPointToView:self.view]; 
     CGRect rec = CGRectMake(pin.x-13, pin.y-14,view.frame.size.width,view.frame.size.height); 


     [self showAlertInformationForTrash:rec]; 

    } 
} 

-(void)showAlertInformationForTrash:(CGRect)rec{ 

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Show Route?" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Route", @"Cancel", nil]; 
    actionSheet.tag = 1; 
    [actionSheet showFromRect:rec inView:self.view animated:YES]; 
} 

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 0) { 
     [self showRouteToAnnotation]; 
    } 
} 

-(void)showRouteToAnnotation{ 
    MKMapItem *myMapItem = self.mapItem; 
    MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init]; 
    [request setSource:[MKMapItem mapItemForCurrentLocation]]; 
    [request setDestination:myMapItem]; 
    [request setTransportType:MKDirectionsTransportTypeAutomobile]; // This can be limited to automobile and walking directions. 
    [request setRequestsAlternateRoutes:NO]; // Gives you several route options. 
    MKDirections *directions = [[MKDirections alloc] initWithRequest:request]; 
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) { 
     if (!error) { 
      for (MKRoute *route in [response routes]) { 
       [self.mapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels. 
       for (int i = 0; i < route.steps.count; i++) { 
        MKRouteStep *step = [route.steps objectAtIndex:i]; 
        NSString *newStep = step.instructions; 
        NSLog(@"%@", newStep); 
       }                  
      } 
     } 
    }]; 
} 

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    if ([overlay isKindOfClass:[MKPolyline class]]) { 
     MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay]; 
     [renderer setStrokeColor:[UIColor blueColor]]; 
     [renderer setLineWidth:5.0]; 
     return renderer; 
    } 
    return nil; 
} 
  • 아,하지만 난 내 .H @property에 속성을 참고 (강한 비 원자) MKMapItem * mapItem;
2

 let request = MKDirectionsRequest(); 
     request.source = MKMapItem.mapItemForCurrentLocation(); 
     let locationPlacemark = MKPlacemark(coordinate: CLLocationCoordinate2DMake(13.724362, 100.515342), addressDictionary: nil); 
     request.destination = MKMapItem(placemark: locationPlacemark); 
     request.transportType = MKDirectionsTransportType.Any; 
     request.requestsAlternateRoutes = true; 
     let directions = MKDirections(request: request); 

     directions.calculateDirectionsWithCompletionHandler ({ 
      (response: MKDirectionsResponse?, error: NSError?) in 
      print(response?.description) 
      print(error?.description) 
      guard let response = response else { 
       //handle the error here 
       return; 
      } 
      self.myRoute = response.routes[0] 
      self.mkMapView.addOverlay(self.myRoute!.polyline) 
     }); 

내가 MKMapItem`s가`NSCoder` 호환되지 않는, 그래서 내가 저장 한`발견했습니다

 func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer { 
     let myLineRenderer = MKPolylineRenderer(polyline: (self.myRoute?.polyline)!) 
     myLineRenderer.strokeColor = UIColor.redColor() 
     myLineRenderer.lineWidth = 3 
     return myLineRenderer 
     } 
관련 문제