将 MKMapView 更新为从 CLGeocoder 返回的 CLPlacemark

Posted

技术标签:

【中文标题】将 MKMapView 更新为从 CLGeocoder 返回的 CLPlacemark【英文标题】:Updating MKMapView to CLPlacemark returned from CLGeocoder 【发布时间】:2012-02-06 18:07:12 【问题描述】:

我希望能够通过允许用户在 UIAlertView 中输入地址或位置来更新 MKMapView 上显示的区域。我目前有:

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

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

【问题讨论】:

您可以将其设置为等于 latitudeDelta,地图视图将根据需要进行调整。但是您不需要首先自己计算跨度。您可以使用region = MKCoordinateRegionMakeWithDistance(placemark.region.center, placemark.region.radius, placemark.region.radius);。不确定您问题的第二部分。 这似乎有效。我假设我必须使用第 3 方地理编码器才能查看所有具有相同名称的结果。 安娜你能把这个添加为答案吗? 【参考方案1】:

您可以将其设置为等于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 已弃用。

为避免警告,请将region 转换为CLCircularRegion

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

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

【讨论】:

不幸的是 center 已被弃用。 @Andy,谢谢,我已经发布了应该避免编译器警告的代码。

以上是关于将 MKMapView 更新为从 CLGeocoder 返回的 CLPlacemark的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 在 iOS 6 上显示用户位置时崩溃

强制 MKMapView viewForAnnotation 更新

当我调用 setCoordinate 时,MKMapView 没有更新

更新用户位置或使用默认值时刷新 MKMapView

MKMapView 和 setRegion:animated: 不更新地图视觉效果

MKMapView 在 iOS 4 中忽略 centerOffset 的更新