53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
|
package tool
|
||
|
|
||
|
import (
|
||
|
"math"
|
||
|
)
|
||
|
|
||
|
var a = float64(6378137)
|
||
|
|
||
|
var b = 6356752.3142
|
||
|
|
||
|
var asqr = a * a
|
||
|
|
||
|
var bsqr = b * b
|
||
|
|
||
|
var e = math.Sqrt((asqr - bsqr) / asqr)
|
||
|
|
||
|
var eprime = math.Sqrt((asqr - bsqr) / bsqr)
|
||
|
|
||
|
func Xyz2Wgs84(X, Y, Z float64) (lng, lat, height float64) {
|
||
|
var p = math.Sqrt(X*X + Y*Y)
|
||
|
var theta = math.Atan((Z * a) / (p * b))
|
||
|
var sintheta = math.Sin(theta)
|
||
|
var costheta = math.Cos(theta)
|
||
|
var num = Z + eprime*eprime*b*sintheta*sintheta*sintheta
|
||
|
var denom = p - e*e*a*costheta*costheta*costheta
|
||
|
//Now calculate LLA
|
||
|
var latitude = math.Atan(num / denom)
|
||
|
var longitude = math.Atan(Y / X)
|
||
|
var N = getN(latitude)
|
||
|
var altitude = (p / math.Cos(latitude)) - N
|
||
|
|
||
|
if X < 0 && Y < 0 {
|
||
|
longitude = longitude - math.Pi
|
||
|
}
|
||
|
|
||
|
if X < 0 && Y > 0 {
|
||
|
longitude = longitude + math.Pi
|
||
|
}
|
||
|
return radiansToDegrees(longitude), radiansToDegrees(latitude), altitude
|
||
|
}
|
||
|
|
||
|
func getN(latitude float64) float64 {
|
||
|
var sinlatitude = math.Sin(latitude)
|
||
|
var denom = math.Sqrt(1 - e*e*sinlatitude*sinlatitude)
|
||
|
var N = a / denom
|
||
|
return N
|
||
|
}
|
||
|
func radiansToDegrees(radians float64) float64 {
|
||
|
return radians * 180 / math.Pi
|
||
|
}
|
||
|
|
||
|
//106.54959740614493 23.47200769358978
|