Я делаю очень простую операцию.Я сортирую кучу мест на карте, чтобы создать вмещающий круг, например:
var maxLong: Double = -180
var maxLat: Double = -180
var minLong: Double = 180
var minLat: Double = 180
for coord in inCoordinates {
maxLong = max(coord.longitude, maxLong)
maxLat = max(coord.latitude, maxLat)
minLong = min(coord.longitude, minLong)
minLat = min(coord.latitude, minLat)
}
let nw: CLLocation = CLLocation(latitude: maxLat, longitude: minLong)
let se: CLLocation = CLLocation(latitude: minLat, longitude: maxLong)
let center = CLLocationCoordinate2D(latitude: (maxLat + minLat) / 2.0, longitude: (maxLong + minLong) / 2.0)
let radiusInMeters = abs(nw.distance(from: se)) / 2.0
return MKCircle(center: center, radius: radiusInMeters)
Довольно просто (да, я знаю о проблеме IDL, но я хочу сохранить это простым).
То, что я хотел бы знать, это то, что если бы я мог как-то свести цикл в вариант снижения, где вы бы получили что-то вроде этого:
let enclosingRect: MKMapRect = inCoordinates.magikalReduce {
// Magic Happens Here -Queue Doug Henning GIF
}
Таким образом, возвращаемый прямоугольник содержит дистиллированные точки.
Да, я знаю, что я могу просто расширить Array (возможно с классификатором типа), чтобы сделать это с вычисляемым свойством, но такой вид поражает цель этого,Вышеупомянутое довольно эффективно, и я бы не стал добавлять накладные расходы, просто для фантазии (а это значит, что даже если бы я мог это сделать, он мог бы быть слишком неэффективным для использования).
Это скорееисследование любопытства, чем техническая необходимость.Приведенный выше код подходит для меня, и он довольно быстрый.