我想在与我通过Google Directions API获取的路线JSON对应的地图上绘制路线:https : //developers.google.com/maps/documentation/directions/start
我已经弄清楚了如何从steps字段中提取纬度和经度,但是这并不能很好地遵循弯曲的道路。我认为我需要解码多义线信息,我找到了Google关于如何对多义线进行编码的说明:https : //developers.google.com/maps/documentation/utilities/polylinealgorithm
我确实在这里找到了一些适用于Android的代码以及有关解码折线的Javascript
但是我找不到用于Objective-C iPhone代码的代码,有人可以帮我吗?我敢肯定,如果需要的话,我可以自己做,但是如果某个地方已经可以使用,那肯定可以节省一些时间。
编辑:这里的关键是能够逐个字符地解码base64编码。更具体地说,我从Google的JSON中获得了类似的内容,该内容使用base64编码进行编码:
... "overview_polyline" : { "points" : "ydelDz~vpN_@NO@QEKWIYIIO?YCS@WFGBEBICCAE?G@y@RKBEBEBAD?HTpB@LALALCNEJEFSP_@LyDv@aB\\GBMB" }, ...
注意:我应该提到这个问题是针对Google Maps API v1的,在v2中使用GMSPolyLine polyLineWithPath进行此操作要容易得多,因为以下许多答案会告诉您(感谢@cdescours)。
我希望与该问题相关的链接到我自己的博客文章的规则不违反规则,但是我过去已经解决了这个问题。来自链接帖子的独立答案:
@implementation MKPolyline (MKPolyline_EncodedString) + (MKPolyline *)polylineWithEncodedString:(NSString *)encodedString { const char *bytes = [encodedString UTF8String]; NSUInteger length = [encodedString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; NSUInteger idx = 0; NSUInteger count = length / 4; CLLocationCoordinate2D *coords = calloc(count, sizeof(CLLocationCoordinate2D)); NSUInteger coordIdx = 0; float latitude = 0; float longitude = 0; while (idx < length) { char byte = 0; int res = 0; char shift = 0; do { byte = bytes[idx++] - 63; res |= (byte & 0x1F) << shift; shift += 5; } while (byte >= 0x20); float deltaLat = ((res & 1) ? ~(res >> 1) : (res >> 1)); latitude += deltaLat; shift = 0; res = 0; do { byte = bytes[idx++] - 0x3F; res |= (byte & 0x1F) << shift; shift += 5; } while (byte >= 0x20); float deltaLon = ((res & 1) ? ~(res >> 1) : (res >> 1)); longitude += deltaLon; float finalLat = latitude * 1E-5; float finalLon = longitude * 1E-5; CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(finalLat, finalLon); coords[coordIdx++] = coord; if (coordIdx == count) { NSUInteger newCount = count + 10; coords = realloc(coords, newCount * sizeof(CLLocationCoordinate2D)); count = newCount; } } MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coords count:coordIdx]; free(coords); return polyline; } @end