8

iOSでCLLocationsCoordinate2Dのセットの中心座標を取得する方法はありますか?

ここに画像の説明を入力してください

4

6 に答える 6

14

うーん...ポイントの中心をどのように定義するかによって異なります。配信などにもよるかな…

それを行う簡単な方法は次のとおりです...

//find rect that encloses all coords

float maxLat = -200;
float maxLong = -200;
float minLat = MAXFLOAT;
float minLong = MAXFLOAT;

for (int i=0 ; i<[locations count] ; i++) {
    CLLocationCoordinate2D location = [locations objectAtIndex:i];

    if (location.latitude < minLat) {
        minLat = location.latitude;
    }

    if (location.longitude < minLong) {
        minLong = location.longitude;
    }

    if (location.latitude > maxLat) {
        maxLat = location.latitude;
    }

    if (location.longitude > maxLong) {
        maxLong = location.longitude;
    }
}

//Center point

CLLocationCoordinate2D center = CLLocationCoordinate2DMake((maxLat + minLat) * 0.5, (maxLong + minLong) * 0.5);

これにより、すべてのポイントをカバーする四角形の中心が得られます。ただし、スプレッドは考慮されていません。

すなわち

. = point
X = centre

.....               X                   .

編集

数学の一部を修正しました。

于 2013-01-17T08:47:12.047 に答える
6

本当に遅いことはわかっていますが、誰かがこれを読んで自分自身を助けることができます Fogmeisterの回答を使用すると、MKCoordinateRegionを作成できます

CLLocationDegrees minLat,minLng,maxLat,maxLng;
for(CLLocationCoordinate2D coordinate in coordinates) {
    minLat = MIN(minLat, coordinate.latitude);
    minLng = MIN(minLng, coordinate.longitude);

    maxLat = MAX(maxLat, coordinate.latitude);
    maxLng = MAX(maxLng, coordinate.longitude);
}

CLLocationCoordinate2D coordinateOrigin = CLLocationCoordinate2DMake(minLat, minLng);
CLLocationCoordinate2D coordinateMax = CLLocationCoordinate2DMake(maxLat, maxLng);

MKMapPoint upperLeft = MKMapPointForCoordinate(coordinateOrigin);
MKMapPoint lowerRight = MKMapPointForCoordinate(coordinateMax);

//Create the map rect
MKMapRect mapRect = MKMapRectMake(upperLeft.x,
                                  upperLeft.y,
                                  lowerRight.x - upperLeft.x,
                                  lowerRight.y - upperLeft.y);

//Create the region
MKCoordinateRegion region = MKCoordinateRegionForMapRect(mapRect);

//THIS HAS THE CENTER, it should include spread
CLLocationCoordinate2D centerCoordinate = region.center;

ご挨拶!!!

于 2013-08-06T03:44:21.023 に答える
5

centerの配列とCLLocationCoordinate2Dの両方を取得することもできますspan

extension MKCoordinateRegion {

  init(coordinates: [CLLocationCoordinate2D]) {
    var minLatitude: CLLocationDegrees = 90.0
    var maxLatitude: CLLocationDegrees = -90.0
    var minLongitude: CLLocationDegrees = 180.0
    var maxLongitude: CLLocationDegrees = -180.0

    for coordinate in coordinates {
      let lat = Double(coordinate.latitude)
      let long = Double(coordinate.longitude)
      if lat < minLatitude {
        minLatitude = lat
      }
      if long < minLongitude {
        minLongitude = long
      }
      if lat > maxLatitude {
        maxLatitude = lat
      }
      if long > maxLongitude {
        maxLongitude = long
      }
    }

    let span = MKCoordinateSpanMake(maxLatitude - minLatitude, maxLongitude - minLongitude)
    let center = CLLocationCoordinate2DMake((maxLatitude - span.latitudeDelta / 2), (maxLongitude - span.longitudeDelta / 2))
    self.init(center: center, span: span)
  }
}

使用法:

let region = MKCoordinateRegion(coordinates: coordinates)
region.center
region.span
于 2017-12-07T12:30:29.500 に答える
4

そして Swift 5 互換拡張機能

extension Array where Element == CLLocationCoordinate2D {
func center() -> CLLocationCoordinate2D {
    var maxLatitude: Double = -200;
    var maxLongitude: Double = -200;
    var minLatitude: Double = Double(MAXFLOAT);
    var minLongitude: Double = Double(MAXFLOAT);

    for location in self {
        if location.latitude < minLatitude {
            minLatitude = location.latitude;
        }

        if location.longitude < minLongitude {
            minLongitude = location.longitude;
        }

        if location.latitude > maxLatitude {
            maxLatitude = location.latitude;
        }

        if location.longitude > maxLongitude {
            maxLongitude = location.longitude;
        }
    }

    return CLLocationCoordinate2DMake(CLLocationDegrees((maxLatitude + minLatitude) * 0.5), CLLocationDegrees((maxLongitude + minLongitude) * 0.5));
}

}

于 2020-01-07T20:41:41.250 に答える
1

あなたが中心として平均を探しているなら、あなたはすべての広背筋と広背筋をそれら自身の合計に合計し、そしてあなたが持っている座標の数で割る、かなり標準的な数学。

(日付変更線にまたがるコーディネイトの場合、これは機能しないことに注意してください)

于 2013-01-17T19:39:52.623 に答える
1

Fogmeisters の回答は機能しますが、3 つのエラーがあり、以下で修正しました。

//find rect that encloses all coords

float maxLat = -200;
float maxLong = -200;
float minLat = MAXFLOAT;
float minLong = MAXFLOAT;

for (int i=0 ; i<[locations count] ; i++) {
CLLocationCoordinate2D location = [locations objectAtIndex:i];

    if (location.latitude < minLat) {
        minLat = location.latitude;
    }

    if (location.longitude < minLong) {
        minLong = location.longitude;
    }

    if (location.latitude > maxLat) {
        maxLat = location.latitude;
    }

    if (location.longitude > maxLong) { //Change to be greater than
        maxLong = location.longitude;
    }
}

//Center point
//The min's and max's should be ADDED not subtracted
CLLocationCoordinate2D center = CLLocationCoordinate2DMake((maxLat + minLat) * 0.5, (maxLong + minLong) * 0.5);
于 2014-01-15T12:48:35.500 に答える