如何使地图视图缩放到当前位置的5英里半径范围内?

26

我知道这是一个非常常见的问题,但我没有得到确切的答案。

如何使MKMapView默认缩放到当前位置5英里半径范围内。

提前感谢。

3个回答

60

使用MapKit中的MKCoordinateRegionMakeWithDistance函数。

由于MapKit使用米作为距离单位,因此请使用一个转换函数将英里转换为米。

float MilesToMeters(float miles) {
    // 1 mile is 1609.344 meters
    // source: http://www.google.com/search?q=1+mile+in+meters
    return 1609.344f * miles;
}

然后在您的代码中将地图区域设置为(感谢@DylanBettermann指出,要获得5英里的半径,距离需要加倍)

mapView.region = MKCoordinateRegionMakeWithDistance(
    centerCoordinate, 
    MilesToMeters(10.0f),
    MilesToMeters(10.0f)
);

Swift 4 版本:

mapView.region = MKCoordinateRegion(
            center: centerCoordinate,
            latitudinalMeters: MilesToMeters(10.0f),
            longitudinalMeters: MilesToMeters(10.0f)
)

2
我不确定自从发布以来MKCoordinateRegionMakeWithDistance是否有所改变,但在iOS 9中,它只能让你获得2.5英里的半径。相反,将直径传递给MKCooridinateRegionMakeWithDistance(例如,对于5英里半径,使用MilesToMeters(10.0f))。 - Dylan Bettermann
@DylanBettermann - 感谢您指出这一点。据我所知,API并没有发生变化。它始终是南北或东西距离。已更新示例代码。 - Anurag

55

每当您想缩放到5英里的半径时,请使用以下代码:

double miles = 5.0;
double scalingFactor = ABS( (cos(2 * M_PI * newLocation.coordinate.latitude / 360.0) ));

MKCoordinateSpan span; 

span.latitudeDelta = miles/69.0;
span.longitudeDelta = miles/(scalingFactor * 69.0); 

MKCoordinateRegion region;
region.span = span;
region.center = newLocation.coordinate;

[mapView setRegion:region animated:YES];

在我的代码中,用用户当前位置填充“newLocation”变量,它将缩放到距离当前位置5英里的半径。 - Satyam
31
对于任何想知道的人,神奇数字69是每60个海里的英里数。一个纬度包含60个海里。 - btt
@StephenBurns 这取决于 MKMapView 的框架吗? - Pramod Tapaniya
这个答案确实可以工作,但是它给出了错误的距离。正确的方法是使用下面 Anurag 的答案。我赞成了这个答案,然后开始在我的地图视图上比较两个距离,发现这个答案是不正确的。不要使用这个答案,请使用下面的那个。 - Lance Samaria

2
[self.theMapView setRegion:MKCoordinateRegionMake(
                    [theConsumer.latLong.clLocation coordinate], 
                    MKCoordinateSpanMake( MAP_SPAN, MAP_SPAN ))
                 animated:YES];

MKCoordinateSpanMake的参数以度为单位,每度在赤道上大约相当于69英里。因此,MAP_SPAN将是5.0/69.0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接