为CLPlacemark获取正确的缩放区域

arn*_*app 4 cocoa-touch mapkit ios swift

我正在MKLocalSearch搜索某些地方,例如城市或城市街道,以将其显示在MKMapView

我这样显示地标

let loc = placemark.location! //CLLocation of CLPlacemark
var mapRegion = MKCoordinateRegion()
mapRegion.center.longitude = loc.coordinate.longitude
mapRegion.center.latitude = loc.coordinate.latitude
mapRegion.span.latitudeDelta = 0.03 // I choose 0.03 by trying
mapRegion.span.longitudeDelta = 0.03
mapView.setRegion(mapRegion, animated: true)
Run Code Online (Sandbox Code Playgroud)

当地标是城市时,此方法效果很好,因为它以合理的缩放级别显示较大的区域。但是,当我想显示城市中的特定街道(即CLPlacemarks位置)时,它就很远。

现在,我正在寻找一种根据您的“详细信息”计算正确的跨度的方法CLPlacemark(请注意,您不知道CLPlacemark预付款的类型)

有没有办法做到这一点?

OlD*_*Dor 5

让我详细解释一下。

首先,您需要检索适当的CLPlacemark对象。

如果您要CLPlacemark在特定位置搜索CLLocationCoordinate2D,请使用以下方法:

CLLocationCoordinate2D theCoordinate = CLLocationCoordinate2DMake(37.382640, -122.151780);
CLGeocoder *theGeocoder = [CLGeocoder new];
[theGeocoder reverseGeocodeLocation:[[CLLocation alloc] initWithLatitude:theCoordinate.latitude longitude:theCoordinate.longitude]
                  completionHandler:^(NSArray *placemarks, NSError *error)
 {
      CLPlacemark *thePlacemark = placemarks.firstObject;
 }];
Run Code Online (Sandbox Code Playgroud)

现在您有了一些适当的知识CLPlacemark,可以使用它的.region属性。请注意,文档说的.regionCLRegion,但实际上是CLCircularRegion

CLCircularRegion *theRegion = (id)thePlacemark.region;
Run Code Online (Sandbox Code Playgroud)

但是,MKMapView不适用于CLCircularRegion,而适用于MKMapRect。您可以使用以下解决方案:

如何将CLCircularRegion转换为MKMapRect

MKMapRect theMapRect = [self rectForCLRegion:theRegion];
Run Code Online (Sandbox Code Playgroud)

现在我们有了我们的MKMapRect,我们可以将它传递给我们,MKMapView就像这样:

[theMapView setVisibleMapRect:[theMapView mapRectThatFits:theMapRect]
                     animated:YES];
Run Code Online (Sandbox Code Playgroud)

或者,如果您想进一步调整屏幕偏移,可以使用:

[theMapView setVisibleMapRect:[theMapView mapRectThatFits:theMapRect]
                  edgePadding:UIEdgeInsetsMake(50, 50, 50, 50)
                     animated:YES];
Run Code Online (Sandbox Code Playgroud)

结论:

代码似乎可以正常工作,并使用通过CLCircularRegion .radius属性提供的信息自动调整范围。

下图显示了通过后的结果(37.382640,-122.151780)

在此处输入图片说明

比较一下,这是您通过的图片(37.382640,-12.151780)

在此处输入图片说明