我正在使用Mapbox iOS SDK
在我的应用中显示地图。
我想显示从服务器获取的路由(来自Mapbox Javascript SDK
的编码折线)。
我似乎无法像Google Maps SDK
那样工作,
GMSPolyline *line = [GMSPolyline polylineWithPath:self.currentPath];
并在GMSMapView
实例上显示该路由。
我知道我可以使用MapboxDirections SDK
计算路线并获取MBRoute
,但我不想这样做,因为我已经从后端获取了编码的折线。
更新:
+ (NSMutableArray*)decodePolyLine:(NSMutableString*)encoded {
[encoded replaceOccurrencesOfString:@"\\" withString:@"\/" options:NSLiteralSearch range:NSMakeRange(0, [encoded length])];
[encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
options:NSLiteralSearch
range:NSMakeRange(0, [encoded length])];
NSInteger len = [encoded length];
NSInteger index = 0;
NSMutableArray *array = [[NSMutableArray alloc] init] ;
NSInteger lat=0;
NSInteger lng=0;
while (index < len) {
NSInteger b;
NSInteger shift = 0;
NSInteger result = 0;
do {
b = [encoded characterAtIndex:index++] - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = [encoded characterAtIndex:index++] - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
lng += dlng;
NSNumber *latitude = [[NSNumber alloc] initWithDouble:lat * 1e-5];
NSNumber *longitude = [[NSNumber alloc] initWithDouble:lng * 1e-5];
// printf("[%f,", [latitude doubleValue]);
// printf("%f]", [longitude doubleValue]);
CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude doubleValue] longitude:[longitude doubleValue]];
[array addObject:loc];
}
return array;
}
我发现此算法可从编码的折线中获取位置点,现在我可以在地图上显示路线,但该路线与实际道路有些偏离。 我能弄清楚为什么,我尝试过他们的游乐场,那里看上去很完美,但对我来说却不起作用。
请帮助我如何解决此路线问题。
谢谢