【问题标题】:Wrong polyline drawing on map with Google Maps SDK使用 Google Maps SDK 在地图上绘制错误的折线
【发布时间】:2014-07-02 18:06:35
【问题描述】:

我正在尝试使用 Google Maps SDK 在我的地图上绘制路线。 This 是我正在调用的 URL,我将 JSON 响应解析为坐标数组:

    id jsonResponse = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];

    int points_count = 0;
    points_count = [[[[[[jsonResponse objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"steps"] count];

    NSArray *steps = nil;
    if (points_count && [[[[jsonResponse objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] count])
    {
        steps = [[[[[jsonResponse objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"steps"];
    }

    NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:points_count];
    for (int i = 0; i < points_count; i++)
    {
        NSDictionary *start;
        NSDictionary *finish;

        double st_lat = [[[[steps objectAtIndex:i] objectForKey:@"start_location"] valueForKey:@"lat"] doubleValue];
        double st_lon = [[[[steps objectAtIndex:i] objectForKey:@"start_location"] valueForKey:@"lng"] doubleValue];

        if (st_lat > 0.0f && st_lon > 0.0f)
        {
            start = @{ @"latitude" : [NSNumber numberWithDouble:st_lat], @"longitude" : [NSNumber numberWithDouble:st_lon] };
        }

        double end_lat = [[[[steps objectAtIndex:i] objectForKey:@"end_location"] valueForKey:@"lat"] doubleValue];
        double end_lon = [[[[steps objectAtIndex:i] objectForKey:@"end_location"] valueForKey:@"lng"] doubleValue];

        if (end_lat > 0.0f && end_lon > 0.0f)
        {
            finish = @{ @"latitude" : [NSNumber numberWithDouble:end_lat], @"longitude" : [NSNumber numberWithDouble:end_lon] };
        }

        [coordinates addObject:@{ @"start" : start, @"finish" : finish }];
    }

然后用这种方法在地图视图上绘图:

GMSMutablePath *path = [GMSMutablePath path];
for (NSDictionary *d in directions)
{
    NSDictionary *start = d[@"start"];
    NSDictionary *finish = d[@"finish"];

    CLLocationCoordinate2D c_start = CLLocationCoordinate2DMake([start[@"latitude"] doubleValue], [start[@"longitude"] doubleValue]);
    CLLocationCoordinate2D c_finish = CLLocationCoordinate2DMake([finish[@"latitude"] doubleValue], [finish[@"longitude"] doubleValue]);

    [path addCoordinate:c_start];
    [path addCoordinate:c_finish];
}

GMSPolyline *line = [GMSPolyline polylineWithPath:path];
line.strokeColor = [UIColor redColor];
line.strokeWidth = 2.0f;
line.map = self.mapView;

为什么它是那样画而不是自己上街?

我在这里做错了什么?

【问题讨论】:

    标签: ios objective-c google-maps google-maps-sdk-ios polyline


    【解决方案1】:

    试试这个,它会像在驾驶模式下一样绘制确切的路径 - StreetMode,这是我的代码:

    iOS GSMPolyLine

    【讨论】:

    • @adijazz91 我会崩溃,如果我保持在同一个位置并且你有样品请发送
    【解决方案2】:

    所以问题是我使用了start_locationend_location 而不是polyline -> points。将我的代码修复为:

    请求网址例如:https://maps.googleapis.com/maps/api/directions/json?origin=40.716072,-74.008836&amp;destination=40.697545,-73.983892&amp;sensor=false&amp;waypoints=optimize:true&amp;mode=driving

    id jsonResponse = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
    
    int points_count = 0;
    points_count = [[[[[[jsonResponse objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"steps"] count];
    
    NSArray *steps = nil;
    if (points_count && [[[[jsonResponse objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] count])
    {
        steps = [[[[[jsonResponse objectForKey:@"routes"] objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0] objectForKey:@"steps"];
    }
    
    NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:points_count];
    for (int i = 0; i < points_count; i++)
    {
        NSString *toDecode = [[[steps objectAtIndex:i] objectForKey:@"polyline"] valueForKey:@"points"];
        NSArray *locations = [AppUtils decodePolylineWithString:toDecode];
    
        for (int i = 0 ; i < locations.count ; i++)
        {
            if (i != locations.count - 1) {
                CLLocation *start = [locations objectAtIndex:i];
                CLLocation *finish = [locations objectAtIndex:i + 1];
                [coordinates addObject:@{ @"start" : start, @"finish" : finish }];
            }
        }
    }
    
    GMSMutablePath *path = [GMSMutablePath path];
    for (NSDictionary *d in directions)
    {
        CLLocation *start = d[@"start"];
        CLLocation *finish = d[@"finish"];
    
        [path addCoordinate:start.coordinate];
        [path addCoordinate:finish.coordinate];
    }
    
    GMSPolyline *line = [GMSPolyline polylineWithPath:path];
    line.strokeColor = [UIColor redColor];
    line.strokeWidth = 2.0f;
    line.map = self.mapView;
    
    
    + (NSArray*)decodePolylineWithString:(NSString *)encodedString
    {
        NSMutableArray *coordinates = [NSMutableArray array];
        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;
            CLLocation *location = [[CLLocation alloc] initWithLatitude:finalLat longitude:finalLon];
            [coordinates addObject:location];
    
            if (coordIdx == count) {
                NSUInteger newCount = count + 10;
                coords = realloc(coords, newCount * sizeof(CLLocationCoordinate2D));
                count = newCount;
            }
        }
    
        free(coords);
        return coordinates;
    }
    

    我知道这有点脏,但这是有效的,而且效果很好。

    享受吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 2020-03-05
      相关资源
      最近更新 更多