web-dev-qa-db-ja.com

それぞれが緯度と経度の値で指定された2つのポイントを指定してMKMapRectを作成するにはどうすればよいですか?

NSObjectを拡張し、MKOverlayプロトコルを実装するカスタムクラスがあります。その結果、プロトコルのboundingMapRectプロパティを実装する必要があります。これはMKMapRectです。 MKMapRectを作成するには、もちろんMKMapRectMakeを使用して作成できます。ただし、緯度と経度でそれぞれ指定された2つのポイントであるデータを使用して、MKMapRectを作成する方法がわかりません。 MKMapRectMakeのドキュメントの状態:

_MKMapRect MKMapRectMake(
    double x,
    double y,
    double width,
    double height
);

Parameters
x
    The point along the east-west axis of the map projection to use for the Origin.
y
    The point along the north-south axis of the map projection to use for the Origin.
width
    The width of the rectangle (measured using map points).
height
    The height of the rectangle (measured using map points).
Return Value
    A map rectangle with the specified values.
_

MKMapRectを指定する必要がある緯度と経度の値は次のとおりです。

_24.7433195, -124.7844079
49.3457868, -66.9513812
_

したがって、ターゲットMKMapRectは、次のような領域を特定する必要があります。 The Target MKMapRect

繰り返しになりますが、lat/lon値を使用して、MKMapRectプロトコルの@property (nonatomic, readonly) MKMapRect boundingMapRectプロパティとして設定できるMKOverlayを作成するにはどうすればよいですか?

30
John Erck

これはそれを行う必要があります:

// these are your two lat/long coordinates
CLLocationCoordinate2D coordinate1 = CLLocationCoordinate2DMake(lat1,long1);
CLLocationCoordinate2D coordinate2 = CLLocationCoordinate2DMake(lat2,long2);

// convert them to MKMapPoint
MKMapPoint p1 = MKMapPointForCoordinate (coordinate1);
MKMapPoint p2 = MKMapPointForCoordinate (coordinate2);

// and make a MKMapRect using mins and spans
MKMapRect mapRect = MKMapRectMake(fmin(p1.x,p2.x), fmin(p1.y,p2.y), fabs(p1.x-p2.x), fabs(p1.y-p2.y));

これは、開始点に2つのx座標とy座標の小さい方を使用し、幅と高さの2つの点間のx/yスパンを計算します。

39
CSmith

任意の数の座標について、Swift(4.2):

// Assuming `coordinates` is of type `[CLLocationCoordinate2D]`
let rects = coordinates.lazy.map { MKMapRect(Origin: MKMapPoint($0), size: MKMapSize()) }
let fittingRect = rects.reduce(MKMapRect.null) { $0.union($1) }

@Abin Babyが指摘しているように、これはラップアラウンドを考慮しません(+/- 180経度および+/- 90緯度)。結果は正しいままですが、可能な限り最小の長方形にはなりません。

23

Patrickの回答に基づいて、MKMapRectの拡張機能:

extension MKMapRect {
    init(coordinates: [CLLocationCoordinate2D]) {
        self = coordinates.map({ MKMapPointForCoordinate($0) }).map({ MKMapRect(Origin: $0, size: MKMapSize(width: 0, height: 0)) }).reduce(MKMapRectNull, combine: MKMapRectUnion)
    }
}
6
boliva

これは私のために働いたものです。

経度+/- 180と緯度+/- 90の間を通過しても問題ありません。

スウィフト4.2

func makeRect(coordinates:[CLLocationCoordinate2D]) -> MKMapRect {
    var rect = MKMapRect()
    var coordinates = coordinates
    if !coordinates.isEmpty {
        let first = coordinates.removeFirst()
        var top = first.latitude
        var bottom = first.latitude
        var left = first.longitude
        var right = first.longitude
        coordinates.forEach { coordinate in
            top = max(top, coordinate.latitude)
            bottom = min(bottom, coordinate.latitude)
            left = min(left, coordinate.longitude)
            right = max(right, coordinate.longitude)
        }
        let topLeft = MKMapPoint(CLLocationCoordinate2D(latitude:top, longitude:left))
        let bottomRight = MKMapPoint(CLLocationCoordinate2D(latitude:bottom, longitude:right))
        rect = MKMapRect(x:topLeft.x, y:topLeft.y,
                         width:bottomRight.x - topLeft.x, height:bottomRight.y - topLeft.y)
    }
    return rect
}
0
vauxhall