6

そのマップに関連付けられているすべてのピンに焦点を当てたマップを拡大しようとしています。その情報をマップ プロパティに保存しました。

私はこれから始めていますが、まだ機能していません:

    double maxLatitude = 0;
    double minLatitude = 0;

    double maxLongitude = 0;
    double minLongitude = 0;

    for (MKAnnotation *address in self.map.locations) {
        // Latitude
        if ([address.latitude doubleValue] > 0) {
            maxLatitude = MAX(maxLatitude, [address.latitude doubleValue]);
        }
        else {
            minLatitude = MAX(abs(minLatitude), abs([address.latitude doubleValue]));
        }

        // Longitude
        if ([address.longitude doubleValue] > 0) {
            maxLongitude = MAX(maxLongitude, [address.longitude doubleValue]);
        }
        else {
            minLongitude = MAX(abs(minLongitude), abs([address.longitude doubleValue]));
        }
    }
    double centerLatitude = (maxLatitude - abs(minLatitude)) / 2;
    centerLatitude *= [self calculateSignWithFirstValue:maxLatitude secondValue:minLatitude];

    double centerLongitude = (maxLongitude - abs(minLongitude)) / 2;
    centerLongitude *= [self calculateSignWithFirstValue:maxLongitude secondValue:minLongitude];

// 座標で MKMapRect を作成しますか?

MKMapRect を理解しているとは思いませんが、次のようなことをしようとすると:

    CLLocationCoordinate2D theOrigin = CLLocationCoordinate2DMake(32, -117);
    MKMapRect mapRect;
    mapRect.origin = MKMapPointForCoordinate(theOrigin);
    mapRect.size = MKMapSizeMake(10, 10);

私はサンディエゴの代わりに海の上に置かれます。MKMapRect で何が起こっているのかわかりません。

4

4 に答える 4

15
/** 
 * Return a region covering all the annotations in the given array.
 * @param annotations Array of objects conforming to the <MKAnnotation> protocol.
 */
+(MKCoordinateRegion) regionForAnnotations:(NSArray*) annotations 
{
    double minLat=90.0f, maxLat=-90.0f;
    double minLon=180.0f, maxLon=-180.0f;

    for (id<MKAnnotation> mka in annotations) {
        if ( mka.coordinate.latitude  < minLat ) minLat = mka.coordinate.latitude;
        if ( mka.coordinate.latitude  > maxLat ) maxLat = mka.coordinate.latitude;
        if ( mka.coordinate.longitude < minLon ) minLon = mka.coordinate.longitude;
        if ( mka.coordinate.longitude > maxLon ) maxLon = mka.coordinate.longitude;
    }

    CLLocationCoordinate2D center = CLLocationCoordinate2DMake((minLat+maxLat)/2.0, (minLon+maxLon)/2.0);
    MKCoordinateSpan span = MKCoordinateSpanMake(maxLat-minLat, maxLon-minLon);
    MKCoordinateRegion region = MKCoordinateRegionMake (center, span);

    return region;
}

// usage
MKCoordinateRegion region = [XXXX regionForAnnotations:self.mapView.annotations];
[self.mapView setRegion:region animated:YES];

MKMapView は離散間隔にズームします。つまり、ランダムな領域をズームすると、最も近いズーム間隔が選択されます。これはタイルの解像度に関係している可能性がありますが、AFAIK は文書化されていません。

于 2012-09-01T23:26:07.083 に答える
3

MKMapRectサンディエゴ上空を作成して海にたどり着くという質問の2番目の部分を説明するだけです...

まず、座標32, -117はサンディエゴの「近く」だけです。
実際には、メキシコの西海岸から数キロ離れた太平洋の数キロ南にあります。

またMKMapRectoriginは長方形の左上隅 (中央ではない) であるため、結果の長方形には、指定している座標の周囲の領域が完全には含まれないことに注意してください。

もう 1 つの実際の問題は、スパン サイズが に設定されていることMKMapSizeMake(10, 10)です。
MKMapSize単位を使用しMKMapPointます (度、メートル、マイル、km などではありません)。
マップ ポイントが等しいメートル単位の距離は、緯度によって異なります。

緯度32では、10マップ ポイントは1.261110 メートルMKMetersPerMapPointAtLatitudeに対応します (これは、を使用して MapKit 関数で計算できます10.0 * MKMetersPerMapPointAtLatitude(32))。

したがって、作成されているマップ rect はメキシコの西海岸沖に配置され、サイズは約 1.26 x 1.26メートルです。したがって、海しか見えません (かなりズームアウトするまで)。

上記の関数を使用してメートルをマップ ポイントに変換MKMapRectMKCoordinateRegionMakeWithDistance、計算はマップ ビューによって処理されます。

于 2012-09-02T22:10:08.817 に答える
1

ジャノの答えも完璧に機能していると感じていますが、ここに多様性のための別の解決策があります。これは、私が通常、特定の注釈にズームインするために使用するものです。

-(void)zoomToFitMapAnnotations:(MKMapView *)mapView {
    if([mapView.annotations count] == 0)
        return;

    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;

    CLLocationCoordinate2D bottomRightCoord;
    bottomRightCoord.latitude = 90;
    bottomRightCoord.longitude = -180;

    for(MKPointAnnotation *annotation in mapView.annotations)
    {
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);

        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);
    }

    MKCoordinateRegion region;
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; 

    region = [mapView regionThatFits:region];
    [mapView setRegion:region animated:YES];
}
于 2012-09-02T00:39:44.537 に答える