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

后端 未结 13 1005
孤街浪徒
孤街浪徒 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:44

    The other answers here seem to be about using Apple Maps, for using Google Maps I found I had to make some modifications to @SedateAlien's great category.

    MODIFIED CATEGORY

    + (GMSPolyline *)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;
            }
        }
    
        GMSMutablePath *path = [[GMSMutablePath alloc] init];
    
        int i;
        for (i = 0; i < coordIdx; i++)
        {
            [path addCoordinate:coords[i]];
        }
    
        GMSPolyline *polyline = [GMSPolyline polylineWithPath:path];
        free(coords);
    
        return polyline;
    }
    

    USAGE

    // Here I make the call to the Google Maps API to get the routes between two points...
    
    ....
    
    // Get the encoded array of points.
    NSString *points = routes[@"routes"][0][@"overview_polyline"][@"points"];
    
    // Use the modified category to get a polyline from the points.
    GMSPolyline *polyline = [GMSPolyline polylineWithEncodedString:points];
    
    // Add the polyline to the map.
    polyline.strokeColor = [UIColor redColor];
    polyline.strokeWidth = 10.f;
    polyline.map = theMapView;
    }
    

提交回复
热议问题