Обратная функция MKCoordinateRegionMakeWithDistance?
Встроенная функция MapKit MKCoordinateRegionMakeWithDistance
берет расстояния в метрах и превращает их в MKCoordinateRegion
:
func MKCoordinateRegionMakeWithDistance(
_ centerCoordinate: CLLocationCoordinate2D,
_ latitudinalMeters: CLLocationDistance,
_ longitudinalMeters: CLLocationDistance)
-> MKCoordinateRegion
есть ли обратная функция, которая принимает MKCoordinateRegion
и дает мне широтные и продольные метры?
2 ответа
MKCoordinateRegion
дает центр (широта и долгота) и пролет (дельта широта и долгота). Учитывая эти значения, вы можете определить расположение краев региона по широте и долготе. Как только вы это сделаете, вы можете использовать формулу haversine, чтобы получить широтные и продольные расстояния, и вы уже знаете центр. По факту, CLLocation
имеет функцию distanceFromLocation:(const CLLocation *)location
который вы должны использовать, чтобы избежать прямой реализации формулы.
Основываясь на идее Адама, это моя реализация в Swift 4
с юнит-тестами:
extension MKCoordinateRegion {
/// middle of the south edge
var south: CLLocation {
return CLLocation(latitude: center.latitude - span.latitudeDelta / 2, longitude: center.longitude)
}
/// middle of the north edge
var north: CLLocation {
return CLLocation(latitude: center.latitude + span.latitudeDelta / 2, longitude: center.longitude)
}
/// middle of the east edge
var east: CLLocation {
return CLLocation(latitude: center.latitude, longitude: center.longitude + span.longitudeDelta / 2)
}
/// middle of the west edge
var west: CLLocation {
return CLLocation(latitude: center.latitude, longitude: center.longitude - span.longitudeDelta / 2)
}
/// distance between south and north in meters. Reverse function for MKCoordinateRegionMakeWithDistance
var latitudinalMeters: CLLocationDistance {
return south.distance(from: north)
}
/// distance between east and west in meters. Reverse function for MKCoordinateRegionMakeWithDistance
var longitudinalMeters: CLLocationDistance {
return east.distance(from: west)
}
}
Модульный тест:
func testMKCoordinateRegionMakeWithDistance() {
// arbitrary parameters
let center = CLLocationCoordinate2DMake(49, 9)
let latitudinalMeters: CLLocationDistance = 1000
let longitudinalMeters: CLLocationDistance = 2000
let region = MKCoordinateRegionMakeWithDistance(center, latitudinalMeters, longitudinalMeters)
XCTAssertEqual(latitudinalMeters, round(region.latitudinalMeters*100)/100)
XCTAssertEqual(longitudinalMeters, round(region.longitudinalMeters*100)/100)
}
дизайн теста:
- используйте разные числа для длинных и длинных, чтобы найти ошибки, где перепутаны переменные
- проверяет округление примерно до 5 значащих десятичных знаков