GMSTileURLConstructor返回缩放的奇怪数据

时间:2014-05-16 21:39:33

标签: ios google-maps google-maps-sdk-ios

我正在尝试使用GMSTileURLConstructor在Google Maps for iOS上绘制自定义叠加层。

我使用以下代码获取我的网址

GMSTileURLConstructor urls = ^(NSUInteger x, NSUInteger y, NSUInteger zoom) {
        NSString *url = @"";

        for (NSDictionary *limits in [selectedPropertyMap objectForKey:@"property_map_zoom_levels"]) {
            int zoomLevel = [[limits objectForKey:@"level"] intValue];
            int tileMinX = 0;
            int tileMaxX = 0;
            int tileMinY = 0;
            int tileMaxY = 0;

            if ([limits objectForKey:@"tile_min_x"] != (id)[NSNull null]) {
                tileMinX = [[limits objectForKey:@"tile_min_x"] intValue];
            }
            if ([limits objectForKey:@"tile_max_x"] != (id)[NSNull null]) {
                tileMaxX = [[limits objectForKey:@"tile_max_x"] intValue];
            }
            if ([limits objectForKey:@"tile_min_y"] != (id)[NSNull null]) {
                tileMinY = [[limits objectForKey:@"tile_min_y"] intValue];
            }
            if ([limits objectForKey:@"tile_max_y"] != (id)[NSNull null]) {
                tileMaxY = [[limits objectForKey:@"tile_max_y"] intValue];
            }

            if (zoomLevel == (unsigned long)zoom) {
                if ((tileMinX <= x) && (tileMaxX >= x) && (tileMinY <= y) && (tileMaxY >= y)) {
                    url = [NSString stringWithFormat:@"%@%@/%@/%@/%lu_%lu.png", MAP_URL, [property objectForKey:@"id"], [limits objectForKey:@"property_map_id"], [limits objectForKey:@"id"], (unsigned long)x, (unsigned long)y];
                    NSLog(@"url -> %@/zoom %lu/%i",url, (unsigned long)zoom, zoomLevel);
                    return [NSURL URLWithString:url];
                }
            }
        }
        return [NSURL URLWithString:url];
    };

当我注销URL,缩放和缩放级别时,我得到以下信息:

2014-05-16 17:25:15.621 Application[24491:61003] url -> <BASEURL>/16/9/19/159786_195303.png/zoom 19/19

同时,我在相机更改时记录相机变焦

- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position {
    zoomLevelLabel.text = [NSString stringWithFormat:@"ZL: %.2f",position.zoom];
    NSLog(@"camera changed - zoom %f",position.zoom);
    [self hideMarkersBasedOnZoom:position.zoom];
    if(position.zoom > 21) {
        GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:position.target.latitude longitude:position.target.longitude zoom:21];
        [mapView_ setCamera:camera];
    }
}

哪个日志

2014-05-16 17:25:15.640 Application[24491:60b] camera changed - zoom 18.022364

任何人都可以解释缩放级别值的差异以及如何正确匹配吗?

1 个答案:

答案 0 :(得分:7)

在我做了一些研究后,我认为Google处理GMSTileLayer缩放级别的方式与camera of mapView的缩放级别不同。

GMSTileLayer类参考

https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_tile_layer

  

在缩放级别0,整个世界是一个由单个图块覆盖的正方形,   并且该区块的坐标x和y均为0。在缩放级别1,   世界被4个瓦片覆盖,x和y为0或1,依此类推。

适用于mapView相机

https://developers.google.com/maps/documentation/ios/views#zoom

  

相机的缩放级别决定了地图的比例。在   更大的缩放级别可以在屏幕上看到更多细节,而在   更小的缩放级别可以在屏幕上看到更多的世界。在   缩放级别0,地图的比例是这样的,整个世界都有   宽度约为256点。

     

将缩放级别增加1可使世界的宽度增加一倍   屏幕。因此,在缩放级别N,世界的宽度近似   256 * 2N,即在缩放级别2,整个世界大约是1024   点广。请注意,缩放级别不必是整数。该   地图允许的缩放级别范围取决于数量   因素包括位置,地图类型和屏幕尺寸。

GMSTileLayer的缩放是 NSUInteger ,而camera的缩放是浮动。 GMSTileLayer的缩放用于确定块数。虽然相机的变焦用于根据公式 256 * 2N 确定点数

我可能错了,但我认为缩放级别都不会匹配。

不太相关:谷歌刚刚发布了iOS Maps SDK V1.8.1,它解决了与GMSTileLayer相关的问题,并修复了崩溃。