ios – 将GMSVisibleRegion转换为CLRegion或MKCoordinateRegion

前端之家收集整理的这篇文章主要介绍了ios – 将GMSVisibleRegion转换为CLRegion或MKCoordinateRegion前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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);

猜你在找的iOS相关文章