EC600U_esp32_iap_uart/EC600U_rtk/coordtrans.h
2024-02-05 17:39:56 +08:00

114 lines
3.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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__