Iphone 将MKMapView缩放到CLRegion

Iphone 将MKMapView缩放到CLRegion,iphone,ios5,mkmapview,Iphone,Ios5,Mkmapview,我在iOS5上使用CLGeocoder获得了一个CLPlacemark。现在我想把一个地标的区域(CLRegion对象)放大到那个区域,这到底是怎么可能的 我想要的是相反的,但似乎没有-locationFromLocationWithDistance:或等效方法。我希望没有人说你必须反向使用哈弗森公式,因为它看起来有点复杂…你可以用提供的数学来做。代码呢 CLLocationCoordinate2D center = placemark.location.coordinate;

我在iOS5上使用CLGeocoder获得了一个CLPlacemark。现在我想把一个地标的区域(CLRegion对象)放大到那个区域,这到底是怎么可能的


我想要的是相反的,但似乎没有
-locationFromLocationWithDistance:
或等效方法。我希望没有人说你必须反向使用哈弗森公式,因为它看起来有点复杂…

你可以用提供的数学来做。代码呢

        CLLocationCoordinate2D center = placemark.location.coordinate;
        CLRegion* coreLocationRegion = placemark.region;
        CLLocationDistance radius = coreLocationRegion.radius;
#define kBEARING_NORTH 0.0
#define kBEARING_EAST  .5 * M_PI
#define kBEARING_SOUTH M_PI
#define kBEARING_WEST  1.5 * M_PI

#define kEARTH_RADIUS_M 6371000.0

        // Store the angular distance of each side from the center
        double angDist = radius / kEARTH_RADIUS_M;

        // Convert center lat and lng to radians
        double centerLatRad =  center.latitude * M_PI / 180;
        double centerLngRad = center.longitude * M_PI / 180;

        // Calculate latitude range
        double maxLatRad = asin(sin(centerLatRad) * cos(angDist) +
                                cos(centerLatRad) * sin(angDist) * cos(kBEARING_NORTH));

        double minLatRad = asin(sin(centerLatRad) * cos(angDist) +
                                cos(centerLatRad) * sin(angDist) * cos(kBEARING_SOUTH));

        // Calculate longitude range
        // Longitude range requires coresponding latitudes:
        double tempLatRad;

        // Calculate max longitude
        tempLatRad = asin(sin(centerLatRad) * cos(angDist) +
                          cos(centerLatRad) * sin(angDist) * cos(kBEARING_EAST));

        double maxLngRad = centerLngRad + atan2(sin(kBEARING_EAST) * sin(angDist) * cos(centerLatRad),
                                                cos(angDist) - sin(centerLatRad) * sin(tempLatRad));

        // Calculate min longitude
        tempLatRad = asin(sin(centerLatRad) * cos(angDist) +
                          cos(centerLatRad) * sin(angDist) * cos(kBEARING_WEST));

        double minLngRad = centerLngRad + atan2(sin(kBEARING_WEST) * sin(angDist) * cos(centerLatRad),
                                                cos(angDist) - sin(centerLatRad) * sin(tempLatRad));

        CLLocationDegrees latitudeDelta = (maxLatRad-minLatRad) * 180 / M_PI;
        CLLocationDegrees longitudeDelta = (maxLngRad-minLngRad) * 180 / M_PI;
        MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
        MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
        [self.mapView setRegion: region animated: YES];

或者,不用所有的数学运算,只需使用API提供的方法即可

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([placemark region].center, [placemark region].radius, [placemark region].radius);
[[self mapView] setCenterCoordinate:[placemark region].center animated:NO];

CLRegion.radius以米为单位,MKCoordinateRegionMakeWithDistance接受纬度/经度。这就是为什么我相信所有的数学都是必需的。不是坐标,而是跨度:MKCoordinateRegion MKCoordinateRegion makewithdistance(CLLocationCoordinate2D centerCoordinate,CLLocationDistance纬度仪,CLLocationDistance纵向仪);嗨@quellish,虽然它的反应很晚,但我想问你,我已经试过了,它在一些国家很好地发挥作用,对一些国家来说,比如美国、百慕大、沙特、巴勒斯坦。。。它不会到来,对美国来说,地图正在移到右角……为什么你要努力计算一个区域,而仅仅使用它的中心呢?