How to decode the Google Directions API polylines field into lat long points in Objective-C for iPhone?

后端 未结 13 991
孤街浪徒
孤街浪徒 2020-11-30 19:05

I want to draw routes on a map corresponding to directions JSON which I am getting through the Google Directions API: https://developers.google.com/maps/documentation/direct

13条回答
  •  旧巷少年郎
    2020-11-30 19:40

    If you are working with Google Map on iOS and want to draw the route including the polylines, google itself provides an easier way to get the GMSPath from polyline as,

    GMSPath *pathFromPolyline = [GMSPath pathFromEncodedPath:polyLinePoints];
    

    Here is the complete code:

    + (void)callGoogleServiceToGetRouteDataFromSource:(CLLocation *)sourceLocation toDestination:(CLLocation *)destinationLocation onMap:(GMSMapView *)mapView_{
        NSString *baseUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=false", sourceLocation.coordinate.latitude,  sourceLocation.coordinate.longitude, destinationLocation.coordinate.latitude,  destinationLocation.coordinate.longitude];
    
        NSURL *url = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    
        NSLog(@"Url: %@", url);
    
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    
            GMSMutablePath *path = [GMSMutablePath path];
    
            NSError *error = nil;
            NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
    
            NSArray *routes = [result objectForKey:@"routes"];
    
            NSDictionary *firstRoute = [routes objectAtIndex:0];
    
            NSDictionary *leg =  [[firstRoute objectForKey:@"legs"] objectAtIndex:0];
    
            NSArray *steps = [leg objectForKey:@"steps"];
    
            int stepIndex = 0;
    
            CLLocationCoordinate2D stepCoordinates[1  + [steps count] + 1];
    
            for (NSDictionary *step in steps) {
    
                NSDictionary *start_location = [step objectForKey:@"start_location"];
                stepCoordinates[++stepIndex] = [self coordinateWithLocation:start_location];
                [path addCoordinate:[self coordinateWithLocation:start_location]];
    
                NSString *polyLinePoints = [[step objectForKey:@"polyline"] objectForKey:@"points"];
                GMSPath *polyLinePath = [GMSPath pathFromEncodedPath:polyLinePoints];
                for (int p=0; p

提交回复
热议问题