如何在谷歌地图中设置受限区域或有限区域,斯威夫特

时间:2018-03-12 06:36:37

标签: ios swift google-maps

我的Google地图上有标记列表,修复了所有标记。现在我需要限制区域才可以在有限区域内滚动。如何可能。有人请帮我解决。

这是我的中心位置

 let center = CLLocationCoordinate2DMake(11.250220, 75.781573)


 let camera: GMSCameraPosition = GMSCameraPosition.camera(withLatitude: center.latitude, longitude: center.longitude, zoom: 18.0)

1 个答案:

答案 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>

请注意,如果您的坐标跨越日期行,则此代码不会处理环绕。例如,如果您尝试在东京和夏威夷使用此代码,而不是显示太平洋地区,它将尝试显示几乎整个世界。在纵向模式下,无法缩小到足以看到左侧的夏威夷和右侧的东京,因此地图最终以非洲为中心,两个位置都不可见。如果您愿意,可以修改上面的代码来处理日期行的环绕。