Moving a CLLocation by x meters

前端 未结 11 961
余生分开走
余生分开走 2020-11-30 04:54

I have a CLLocation defined, and I\'d like to move that point x meters to the east and y meters to the south. How may I achieve that?

11条回答
  •  执念已碎
    2020-11-30 05:27

    Strange that nobody thought of using MKCoordinateRegion from MapKit to calculate that automatically.

    import MapKit
    
    extension CLLocation {
        func movedBy(latitudinalMeters: CLLocationDistance, longitudinalMeters: CLLocationDistance) -> CLLocation {
            let region = MKCoordinateRegion(center: coordinate, latitudinalMeters: abs(latitudinalMeters), longitudinalMeters: abs(longitudinalMeters))
    
            let latitudeDelta = region.span.latitudeDelta
            let longitudeDelta = region.span.longitudeDelta
    
            let latitudialSign = CLLocationDistance(latitudinalMeters.sign == .minus ? -1 : 1)
            let longitudialSign = CLLocationDistance(longitudinalMeters.sign == .minus ? -1 : 1)
    
            let newLatitude = coordinate.latitude + latitudialSign * latitudeDelta
            let newLongitude = coordinate.longitude + longitudialSign * longitudeDelta
    
            let newCoordinate = CLLocationCoordinate2D(latitude: newLatitude, longitude: newLongitude)
    
            let newLocation = CLLocation(coordinate: newCoordinate, altitude: altitude, horizontalAccuracy: horizontalAccuracy, verticalAccuracy: verticalAccuracy, course: course, speed: speed, timestamp: Date())
    
            return newLocation
        }
    }
    

提交回复
热议问题