golang坐标转换 gomap3d库

gomap3d

Go语言实现的多坐标系转换库,支持天文学/航天领域常用坐标系转换
gomap3d

特性

  • 支持7种坐标系互转:

    • 站心坐标系 (AER)
    • 东北天坐标系 (ENU)
    • 地心地固坐标系 (ECEF)
    • 地心惯性坐标系 (ECI)
    • 大地坐标系 (WGS84)
  • 支持多种参考椭球体:

    • WGS-84
    • CGCS2000
    • 月球
    • 火星
  • 精确天文计算:

    • 儒略日计算
    • 格林威治恒星时
    • ECI/ECEF时变转换

安装

bash 复制代码
go get github.com/PingPongCode/gomap3d

使用示例

基本转换

go 复制代码
package main

import (
	"fmt"
	"time"
	"github.com/PingPongCode/gomap3d"
)

func main() {
	// 创建WGS84椭球体
	ell, _ := gomap3d.NewEllipsoid("wgs84")

	// 大地坐标(北京)
	beijing := gomap3d.Geodetic{
		Latitude:  39.9042, 
		Longitude: 116.4074,
		Altitude:  43.5,
		Ell:       ell,
	}

	// 转换为ECEF
	ecef := beijing.ToECEF()
	fmt.Printf("ECEF坐标: %.2f, %.2f, %.2f\n", ecef.X, ecef.Y, ecef.Z)

	// 转换为ENU(以上海为参考点)
	shanghai := gomap3d.Geodetic{
		Latitude:  31.2304,
		Longitude: 121.4737,
		Altitude:  4.0,
		Ell:       ell,
	}
	enu := beijing.ToENU(shanghai)
	fmt.Printf("ENU坐标: 东%.2fm, 北%.2fm, 上%.2fm\n", enu.East, enu.North, enu.Up)

	// 时间相关转换(ECI)
	t := time.Date(2023, 6, 15, 12, 0, 0, 0, time.UTC)
	eci := ecef.ToECI(t)
	fmt.Printf("ECI坐标: %.2f, %.2f, %.2f\n", eci.X, eci.Y, eci.Z)
}

坐标链转换

go 复制代码
// AER -> ENU -> ECEF -> Geodetic
aer := gomap3d.AER{
	Azimuth:   45.0,
	Elevation: 30.0,
	SRange:    1000.0,
	Ell:       ell,
}

enu := aer.ToENU()
ecef := enu.ToECEF(shanghai)
geo := ecef.ToGeodetic()

fmt.Printf("转换结果: 纬度%.4f°, 经度%.4f°, 高度%.1fm", 
	geo.Latitude, geo.Longitude, geo.Altitude)

基本函数

基本函数见base.go,参考pymap3d编写

go 复制代码
// ENU2AER 将ENU坐标转换为方位角、仰角和斜距
func ENU2AER(e, n, u float64) (az, el, srange float64){}

// AER2ENU 将方位角、仰角和斜距转换为ENU坐标
func AER2ENU(az, el, srange float64) (e, n, u float64) {}

// Geodetic2ECEF 将地理坐标转换为ECEF坐标
func Geodetic2ECEF(lat, lon, alt float64, ell *Ellipsoid) (x, y, z float64) {}

// ECEF2Geodetic 将ECEF坐标转换为地理坐标
func ECEF2Geodetic(x, y, z float64, ell *Ellipsoid) (lat, lon, alt float64) {}

// 天文计算相关函数
// juliandate 计算给定时间的儒略日
func juliandate(t time.Time) float64 {}

// greenwichsrt 计算格林威治恒星时(弧度)
func greenwichsrt(jd float64) float64 {}

// rotationMatrix3 生成绕Z轴旋转x弧度的矩阵
func rotationMatrix3(x float64) [3][3]float64 {}

// multiplyMatrixVector 矩阵乘以向量
func multiplyMatrixVector(matrix [3][3]float64, vector [3]float64) [3]float64 {}

// ECI2ECEF 将ECI坐标转换为ECEF坐标
func ECI2ECEF(x, y, z float64, t time.Time) (xEcef, yEcef, zEcef float64) {}

// ECEF2ECI 将ECEF坐标转换为ECI坐标
func ECEF2ECI(x, y, z float64, t time.Time) (xEci, yEci, zEci float64) {}

// ECEF2ENU 将ECEF坐标转换为ENU坐标
func ECEF2ENU(x, y, z, lat0, lon0, h0 float64, ell *Ellipsoid) (e, n, u float64) {}

// ENU2ECEF 将ENU坐标转换为ECEF坐标
func ENU2ECEF(e, n, u, lat0, lon0, h0 float64, ell *Ellipsoid) (x, y, z float64) {}

贡献

欢迎提交Issue和PR。提交代码前请确保:

  1. 通过所有测试 go test -v ./...
  2. 添加新功能的测试用例
  3. 更新相关文档

许可证

MIT License

相关推荐
Tony Bai2 小时前
释放 Go 的极限潜能:CPU 缓存友好的数据结构设计指南
开发语言·后端·缓存·golang
h7997103 小时前
go资深之路笔记(九)kafka浅析
笔记·golang·kafka
Yeats_Liao3 小时前
Go Web 编程快速入门 02 - 认识 net/http 与 Handler 接口
前端·http·golang
千码君20163 小时前
Go语言:关于导包的两个重要说明
开发语言·后端·golang·package·导包
Tony Bai7 小时前
【Go 网络编程全解】06 UDP 数据报编程:速度、不可靠与应用层弥补
开发语言·网络·后端·golang·udp
Dobby_057 小时前
【Go】C++ 转 Go 第(一)天:环境搭建 Windows + VSCode 远程连接 Linux
linux·运维·c++·vscode·golang
JCGKS7 小时前
Go|sync.Pool|临时对象池,实现临时对象的复用,降低GC压力
golang·对象池·对象复用·降低gc压力
星星点点洲15 小时前
PostgreSQL 15二进制文件
开发语言·设计模式·golang
youliroam21 小时前
成语接龙学习
学习·golang·uniapp·成语接龙
驰羽1 天前
[GO]什么是热重载,如何使用Air工具
开发语言·后端·golang