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

ターゲット エリアが常に左または右にある場合 (つまり、高さ全体を許可する場合) は非常に簡単です。領域の境界を計算するだけで済みます。

ピンをページの右側の 4 分の 1 に配置するとします。これは、ピン領域よりも 4 倍 (targetspan/currentspan) 大きい領域を表示するようにマップに指示し、その領域の中央を 1.5x ((targetspan-currentspan)/2) の幅だけ左にシフトするように指示する必要があることを意味します。領域。(緯度は0から1までですが、実際には、すでに計算したものを使用するだけです)

ビューが 4 つの垂直ストリップに分割されていると想像してください。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 に答える