2012-02-06 37 views
3

我希望能够通过允许用户在UIAlertView中键入地址或位置来更新显示在MKMapView上的区域。我目前有:将MKMapView更新为从CLGeocoder返回的CLPlacemark

 if (geocoder.geocoding) 
      [geocoder cancelGeocode]; 

     [geocoder geocodeAddressString:[[alertView textFieldAtIndex:0] text] completionHandler:^(NSArray *placemarks, NSError *error) { 
      if (!error) { 
       NSLog(@"Found a location"); 
      } else { 
       NSLog(@"Error in geocoding"); 
      } 

      NSLog(@"Num found: %d", [placemarks count]); 

      CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
      MKCoordinateRegion region; 
      region.center.latitude = placemark.region.center.latitude; 
      region.center.longitude = placemark.region.center.longitude; 
      MKCoordinateSpan span; 
      double radius = placemark.region.radius/1000; 

      NSLog(@"Radius is %f", radius); 
      span.latitudeDelta = radius/112.0; 
      //span.longitudeDelta = ??? 

      region.span = span; 

      NSLog(@"Region is %f %f %f", region.center.latitude, region.center.longitude, span.latitudeDelta); 

      [mapView setRegion:region animated:YES]; 
     }]; 

我的问题是我不确定如何计算经度增量。

+2

你可以只将其设置为latitudeDelta,并根据需要在地图视图会调整。但是你并不需要首先自己计算跨度。您可以使用'region = MKCoordinateRegionMakeWithDistance(placemark.region.center,placemark.region.radius,placemark.region.radius);'。不确定你的问题的第二部分。 – Anna 2012-02-06 19:03:44

+0

这似乎是工作。我假设我将不得不使用第三方地理编码器才能看到所有共享相同名称的结果。 – brendan 2012-02-06 19:40:12

+0

安娜你能添加这个答案吗? – brendan 2012-02-24 21:05:52

回答

14

您可以将其设置为等于latitudeDelta,并根据需要调整地图视图。

但是你不需要首先自己计算跨度。您可以使用:

region = MKCoordinateRegionMakeWithDistance(
      placemark.region.center, 
      placemark.region.radius, 
      placemark.region.radius); 

不确定您的问题的第二部分。


在iOS系统7或更高,由 CLPlacemark返回的 region实际上是一个 CLCircularRegion(见 Deprecated CLRegion methods - how to get radius?)。

虽然原始代码仍然按原样运行,但您可能会收到编译器警告,提示radiuscenter已弃用。

为了避免该警告,施放regionCLCircularRegion

CLCircularRegion *pmCircularRegion = (CLCircularRegion *)placemark.region; 

region = MKCoordinateRegionMakeWithDistance(
     pmCircularRegion.center, 
     pmCircularRegion.radius, 
     pmCircularRegion.radius); 
+0

不幸的是中心已被弃用。 – Andy 2015-03-17 13:55:12

+0

@安迪,谢谢,我已经发布了应该避免编译器警告的代码。 – Anna 2015-03-17 14:07:58

+0

作为'CLCircularRegion'投射效果很好,谢谢! – 2016-05-12 02:15:17