3

ズームしたい中心の場所とMKMapView、場所のリスト (緯度/経度) があります。この場所のリストに基づいてズーム レベル (距離) を設定し、これらの場所の多くがMKMapView同時に表示されるようにしますが、MKMapViewズームしないように最小ズーム レベル (または最大距離) を設定します。たくさん出ます。

たとえば、10 か所の場所のリストがあり、そのうちの 1 つが私の中心の場所から遠く離れているため、その 1 つの場所MKMapViewがズームアウトされることを示すと、距離パラメータをどのように計算すればよいMKCoordinateRegionMakeWithDistanceでしょうか?

問題を十分に説明できればと思いますが、説明するのは難しいと思います。

ありがとうござい
ます

4

5 に答える 5

5

次のソリューションで動作するようになりました。

大圏距離式を使用して、中心点と見つかったすべての緯度/経度ポイントの間の距離を計算します。この距離が最小距離と最大距離よりも大きく、「最後に見つかった距離」よりも大きい場合は、設定しますこの距離が私のズーム距離になります。それは魔法のように機能し、実際には非常に単純でした.

ここに私の距離計算コードがあります:

-(double)distanceBetweenLocations:(CLLocationCoordinate2D)c1 :(CLLocationCoordinate2D)c2 {
    int r = 6371 * 1000;//meters
    double dLat = (c2.latitude - c1.latitude) * M_PI / 180;
    double dLon = (c2.longitude - c1.longitude) * M_PI / 180;
    double lat1 = c1.latitude * M_PI / 180;
    double lat2 = c2.latitude * M_PI / 180;

    double a = sin(dLat / 2) * sin(dLat / 2) + sin(dLon / 2) * sin(dLon / 2) * cos(lat1) * cos(lat2);
    double c = 2 * atan2(sqrt(a), sqrt(1 - a));
    double d = r * c;

    return d;
}

そして、計算された距離で中心点にズームするコードは次のとおりです。

-(void)zoomToLocation {
    double MAX_DISTANCE = 10000.0;
    double MIN_DISTANCE = 600.0;

    double zoomDistance = MIN_DISTANCE;

    CLLocationCoordinate2D center;
    center.latitude = self.searchLocationLatitude;
    center.longitude = self.searchLocationLongitude;
    BOOL treaterVisible = NO;
    for (Treater *treater in treaters) {
        CLLocationCoordinate2D c2;
        c2.latitude = treater.latitude;
        c2.longitude = treater.longitude;
        double distance = [self distanceBetweenLocations:center :c2];
        if(distance > zoomDistance && distance < MAX_DISTANCE) {
            zoomDistance = distance;
            treaterVisible = YES;
        }
    }

    if(!treaterVisible) {
        zoomDistance = MAX_DISTANCE;
    }

    CLLocationCoordinate2D location;
    location.latitude = self.searchLocationLatitude;
    location.longitude = self.searchLocationLongitude;

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, zoomDistance, zoomDistance);
    MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:region];
    [self.mapView setRegion:adjustedRegion];
}

誰かが似たようなものを必要とするなら。

宜しくお願いします
Søren

于 2013-02-11T09:21:57.963 に答える
0

didAddAnnotationViews メソッドを編集します。これがあなたが探しているものであることを願っています、

-(void) mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
MKMapRect zoomRect = MKMapRectNull;
for (id <MKAnnotation> annotation in mapView.annotations)
{

        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        if (MKMapRectIsNull(zoomRect)) {
            zoomRect = pointRect;
        } else {
            zoomRect = MKMapRectUnion(zoomRect, pointRect);
        }
}
[mapView setVisibleMapRect:zoomRect animated:YES];
}
于 2013-02-08T12:05:27.703 に答える
0

このためには、最小および最大の緯度と経度を見つける必要があります。その後、これらの緯度と経度の平均和で地域を作成する必要があります。次に、地域をマップビューに割り当て、その地域に合わせます。それでおしまい。

于 2013-04-27T08:20:37.210 に答える
0

DDAnnotation は、表示ピン (PlaceMark) のカスタム クラスです。

-(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(DDAnnotation* 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);

    }

    NSLog(@"A%f, B%f, C%f, D%f,", topLeftCoord.latitude, topLeftCoord.longitude, bottomRightCoord.latitude, bottomRightCoord.longitude);

    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];
}
于 2013-02-08T12:08:56.347 に答える
0

数日前、私は本であなたの問題の解決策を読みました.Preparata Shamos、Computational Geometryだと思います.

残念ながら、解決策は komplex です。それは問題です。特定の半径内で見えるポイントの最良/最大のサブセットを見つけることです。

ポイント数が多すぎず、1万未満の場合、次のようにします
0)現在選択されているサブセットにすべてのポイントを追加します。
1) サブセット内のすべてのポイントを反復処理し、重力ポイントを計算し、重力ポイントまでのすべての距離を計算します。最大ズーム レベルの目的の距離に適合しますか? はい、準備完了です。
2)いいえ?サブセットから最大距離のポイントを削除し、ステップ 1 をもう一度実行します。すべてのポイントが現在のサブセットの中心から目的の距離内に収まるまで、これを行います。

重力ポイントは、平均 x (または経度) および平均 y (または緯度) 座標を持つサブセット内のポイントです。

(同意する場合は、賛成票を投じないでください)

于 2013-02-08T12:36:36.950 に答える