将MKMapView缩放到CLRegion

问题描述:

我正在使用iOS5上的CLGeocoder获取CLPlacemark。现在我想将地标的区域(CLRegion对象)和我的MKMapView缩放到该区域,这到底如何呢?将MKMapView缩放到CLRegion

我想要this的倒数,但似乎没有-locationFromLocationWithDistance:或等效方法。我希望没有人说你必须相反使用Haversine公式,因为这看起来有点复杂...

你可以使用提供的数学here。而对于代码

 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]; 
+0

CLRegion.radius以米为单位,MKCoordinateRegionMakeWithDistance接受纬度/经度。这就是为什么我相信所有这些数学都是需要的。 –

+3

非坐标,跨度:MKCoordinateRegion MKCoordinateRegionMakeWithDistance( CLLocationCoordinate2D centerCoordinate, CLLocationDistance latitudinalMeters, CLLocationDistance longitudinalMeters ); – quellish

+0

嗨@quellish,尽管它迟到了,但我想问你,我已经尝试过了,它在一些国家工作的很好,对于美国,百慕大,沙特,巴勒斯坦等一些国家来说......它不是来美国的,因为美国,地图正在向右上角移动... – iOSDev