我正在使用GoogleMaps SDK,目前我正在尝试将GMSVisibleRegion转换为CLRegion.
GMSVisibleRegion定义为:
typedef struct { CLLocationCoordinate2D nearLeft; CLLocationCoordinate2D nearRight; CLLocationCoordinate2D farLeft; CLLocationCoordinate2D farRight; } GMSVisibleRegion;
最快的方法是什么?
不幸的是,很难理解开发人员在命名“near”和“far”时的含义.我认为这个评论也很有用:
/** * Returns the region (four location coordinates) that is visible according to * the projection. * * The visible region can be non-rectangular. The result is undefined if the * projection includes points that do not map to anywhere on the map (e.g.,* camera sees outer space). */ - (GMSVisibleRegion)visibleRegion;
非常感谢!
编辑:
好吧,我的第一步是创建一个GMSVisibleRegion的MKCoordinateRegion.
我建议使用以下代码将GMSVisibleRegion转换为MKCoordinateRegion.任何异议.
+ (MKCoordinateRegion)regionForCenter:(CLLocationCoordinate2D)center andGMSVisibleRegion:(GMSVisibleRegion)visibleRegion { CLLocationDegrees latitudeDelta = visibleRegion.farLeft.latitude - visibleRegion.nearLeft.latitude; CLLocationDegrees longitudeDelta = visibleRegion.farRight.longitude - visibleRegion.farLeft.longitude; MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta,longitudeDelta); return MKCoordinateRegionMake(center,span); }
解决方法
我的猜测是“靠近”是屏幕底部视图的角落,“远”是指屏幕顶部的角落.这是因为如果您倾斜视图,则底角最靠近相机,顶角距离相机最远.
将其转换为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.它可以使用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);