Вычислить новую координату с заданной координатой и расстоянием в метрах

У меня есть координата и база данных CoreData с записями, которые имеют значения широты и долготы. Я хочу найти все объекты в данной квадратной области и, следовательно, хотел бы знать верхний левый и нижний правый угловые точки с расстоянием до моей точки.

Код:

let coordinate = CLLocationCoordinate2D(latitude: 9.0, longitude: 50.0)
let distance: CLLocationDistance = 5000 // 5km
let topLeftCoordinate = ... // how to calculate this?
let bottomRightCoordinate = ... // and that?

1 ответ

Решение

Одним из способов является определение вспомогательных методов, которые позволяют легко вычислять новые координаты на основе координат, заданных на расстоянии в метрах, с использованием MapKit и CoreLoation, например, так:

// Create new coordinate with equal latitude and longitude distances (distance can be both positive and negative).
func coordinate(from coordinate: CLLocationCoordinate2D, distance: CLLocationDistance) -> CLLocationCoordinate2D {
    return self.coordinate(from: coordinate, latitudeDistance: distance, longitudeDistance: distance)
}

// Create new coordinate with latitude and longitude distances (distances can be both positive and negative).
func coordinate(from coordinate: CLLocationCoordinate2D, latitudeDistance: CLLocationDistance, longitudeDistance: CLLocationDistance) -> CLLocationCoordinate2D {
    let region = MKCoordinateRegionMakeWithDistance(coordinate, latitudeDistance, longitudeDistance)

    let newLatitude = coordinate.latitude + region.span.latitudeDelta
    let newLongitude = coordinate.longitude + region.span.longitudeDelta

    return CLLocationCoordinate2D(latitude: newLatitude, longitude: newLongitude)
}

Тогда приведенный выше код будет выглядеть так:

let coordinate = CLLocationCoordinate2D(latitude: 9.0, longitude: 50.0)
let distance: CLLocationDistance = 5000 // 5km
let topLeftCoordinate = self.coordinate(from: coordinate, distance: -distance)
let bottomRightCoordinate = self.coordinate(from: coordinate, distance: distance)

Надеюсь, это поможет кому-то там, когда сталкиваешься с этим.


Меры предосторожности: на тот случай, если кто-то думает (как многие, кажется, думают), что вопрос с самоотвечением не подходит для SO, пожалуйста, прочитайте это сначала.

Другие вопросы по тегам