我的猜测是“近”是指屏幕底部视图的角落,而“远”是指屏幕顶部的角落。这是因为如果您倾斜了视图,那么底角离相机最近,顶角离相机最远。
将其转换为 a 的一种方法CLRegion
可能是使用相机的目标作为中心,然后计算从最大距离到四个角的半径。这可能不是该区域上最紧密的拟合圆,但由于圆无论如何都无法拟合视图的四边形,因此它可能足够接近。
这是一个辅助函数,用于计算两个CLLocationCoordinate
值之间的距离(以米为单位):
double getDistanceMetresBetweenLocationCoordinates(
CLLocationCoordinate2D coord1,
CLLocationCoordinate2D coord2)
{
CLLocation* location1 =
[[CLLocation alloc]
initWithLatitude: coord1.latitude
longitude: coord1.longitude];
CLLocation* location2 =
[[CLLocation alloc]
initWithLatitude: coord2.latitude
longitude: coord2.longitude];
return [location1 distanceFromLocation: location2];
}
然后CLRegion
可以这样计算:
GMSMapView* mapView = ...;
...
CLLocationCoordinate2D centre = mapView.camera.target;
GMSVisibleRegion* visibleRegion = mapView.projection.visibleRegion;
double nearLeftDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.nearLeft);
double nearRightDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.nearRight);
double farLeftDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.farLeft);
double farRightDistanceMetres =
getDistanceMetresBetweenLocationCoordinates(centre, visibleRegion.farRight);
double radiusMetres =
MAX(nearLeftDistanceMetres,
MAX(nearRightDistanceMetres,
MAX(farLeftDistanceMetres, farRightDistanceMetres)));
CLRegion region = [[CLRegion alloc]
initCircularRegionWithCenter: centre radius: radius identifier: @"id"];
更新:
关于您的更新MKCoordinateRegion
,您的示例代码可能不起作用。如果地图已旋转 90 度,则farLeft
和nearLeft
将具有相同的纬度,farRight
并且farLeft
将具有相同的经度,因此您的纬度和经度增量为零。
您需要遍历所有四个farLeft
, farRight
, nearLeft
, nearRight
,计算每个的纬度和经度的最小值和最大值,然后从中计算增量。
适用于 iOS 的 Google Maps SDK 包含一个帮助程序类,它已经为您完成了一些工作 - GMSCoordinateBounds
. 它可以用 a 初始化GMSVisibleRegion
:
GMSMapView* mapView = ...;
....
GMSVisibleRegion visibleRegion = mapView.projection.visibleRegion;
GMSCoordinateBounds bounds =
[[GMSCoordinateBounds alloc] initWithRegion: visibleRegion];
然后GMSCoordinateBounds
有northEast
和southWest
定义边界的属性。因此,您可以按如下方式计算增量:
CLLocationDegrees latitudeDelta =
bounds.northEast.latitude - bounds.southWest.latitude;
CLLocationDegrees longitudeDelta =
bounds.northEast.longitude - bounds.southWest.longitude;
您还可以从边界计算中心,因此MKCoordinateRegion
:
CLLocationCoordinate2D centre = CLLocationCoordinate2DMake(
(bounds.southWest.latitude + bounds.northEast.latitude) / 2,
(bounds.southWest.longitude + bounds.northEast.longitude) / 2);
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
return MKCoordinateRegionMake(centre, span);