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
は、次のような領域を特定する必要があります。
繰り返しになりますが、lat/lon値を使用して、MKMapRect
プロトコルの@property (nonatomic, readonly) MKMapRect boundingMapRect
プロパティとして設定できるMKOverlay
を作成するにはどうすればよいですか?
これはそれを行う必要があります:
// 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スパンを計算します。
任意の数の座標について、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緯度)。結果は正しいままですが、可能な限り最小の長方形にはなりません。
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)
}
}
これは私のために働いたものです。
経度+/- 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
}