gpt4 book ai didi

ios - 如何在 mapKit 中获取路线长度

转载 作者:行者123 更新时间:2023-11-28 20:30:40 25 4
gpt4 key购买 nike

我正在使用 mapKit 绘制点到点的路线。我做到了。但我想获得路线长度而不是直线距离。

nextView.startPoint = [NSString stringWithFormat:@"%f,%f", userLatitude , userLongitude];
nextView.endPoint = [NSString stringWithFormat:@"%f,%f", 30.793636, 31.009641];
[diretions loadWithStartPoint:startPoint endPoint:endPoint options:options];

此外,我想给它一个中间点。

最佳答案

要做到这一点,您将不得不使用方向 API,最好是 Google Directions API .您应该查看该链接并通读它,Apple 没有内置的方向 API。您可以向它发送请求并要求 JSON 响应,我会使用 AFNetworking to make like easier (on Github)JSONKit also on Github为了那个原因。然后发送请求并解析 JSON 响应。在响应中,您需要编码点,这是一组基本上追踪路线的坐标。然后,您需要将其显示在叠加层上。以下是一些示例代码,但在复制并粘贴之前,请确保阅读 GDirections API 站点,您将更容易理解所有内容,并可以学习如何做更多事情:

// DRAG IN AFNETWORKING FILES AND JSON KIT FILES TO YOUR PROJECT AND ALSO IMPORT THE MAP KIT AND CORE LOCATION FRAMEWORKS

// IMPORT FILES

#import "StringHelper.h"
#import "JSONKit.h"
#import "AFJSONRequestOperation.h"
#import "AFHTTPClient.h"
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>

// DECLARE MUTABLE ARRAY IN .H:

NSMutableArray *_path;

// ADD THIS CODE TO WHEN YOU WANT TO REQUEST FOR DIRECTIONS

AFHTTPClient *_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", location.coordinate.latitude, location.coordinate.longitude] forKey:@"origin"];

[parameters setObject:[NSString stringWithFormat:@"%f,%f", location2.coordinate.latitude, location2.coordinate.longitude] forKey:@"destination"];

[parameters setObject:@"false" forKey:@"sensor"];

[parameters setObject:@"driving" forKey:@"mode"];

[parameters setObject:@"metric" forKey: @"units"];

NSMutableURLRequest *request = [_httpClient requestWithMethod:@"GET" path: @"maps/api/directions/json" parameters:parameters];

request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

AFHTTPRequestOperation *operation = [_httpClient HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSInteger statusCode = operation.response.statusCode;

if (statusCode == 200) {

[self parseResponse:responseObject];

}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) { }];

[_httpClient enqueueHTTPRequestOperation:operation];

// NOW ADD THE PARSERESPONSE METHOD
- (void)parseResponse:(NSDictionary *)response {

NSString *status = [response objectForKey: @"status"];

NSArray *routes = [response objectForKey:@"routes"];

NSDictionary *routePath = [routes lastObject];

if (routePath) {

NSString *overviewPolyline = [[routePath objectForKey: @"overview_polyline"] objectForKey:@"points"];

_path = [self decodePolyLine:overviewPolyline];

NSInteger numberOfSteps = _path.count;

CLLocationCoordinate2D coordinates[numberOfSteps];
for (NSInteger index = 0; index < numberOfSteps; index++) {
CLLocation *location = [_path objectAtIndex:index];
CLLocationCoordinate2D coordinate = location.coordinate;

coordinates[index] = coordinate;
}

polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfSteps];
[self.mapView addOverlay:polyLine];
}

}

// IMPLEMENTING THE DECODEPOLYLINE METHOD:

-(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;

}


// IMPLEMENTING THE VIEWFOROVERLAY DELEGATE METHOD (MAKE SURE TO SET YOUR MAP VIEW'S DELEGATE TO SELF OR THIS WONT GET CALLED)

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay {

MKPolylineView *polylineView = [[MKPolylineView alloc] initWithPolyline:overlay];

polylineView.strokeColor = [UIColor blueColor];
polylineView.lineWidth = 5.0;
polylineView.alpha = 0.7;

return polylineView;

}

这应该会让您的定向路线启动并运行!

关于ios - 如何在 mapKit 中获取路线长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12234312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com