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

相关推荐
休息一下接着来11 小时前
笛卡尔坐标系转换(外参矩阵原理与用途)
坐标转换
钢门狂鸭15 小时前
go开发规范指引
开发语言·驱动开发·golang
脚踏实地的大梦想家16 小时前
【Go】P19 Go语言并发编程核心(三):从 Channel 安全到互斥锁
开发语言·安全·golang
Tony Bai17 小时前
Go GUI 开发的“绝境”与“破局”:2025 年现状与展望
开发语言·后端·golang
豆浆whisky17 小时前
Go分布式追踪实战:从理论到OpenTelemetry集成|Go语言进阶(15)
开发语言·分布式·golang
Tony Bai17 小时前
【Go模块构建与依赖管理】08 深入 Go Module Proxy 协议
开发语言·后端·golang
QX_hao17 小时前
【Go】--文件和目录的操作
开发语言·c++·golang
周杰伦_Jay1 天前
【主流开发语言深度对比】Python/Go/Java/JS/Rust/C++评测
开发语言·python·golang
ldmd2841 天前
Go语言实战:入门篇-5:函数、服务接口和Swagger UI
开发语言·后端·golang
NPE~1 天前
[手写系列]Go手写db — — 第七版(实现Disk存储引擎、Docker化支持)
数据库·后端·docker·golang·教程·手写数据库