Files
zmkgC/api/v1/common/tool/xyz2wgs84.go

53 lines
1.1 KiB
Go
Raw Normal View History

2025-07-07 20:11:59 +08:00
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