MapKit – 使地图放大时使路线沿着街道

我写了一个简单的应用程序,它在MapKit上的两个位置之间绘制路线。 我正在使用Google Map API。 我使用了我在网上find的资源,这里是我用来向Google提出请求的代码:

_httpClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://maps.googleapis.com/"]]; [_httpClient registerHTTPOperationClass: [AFJSONRequestOperation class]]; [_httpClient setDefaultHeader:@"Accept" value:@"application/json"]; NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; [parameters setObject:[NSString stringWithFormat:@"%f,%f", coordinate.latitude, coordinate.longitude] forKey:@"origin"]; [parameters setObject:[NSString stringWithFormat:@"%f,%f", endCoordinate.latitude, endCoordinate.longitude] forKey:@"destination"]; [parameters setObject:@"true" forKey:@"sensor"]; NSMutableURLRequest *request = [_httpClient requestWithMethod:@"GET" path: @"maps/api/directions/json" parameters:parameters]; request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject){ NSInteger statusCode = operation.response.statusCode; if (statusCode == 200) { NSLog(@"Success: %@", operation.responseString); } else { NSLog(@"Status code = %d", statusCode); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", operation.responseString); } ]; [_httpClient enqueueHTTPRequestOperation:operation]; 

这工作完美无瑕。 当我跑这个,试图显示路线之间的洛杉矶和芝加哥,这是它的样子:

洛杉矶 - 芝加哥航线缩小了

但。 当我缩放地图到街道时,路线如下所示:

洛杉矶 - 芝加哥航线放大

有谁知道我怎样才能实现这个路线,我正在绘制地图放大后的街道? 我想要通过街道显示确切的path。 我不知道是否需要将一些其他参数添加到我对Google的请求中。

任何帮助或build议将是伟大的。 提前谢谢了!


[编辑#1:添加来自Google的请求url和回复]

从上面的代码创build操作对象后,我的请求URL如下所示:

 http://maps.googleapis.com/maps/api/directions/json?sensor=true&destination=34%2E052360,-118%2E243560&origin=41%2E903630,-87%2E629790 

只需将该url粘贴到您的浏览器中,您就会看到Google发送的JSON数据,作为我在代码中获得的响应。


[编辑#2:parsing来自Google的答案并构buildpath]

 - (void)parseResponse:(NSData *)response { NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableContainers error:nil]; NSArray *routes = [dictResponse objectForKey:@"routes"]; NSDictionary *route = [routes lastObject]; if (route) { NSString *overviewPolyline = [[route objectForKey: @"overview_polyline"] objectForKey:@"points"]; _path = [self decodePolyLine:overviewPolyline]; } } - (NSMutableArray *)decodePolyLine:(NSString *)encodedStr { NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[encodedStr length]]; [encoded appendString:encodedStr]; [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] initWithFloat:lat * 1e-5]; NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5]; CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]]; [array addObject:location]; } return array; } 

看起来谷歌并没有给你所有的观点,或者你没有看到所有的观点。 实际上,我认为地标之间的多段线不仅仅是像你这样的地标(用直线)。

  • 检查DirectionsStatus的回应,看看你是否有限
  • 提供Google发回的json数据。

我不太确定他们使用的是与Google使用的墨卡托投影极不相同的投影。

我相信MapKit使用的投影与Google地图使用的投影不同。 MapKit使用圆柱墨卡托 ,而谷歌使用墨卡托投影的变种

在坐标系之间转换虽然您通常使用经度和纬度值在地图上指定点,但有时您可能需要转换到其他坐标系或从其他坐标系转换。 例如,您通常在指定叠加层的形状时使用贴图点。

苹果引用: