EC600U_esp32_iap_uart/EC600U_rtk/coordtrans.h

114 lines
3.6 KiB
C
Raw Normal View History

2024-02-05 17:39:56 +08:00
#ifndef __COORDTRANS_H__
#define __COORDTRANS_H__
#include <stdio.h>
#define MATH_PI 3.14159265358979323846
/*! 大地坐标系类型
*/
enum GEODETIC_COORD_SYSTEM { BJ54 = 0, XA80, WGS84, WGS2000 };
/*! 椭球参数存储格式
*/
struct Datum {
double A; // 椭球长半轴
double F; // 椭球扁率
double B; // 椭球短半轴
double E12; // 椭球第一偏心率平方
double E22; // 椭球第二偏心率平方
int L0; // 本初子午线
int zoneWidth; // 度带
};
/*! 椭球参数初始化
* @param a
* @param f
* @param L0 线
*/
void DatumInitialize(struct Datum *newd, double a, double f, int l0);
/*! 设置度带
* @param zoneWidth
*/
void DatumSetZoneWidth(struct Datum *newd, int zoneWidth);
/*! 获取度带带号
* @param l
* @return
*/
int DatumGetZoneNo(struct Datum *newd, double l);
extern struct Datum g_coord_p[]; // 椭球参数集保存结构
/*! 椭球参数计算
* @param val
* @param L0 线
* @return
*/
void DatumEllipsoidal(int L0, enum GEODETIC_COORD_SYSTEM val, struct Datum *out);
/*! 输入参数格式(配置参数)
*/
struct ConfigParam {
double dx; // x坐标平移量(米)
double dy; // y坐标平移量(米)
double dz; // z坐标平移量(米)
double wx; // x坐标旋转角度(秒)
double wy; // y坐标旋转角度(秒)
double wz; // z坐标旋转角度(秒)
double k; // 尺度因子(ppm)这里其实应该用变量m表示
double height; // 投影面高程
enum GEODETIC_COORD_SYSTEM gcsSrc; // 原始坐标系
enum GEODETIC_COORD_SYSTEM gcsDst; // 结果坐标系
};
/*! 坐标点格式
*/
struct Point {
double x; // b // x
double y; // l // y
double z; // h // h
};
/*! 输出平面坐标
* @param p p.B:p.L:
* @param config
* @return
*/
struct Point d2p(struct Point *p, struct ConfigParam *config);
/*! 地心大地坐标系 转换到 地心直角坐标系
* @param pointBLH B: L: H:
* @param datum
*/
struct Point BLH2XYZ(struct Point *pointBLH, struct Datum *datum);
/*! 空间直角坐标系间的 七参数转换
* @note:
* @param: dX, dY, dZ:
* @param: wX, wY, wZ: ()
* @param: Kppm: ppm 1000000
*/
struct Point XYZ2XYZ(struct Point *source, double dX, double dY, double dZ, double wX, double wY, double wZ,
double Kppm);
/*! 地心直角坐标系 转换到 地心大地坐标系
*/
struct Point XYZ2BLH(struct Point *pointXYZ, struct Datum *datum);
/*! 地心大地坐标系 转换到 大地平面坐标系
* @note:
* @param: prjHeight:
*/
struct Point BL2xy(struct Point *pointBLH, struct Datum *datum, double prjHeight, double *offsetX_o, double *offsetY_o);
/*! 输出大地坐标
* @param p
* @param config
* @return
*/
struct Point p2d(struct Point *pointxy, struct ConfigParam *config);
/*! 大地平面坐标系 转换到 地心大地坐标系
* @param: prjHeight:
*/
struct Point xy2BL(struct Point *pointxy, struct Datum *datum, double prjHeight, double *offsetX_o, double *offsetY_o);
#endif // __COORDTRANS_H__