Преобразование двух координатных точек в расстояние в направлении запад-восток и север-юг - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь выяснить, как рассчитать расстояние "запад-восток" и расстояние "север-юг" между двумя точками соответственно, учитывая координаты двух точек (с широтой и долготой),чтобы узнать, в какой степени линия отличается от северного направления. Короче говоря, мне нужно вычислить x и y в метрах, чтобы получить степень альфа, когда x и y задаются долготой и широтой.

Я знаю, что CLLocation имеет функцию длявычислите расстояние между двумя точками:

distance (from location: CLLocation) -> CLLocationDistance

, и я попытался открыть исходный код этой функции, чтобы выяснить, как разделить двакомпоненты, но я не узнал, как открыть этот код.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Предполагая, что у нас есть:

let locationA = CLLocation(..)
let locationB = CLLocation(..)

Я, вероятно, все еще хотел бы использовать предоставленные Apple функции и создавать новые местоположения, которые отличаются только широтой или долготой.Что-то вроде:

let latitudeA = CLLocation(latitude: locationA.latitude, longitude: locationA.longitude)
// notice I use latitude from B but KEEP longitude from A to keep them parallel)
let latitudeB = CLLocation(latitude: locationB.latitude, longitude: locationA.longitude)
let northSouthDistance = latitudeA.distance(from: latitudeB)

и т. Д.

0 голосов
/ 12 февраля 2019

Вы можете использовать это

func getDistanceAndAngle(positionA: CLLocation, positionB: CLLocation) -> (Float, Float, Float){

    let distanceInMeters = Float(positionA.distance(from: positionB)) // result is in meters
    print(distanceInMeters)
    //search for the degree
    let angle = bearingFromLocation(fromLocation: positionA.coordinate, toLocation: positionB.coordinate)
    print("ANGLE", angle)
    let xDistance = abs(distanceInMeters * cos(DegreesToRadians(degrees: angle)))
    let yDistance = abs(distanceInMeters * sin(DegreesToRadians(degrees: angle)))

    return (xDistance,yDistance,angle)
}


func bearingFromLocation(fromLocation:CLLocationCoordinate2D, toLocation: CLLocationCoordinate2D)-> Float{

    let lat1 = DegreesToRadians(degrees: Float(fromLocation.latitude))
    let lon1 = DegreesToRadians(degrees: Float(fromLocation.longitude))

    let lat2 = DegreesToRadians(degrees: Float(toLocation.latitude))
    let lon2 = DegreesToRadians(degrees: Float(toLocation.longitude))

    let dLon = lon2 - lon1

    let y = sin(dLon) * cos(lat2)
    let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon)
    let radiansBearing = atan2(y, x)
    print("radian", radiansBearing)
    let degreesBearing = RadiansToDegrees(radians: radiansBearing)
    print("deg", degreesBearing)

    if (degreesBearing >= 0) {
        return degreesBearing
    } else {
        return degreesBearing + 360.0
    }
}

func DegreesToRadians(degrees: Float)->Float {return degrees * Float.pi / 180.0}
func RadiansToDegrees(radians: Float)->Float {return radians * 180.0/Float.pi}

примечания: угол с севера на восток, поэтому север составляет 0 градусов, а восток составляет 90 градусов.X и Y всегда положительны.Поэтому, если вы хотите сделать его отрицательным влево и вниз, вы можете попытаться использовать градус, чтобы сделать его правильным.

0 голосов
/ 12 февраля 2019

Вы можете конвертировать точки 1 и 2 в MKMapPoint.Он дает вам координаты проецируемой карты в 2D плоскости.Тогда вы можете легко получить разницу х и у .. И, используя простую математику, вы можете вычислить альфа-значение.Вы можете инициализировать MKMapPoint с помощью CLLocationCoordinate2D.

https://developer.apple.com/documentation/mapkit/mkmappoint

...