我的Google地图上有标记列表,修复了所有标记。现在我需要限制区域才可以在有限区域内滚动。如何可能。有人请帮我解决。
这是我的中心位置
let center = CLLocationCoordinate2DMake(11.250220, 75.781573)
let camera: GMSCameraPosition = GMSCameraPosition.camera(withLatitude: center.latitude, longitude: center.longitude, zoom: 18.0)
答案 0 :(得分:1)
首先定义两个指定要显示的区域范围的位置。这些可以是边界框的对角,或者只是两个位置,例如:
CLLocationCoordinate2D location1 =
CLLocationCoordinate2DMake(-33.8683, 151.2086); // Sydney
CLLocationCoordinate2D location2 =
CLLocationCoordinate2DMake(-31.9554, 115.8585); // Perth
如果您想要包含两个以上的点,您可以自己计算它们的界限。这也可以使用GMSCoordinateBounds完成,例如:
GMSCoordinateBounds* bounds =
[[GMSCoordinateBounds alloc]
initWithCoordinate: CLLocationCoordinate2DMake(-33.8683, 151.2086) // Sydney
andCoordinate: CLLocationCoordinate2DMake(-31.9554, 115.8585)]; // Perth
bounds = [bounds including:
CLLocationCoordinate2DMake(-12.4667, 130.8333)]; // Darwin
CLLocationCoordinate2D location1 = bounds.southWest;
CLLocationCoordinate2D location2 = bounds.northEast;
接下来,您需要以磅为单位获取地图视图的大小。你可以用这个:
float mapViewWidth = _mapView.frame.size.width;
float mapViewHeight = _mapView.frame.size.height;
现在您有了计算摄像机位置所需的信息:
MKMapPoint point1 = MKMapPointForCoordinate(location1);
MKMapPoint point2 = MKMapPointForCoordinate(location2);
MKMapPoint centrePoint = MKMapPointMake(
(point1.x + point2.x) / 2,
(point1.y + point2.y) / 2);
CLLocationCoordinate2D centreLocation = MKCoordinateForMapPoint(centrePoint);
double mapScaleWidth = mapViewWidth / fabs(point2.x - point1.x);
double mapScaleHeight = mapViewHeight / fabs(point2.y - point1.y);
double mapScale = MIN(mapScaleWidth, mapScaleHeight);
double zoomLevel = 20 + log2(mapScale);
GMSCameraPosition *camera = [GMSCameraPosition
cameraWithLatitude: centreLocation.latitude
longitude: centreLocation.longitude
zoom: zoomLevel];
然后,您可以使用此相机初始化地图视图,或将地图视图设置为此相机。
要编译此代码,您需要将MapKit框架添加到项目中,然后再导入它:
#import <MapKit/MapKit.h>
请注意,如果您的坐标跨越日期行,则此代码不会处理环绕。例如,如果您尝试在东京和夏威夷使用此代码,而不是显示太平洋地区,它将尝试显示几乎整个世界。在纵向模式下,无法缩小到足以看到左侧的夏威夷和右侧的东京,因此地图最终以非洲为中心,两个位置都不可见。如果您愿意,可以修改上面的代码来处理日期行的环绕。