如何使用 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个步骤:
在驱动程序应用程序(使用 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];
}
}
然后在序列化此数组 (reRouteJSONString) 后通过 API 将此新路由的信息发送到服务器,如下所示:
NSError *error;
NSString *reRouteJSONString = @"";
NSData *reRouteJSONData = [NSJSONSerialization dataWithJSONObject: routeArray options:NSJSONWritingPrettyPrinted error:&error];
reRouteJSONString = [[NSString alloc] initWithData: reRouteJSONData encoding:NSUTF8StringEncoding] ;
现在在骑手应用程序中,如下操作此信息并形成新的路线折线:
-(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];
}
我正在开发两个类似于 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个步骤:
在驱动程序应用程序(使用 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]; } }
然后在序列化此数组 (reRouteJSONString) 后通过 API 将此新路由的信息发送到服务器,如下所示:
NSError *error; NSString *reRouteJSONString = @""; NSData *reRouteJSONData = [NSJSONSerialization dataWithJSONObject: routeArray options:NSJSONWritingPrettyPrinted error:&error]; reRouteJSONString = [[NSString alloc] initWithData: reRouteJSONData encoding:NSUTF8StringEncoding] ;
现在在骑手应用程序中,如下操作此信息并形成新的路线折线:
-(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]; }