如何使用 MBRoute (Mapbox) 获取 MKPolyline (Mapkit)

How to get MKPolyline (Mapkit) using MBRoute (Mapbox)

我正在开发两个类似于 Ola/Uber 的应用程序,一个 driver 应用程序,另一个是乘客应用程序。 driver 应用程序使用 mapbox 进行导航,而骑手应用程序使用简单的 mapkit 和 google API。当 driver re-routes 正在骑行时,我的问题就开始了,骑手应用程序也必须追踪 driver 的新路径。现在应用的逻辑如下:在 mapbox 的 didRerouteAlongRoute 委托中,driver 应用程序通知服务器它有 re-routed 沿着这条特定的 MBRoute 路线。服务器依次通知并将此信息传递给骑手应用程序。问题是这个 MBRoute 数据类型在骑手端不可用,因为它使用 mapkit 而不是 mapbox,我必须以某种方式转换此信息,以便我可以使用 MKPolyline 创建与 driver 应用程序相同的新路线骑手结束。感谢任何帮助。

此 api 最初在骑手端用于制作路线折线:https://maps.googleapis.com/maps/api/directions/json

最后我设法满足了要求。它包括以下3个步骤:

  1. 在驱动程序应用程序(使用 mapbox 框架)中,在 didRerouteAlongRoute 委托中,创建一个包含新路线的 latitude/longitude 字典的数组,如下所示:

    -(void)navigationViewController:(MBNavigationViewController*)navigationViewController didRerouteAlongRoute:(MBRoute*)route{
    
    CLLocationCoordinate2D *routeCoordinates = malloc(route.coordinateCount *sizeof(CLLocationCoordinate2D));
    [route getCoordinates:routeCoordinates];
    
    NSMutableArray *routeArray = [NSMutableArray new];
    for (NSValue *value in route.coordinates) {
    CLLocationCoordinate2D coordinate;
    [value getValue:&coordinate];
    NSDictionary *coDic = @{@"latitude" : [NSNumber numberWithDouble: coordinate.latitude],
                            @"longitude": [NSNumber numberWithDouble: coordinate.longitude]};
    [routeArray addObject:coDic];
                                          }
    }
    
  2. 然后在序列化此数组 (reRouteJSONString) 后通过 API 将此新路由的信息发送到服务器,如下所示:

    NSError *error;
    NSString *reRouteJSONString = @"";
    NSData *reRouteJSONData = [NSJSONSerialization dataWithJSONObject: routeArray options:NSJSONWritingPrettyPrinted error:&error];
    reRouteJSONString = [[NSString alloc] initWithData: reRouteJSONData encoding:NSUTF8StringEncoding] ;
    
  3. 现在在骑手应用程序中,如下操作此信息并形成新的路线折线:

    -(void)makeReroutePolyline:(NSString*)serialisedString{
    
    MKMapView *mapView;
    mapView.delegate = self;
    
    NSError *jsonError;
    NSData *objectData = [serialisedString dataUsingEncoding:NSUTF8StringEncoding];
    NSArray *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError];
    
    CLLocationCoordinate2D coordinates[json.count];
    for (NSInteger index = 0; index < json.count; index++) {
    CLLocationCoordinate2D coordinate = { [[json objectAtIndex:index][@"latitude"] doubleValue], [[json objectAtIndex:index][@"longitude"] doubleValue] };
    coordinates[index] = coordinate;
    }
    
    MKPolyline *routeLine;
    routeLine = [MKPolyline polylineWithCoordinates:coordinates count:json.count];
    [mapView addOverlay:routeLine];
    [mapView setVisibleMapRect:[routeLine boundingMapRect] edgePadding:UIEdgeInsetsZero animated:YES];
    
    }