GMSTileURLConstructor返回缩放的奇怪数据
我正在尝试使用GMSTileURLConstructor
在Google Maps for iOS上绘制自定义叠加层。
我正在使用下面的代码来获取我的url
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,缩放和zoomLevel我得到以下信息:
2014-05-16 17:25:15.621 Application[24491:61003] url -> <BASEURL>/16/9/19/159786_195303.png/zoom 19/19
同时,当相机改变时,我正在logging相机变焦
- (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
任何人都可以解释缩放级别值的差异,以及如何适当匹配?
在我做了一些研究后,我相信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时,世界被x和y为0或1的4个瓦片覆盖,依此类推。
对于mapView相机
https://developers.google.com/maps/documentation/ios/views#zoom
相机的缩放级别决定了地图的比例。 在更大的缩放级别上,可以在屏幕上看到更多的细节,而在更小的缩放级别下,可以在屏幕上看到更多的世界。 在缩放级别0时,地图的比例是整个世界的宽度大约为256点。
将缩放级别提高1倍,屏幕上的世界宽度就会加倍。 因此,在缩放级别N处,世界的宽度大约是256 * 2N,即在缩放级别2时,整个世界大约为1024点宽度。 请注意,缩放级别不需要是整数。 地图允许的缩放级别范围取决于许多因素,包括位置,地图types和屏幕大小。
GMSTileLayer
的缩放是NSUInteger,而camera
的缩放是浮动的 。 GMSTileLayer的缩放用于确定图块的数量 。 而摄像机的缩放则用于根据公式256 * 2N确定点数 。
我可能是错的,但我认为这两个缩放级别不匹配。
不太相关:Google刚刚发布了iOS Maps SDK V1.8.1,解决了与GMSTileLayer相关的问题,并修复了崩溃问题。