MKCoordinateRegionMakeWithDistance未在MapView上设置正确的区域

时间:2011-09-04 14:11:25

标签: iphone ios cocoa-touch google-maps mkmapview

我有这段代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationCoordinate2D userLocation = CLLocationCoordinate2DMake(48.9793946200, 2.4726272850);
    CLLocationDistance dist1 = 636.9887048804;
    CLLocationDistance dist2 = 900.8380655203;
    CLLocationDistance dist = dist1;

    [self.myMapView setRegion:MKCoordinateRegionMakeWithDistance(userLocation, dist, dist) animated:YES];

    // TEST
    // ------------------------------------------------------------
    MKCoordinateRegion region = self.myMapView.region;
    CLLocationDegrees lat = region.center.latitude;
    CLLocationDegrees lon = region.center.longitude - region.span.longitudeDelta/2;
    CLLocation *west = [[[CLLocation alloc] initWithLatitude:lat longitude:lon] autorelease];

    NSLog(@"User location: lat : %.10lf long : %.10lf", userLocation.latitude, userLocation.longitude);
    NSLog(@"distance set: %.10lfm", dist);
    NSLog(@"center: lat : %.8lf long : %.8lf", region.center.latitude, region.center.longitude);

    CLLocation* centerRegion = [[[CLLocation alloc] initWithLatitude:region.center.latitude longitude:region.center.longitude] autorelease];
    NSLog(@"distance to western boundary: %.2lfm", [centerRegion distanceFromLocation:west]);

    lat = region.center.latitude - region.span.latitudeDelta/2 ;
    lon = region.center.longitude;
    CLLocation *north = [[[CLLocation alloc] initWithLatitude:lat longitude:lon] autorelease];

    NSLog(@"distance to western boundary: %.2lfm", [centerRegion distanceFromLocation:north]);
    // ------------------------------------------------------------
}

设置dist = dist1时,会给出:

User location: lat : 48.9793946200 long : 2.4726272850
distance set: 636.9887048804m

center: lat : 48.97937199 long : 2.47269630
distance to western boundary: 500.44m
distance to western boundary: 650.57m

enter image description here

设置dist = dist2时,会给出:

User location: lat : 48.9793946200 long : 2.4726272850
distance set: 900.8380655203m

center: lat : 48.97937199 long : 2.47269630
distance to western boundary: 500.44m
distance to western boundary: 650.57m

enter image description here

这里有什么问题?为什么我有两个不同距离的相同显示器?

最后一个问题:我怎样才能确保在地图上显示想要的水表,至少水平和垂直视觉(当然有或没有动画)?

2 个答案:

答案 0 :(得分:8)

如果我理解正确,你想告诉mapView“给我一张636米宽的地图”或“给我一张900米宽的地图”。但是地图为这两种情况提供了相同的距离。

当你设置一个地图区域时,你通常不会完全回复你所要求的,而是最合适的。地图视图会查看您请求的区域,然后创建一个适合您所在区域的区域。问题是地图视图不会精确缩放到您请求的区域,它会找到允许您所有区域可见的最高缩放级别。它不会使用中间缩放级别。这就是为什么当你使用setRegion:时,地图总是看起来很清晰。您可以通过挤入或挤出手动设置中间缩放级别,但不能(以我所知)以编程方式设置。

另请注意,地图视图可能会更改您传递给它的实际region变量。这是文档:

  

设置新区域时,地图可以调整region参数中的值,使其精确地适合地图的可见区域。这是正常的,可以确保region属性中的值始终反映地图的可见部分。但是,它确实意味着如果在调用此方法后立即获得该属性的值,则返回的值可能与您设置的值不匹配。 (您可以使用regionThatFits:方法来确定地图实际设置的区域。)

您可以通过记录您提供的区域以及地图视图实际设置的区域来查看区域的差异(尽管我没有看到传递的myRegion更改):

MKCoordinateRegion myRegion = MKCoordinateRegionMakeWithDistance(userLocation, dist, dist);
NSLog(@"Passed: %f %f", myRegion.span.latitudeDelta, myRegion.span.longitudeDelta);
[self.mapView setRegion:myRegion animated:YES];

NSLog(@"Passed 2: %f %f", myRegion.span.latitudeDelta, myRegion.span.longitudeDelta);
NSLog(@"Set: %f %f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta);

> Passed: 0.005728 0.008702
> Passed 2: 0.005728 0.008702
> Set: 0.012957 0.013733

如果你的距离超过1200米,你将能够看到下一个缩放级别。

顺便说一句,你的代码中有一个小错误:

NSLog(@"distance to western boundary: %.2lfm", [centerRegion distanceFromLocation:north]);

应该是

NSLog(@"distance to northern boundary: %.2lfm", [centerRegion distanceFromLocation:north]);

答案 1 :(得分:1)

可能的原因是您指定的区域具有方形宽高比,而MKMapView可能具有矩形宽高比。

设置区域时MKMapView将不会完全按原样使用它,但会修改它以便:

  1. 其宽高比对应于视图的宽高比
  2. 新区域包含指定的
  3. 因此,如果您的视图宽度:高度纵横比为2:1,那么西/东边界距离中心200米,而北/南边界距离中心100米。

    如上所述设置区域后要尝试的事项:

    MKCoordinateRegion region = self.mapView.region;
    CLLocationDegrees lat = region.center.latitude;
    CLLocationDegrees lon = region.center.longitude - region.span.longitudeDelta/2;
    CLLocation *west = [[CLLocation alloc] initWithLatitude:lat longitude:lon];
    
    NSLog(@"distance to western boundary: %.2lfm", [userLocation distanceFromLocation:west]);
    
    lat = region.center.latitude + region.span.latitudeDelta/2 
    lon = region.center.longitude;
    CLLocation *north = [[CLLocation alloc] initWithLatitude:lat longitude:lon];
    
    NSLog(@"distance to northern boundary: %.2lfm", [userLocation distanceFromLocation:north]);
    

    其中一个应该是100米。如果没有,我会很高兴看到它们是什么。

    P.S。上面的代码还没有经过测试。