1

我得到了 MKMapView 和一些注释。我使用下一个代码来显示所有注释:

NSArray *coordinates = [self.mapView valueForKeyPath:@"annotations.coordinate"];

CLLocationCoordinate2D maxCoord = {-90.0f, -180.0f};
CLLocationCoordinate2D minCoord = {90.0f, 180.0f};
for(NSValue *value in coordinates) {
    CLLocationCoordinate2D coord = {0.0f, 0.0f};
    [value getValue:&coord];
    if(coord.longitude > maxCoord.longitude) {
        maxCoord.longitude = coord.longitude;
    }

    if(coord.latitude > maxCoord.latitude) {
        maxCoord.latitude = coord.latitude;
    }

    if(coord.longitude < minCoord.longitude) {
        minCoord.longitude = coord.longitude;
    }

    if(coord.latitude < minCoord.latitude) {
        minCoord.latitude = coord.latitude;
    }
}

MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};
region.center.longitude = (minCoord.longitude + maxCoord.longitude) / 2.0;
region.center.latitude = (minCoord.latitude + maxCoord.latitude) / 2.0;
region.span.longitudeDelta = (maxCoord.longitude - minCoord.longitude) * 1.5;
region.span.latitudeDelta = (maxCoord.latitude - minCoord.latitude) * 1.5;

[self.mapView setRegion:region animated:YES];

此代码将所有注释居中 - 完美。但是,如果我想在地图的右半部分放置注释怎么办?有没有办法做到这一点?

现在是这样:

图片

这是我想要实现的目标:

图片

4

1 回答 1

1

如果您的目标区域始终在左侧或右侧(即仍然允许全高),那么这很容易,您只需要计算出您所在区域边界的数学即可。

假设您希望引脚位于页面的右侧四分之一。这意味着您需要告诉地图查看比 pin 区域大 4x (targetspan/currentspan) 的区域,并且该区域的中间向左移动 1.5x ((targetspan-currentspan)/2) 的宽度地区。(我要坐的纬度是从 0 到 1,但实际上你只是使用你已经计算过的东西)

想象一下视图被分成四个垂直条,将有 5 条线。屏幕的左边缘是 0,下一行是 1,中间是 2,下一个是 3,最后一个是 4。您希望您的引脚位于第 3 行和第 4 行之间,这意味着您上面计算的经度跨度是1 个单位宽,center.longitude 为 3.5。

您有一个区域为 ((3.5,0.5), (1,1)),您需要告诉地图缩放到区域 ((2,0.5),(4,1))。因此,得到 longitudeDelta,将其乘以 1.5 并从 center.longitude 中减去,这就是您的新目标 center.longitude。然后将 longitudeDelta 乘以 4,这就是您的新 longitudeDelta。

您可以在小范围内对纬度进行类似的操作,但在大范围内,计算需要考虑地图投影,这意味着赤道附近的像素比两极附近的像素代表更多的土地。

于 2013-02-28T19:49:16.353 回答