如何创建给出了两个百分点MKMapRect,每一个经度和纬度值规定?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建给出了两个百分点MKMapRect,每一个经度和纬度值规定?相关的知识,希望对你有一定的参考价值。
我有一个扩展NSObject
和实现MKOverlay
协议的自定义类。其结果是,我需要实现该协议的boundingMapRect
属性,它是一个MKMapRect
。要创建一个MKMapRect
我当然可以用MKMapRectMake
做一个。但是,我不知道如何使用这些数据我有这两点,每一个经度和纬度指定创建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
需要符合规范了,看起来大约像这样的区域中的目标:
因此,要重申,我怎么使用我的经/纬度值来创建,我可以设置为MKMapRect
协议的MKOverlay
财产@property (nonatomic, readonly) MKMapRect boundingMapRect
?
这应该这样做:
// 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));
这里使用了两个X的较小并为您的起点y坐标,计算出X / Y两个点的宽度和高度之间的跨越。
对于任何数量的坐标,在斯威夫特(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婴儿所指出的,这将不采取环绕考虑(在+/- 180经度&+/- 90纬度)。结果仍然是正确的,但它不会是最小可能的矩形。
根据帕特里克的回答上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
}
以上是关于如何创建给出了两个百分点MKMapRect,每一个经度和纬度值规定?的主要内容,如果未能解决你的问题,请参考以下文章
将 MKTileOverlayPath 转换为 MKMapRect?
故事板iOS - 如何以屏幕尺寸的百分比而不是静态值顶部引脚边距给出上边距?