simorthoprogram/simorthoprogram-orth_gf3-strip/baseTool.h

433 lines
12 KiB
C
Raw Normal View History

2024-02-20 02:28:15 +00:00
#pragma once
///
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A1A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///
//#define EIGEN_USE_MKL_ALL
//#define EIGEN_VECTORIZE_SSE4_2
//#include <mkl.h>
//#include <mkl.h>
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <time.h>
#include <string>
#include <omp.h>
#include <complex>
#include <gdal.h>
#include <gdal_priv.h>
#include <gdalwarper.h>
#include <ogrsf_frmts.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/eigen.hpp>
#include <opencv2/features2d.hpp>
#include <fstream>
using namespace std;
using namespace Eigen;
#define PI_180 180/3.141592653589793238462643383279
#define T180_PI 3.141592653589793238462643383279/180
#define LIGHTSPEED 299792458
#define Radians2Degrees(Radians) Radians*PI_180
#define Degrees2Radians(Degrees) Degrees*T180_PI
const double PI = 3.141592653589793238462643383279;
const double epsilon = 0.000000000000001;
const double pi = 3.14159265358979323846;
const double d2r = pi / 180;
const double r2d = 180 / pi;
const double a = 6378137.0; //<2F><><EFBFBD>򳤰<EFBFBD><F2B3A4B0><EFBFBD>
const double ae = 6378137.0; //<2F><><EFBFBD>򳤰<EFBFBD><F2B3A4B0><EFBFBD>
const double ee= 0.0818191910428;// <20><>һƫ<D2BB><C6AB><EFBFBD><EFBFBD>
const double f_inverse = 298.257223563; //<2F><><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
const double b = a - a / f_inverse;
const double eSquare = (a * a - b * b) / (a * a);
const double e = sqrt(eSquare);
const double earth_Re = 6378136.49;
const double earth_Rp = (1 - 1 / f_inverse) * earth_Re;
const double earth_We = 0.000072292115;
///////////////////////////////////// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ӡ //////////////////////////////////////////////////////////
std::string getCurrentTimeString();
std::string getCurrentShortTimeString();
/////////////////////////////// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> //////////////////////////////////////////////////////////
/// <summary>
/// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
struct Landpoint // <20><> SARӰ<52><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
/// <summary>
/// <20><><EFBFBD><EFBFBD>x
/// </summary>
double lon; // <20><><EFBFBD><EFBFBD>x lon pixel_col
/// <summary>
/// γ<><CEB3>y
/// </summary>
double lat; // γ<><CEB3>y lat pixel_row
/// <summary>
/// <20>߶<EFBFBD>z
/// </summary>
double ati; // <20>߳<EFBFBD>z ati pixel_time
};
struct Point_3d {
double x;
double y;
double z;
};
Landpoint operator +(const Landpoint& p1, const Landpoint& p2);
Landpoint operator -(const Landpoint& p1, const Landpoint& p2);
bool operator ==(const Landpoint& p1, const Landpoint& p2);
Landpoint operator *(const Landpoint& p, double scale);
/// <summary>
/// <20><><EFBFBD><EFBFBD>A,B<>ļн<C4BC>,<2C>Ƕ<EFBFBD>
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns><3E>Ƕ<EFBFBD><C7B6><EFBFBD> 0-360<36>ȣ<EFBFBD><C8A3><EFBFBD>ʱ<EFBFBD><CAB1></returns>
double getAngle(const Landpoint& a, const Landpoint& b);
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns></returns>
double dot(const Landpoint& p1, const Landpoint& p2);
double getlength(const Landpoint& p1);
Landpoint crossProduct(const Landpoint& a, const Landpoint& b);
struct DemBox {
double min_lat; //γ<><CEB3>
double min_lon;//<2F><><EFBFBD><EFBFBD>
double max_lat;//γ<><CEB3>
double max_lon;//<2F><><EFBFBD><EFBFBD>
};
/// <summary>
/// gdalImageͼ<65><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class gdalImage
{
public: // <20><><EFBFBD><EFBFBD>
gdalImage(string raster_path);
~gdalImage();
void setHeight(int);
void setWidth(int);
void setTranslationMatrix(Eigen::MatrixXd gt);
void setData(Eigen::MatrixXd);
Eigen::MatrixXd getData(int start_row, int start_col, int rows_count, int cols_count, int band_ids);
void saveImage(Eigen::MatrixXd,int start_row,int start_col, int band_ids);
void saveImage();
void setNoDataValue(double nodatavalue,int band_ids);
int InitInv_gt();
Landpoint getRow_Col(double lon, double lat);
Landpoint getLandPoint(double i, double j, double ati);
double mean(int bandids=1);
double max(int bandids=1);
double min(int bandids=1);
GDALRPCInfo getRPC();
Eigen::MatrixXd getLandPoint(Eigen::MatrixXd points);
Eigen::MatrixXd getHist(int bandids);
public:
string img_path; // ͼ<><CDBC><EFBFBD>ļ<EFBFBD>
int height; // <20><>
int width; // <20><>
int band_num;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int start_row;//
int start_col;//
int data_band_ids;
Eigen::MatrixXd gt; // <20><EFBFBD><E4BBBB><EFBFBD><EFBFBD>
Eigen::MatrixXd inv_gt; // <20><><EFBFBD><EFBFBD><E4BBBB><EFBFBD><EFBFBD>
Eigen::MatrixXd data;
string projection;
};
gdalImage CreategdalImage(string img_path, int height, int width, int band_num, Eigen::MatrixXd gt, std::string projection, bool need_gt=true);
void clipGdalImage(string in_path, string out_path, DemBox box, double pixelinterval);
int ResampleGDAL(const char* pszSrcFile, const char* pszOutFile, double* gt, int new_width, int new_height, GDALResampleAlg eResample);
int ResampleGDALs(const char* pszSrcFile, int band_ids, GDALRIOResampleAlg eResample=GRIORA_Bilinear);
/////////////////////////////// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> //////////////////////////////////////////////////////////
string Convert(float Num);
std::string JoinPath(const std::string& path, const std::string& filename);
////////////////////////////// <20><><EFBFBD>겿<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //////////////////////////////////////////
/// <summary>
/// <20><><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ع̲<D8B9><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
/// </summary>
/// <param name="XYZP"><3E><>γ<EFBFBD>ȵ<EFBFBD>--degree</param>
/// <returns>ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5></returns>
Landpoint LLA2XYZ(const Landpoint& LLA);
Eigen::MatrixXd LLA2XYZ(Eigen::MatrixXd landpoint);
/// <summary>
/// <20><><EFBFBD>ع̲<D8B9><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵת<CFB5><D7AA>Ϊ<EFBFBD><CEAA>γ<EFBFBD><CEB3>
/// </summary>
/// <param name="XYZ"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <returns><3E><>γ<EFBFBD><CEB3>--degree</returns>
Landpoint XYZ2LLA(const Landpoint& XYZ);
////////////////////////////// <20><><EFBFBD>겿<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //////////////////////////////////////////
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><D8B1><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="p0"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <param name="p1"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <param name="p2"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <param name="p3"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <param name="p4"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>Ƕ<EFBFBD></returns>
//Landpoint getSlopeVector(Landpoint& p0, Landpoint& p1, Landpoint& p2, Landpoint& p3, Landpoint& p4, Eigen::MatrixXd UTC, double xp, double yp, double dut1, double dat);
Landpoint getSlopeVector(const Landpoint& p0, const Landpoint& p1, const Landpoint& p2, const Landpoint& p3, const Landpoint& p4);
////////////////////////////// <20><>ֵ ////////////////////////////////////////////
complex<double> Cubic_Convolution_interpolation(double u,double v,Eigen::MatrixX<complex<double>> img);
complex<double> Cubic_kernel_weight(double s);
double Bilinear_interpolation(Landpoint p0, Landpoint p11, Landpoint p21, Landpoint p12, Landpoint p22);
inline float cross2d(Point_3d a, Point_3d b) { return a.x * b.y - a.y * b.x; }
inline Point_3d operator-(Point_3d a, Point_3d b) {
return Point_3d{ a.x - b.x, a.y - b.y, a.z - b.z };
};
inline Point_3d operator+(Point_3d a, Point_3d b) {
return Point_3d{ a.x + b.x, a.y +b.y, a.z + b.z };
};
inline double operator/(Point_3d a, Point_3d b) {
return sqrt(pow(a.x,2)+ pow(a.y, 2))/sqrt(pow(b.x, 2)+ pow(b.y, 2));
};
inline bool onSegment(Point_3d Pi, Point_3d Pj, Point_3d Q)
{
if ((Q.x - Pi.x) * (Pj.y - Pi.y) == (Pj.x - Pi.x) * (Q.y - Pi.y) //<2F><><EFBFBD><EFBFBD>
//<2F><>֤Q<D6A4><51><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pi,pj֮<6A><D6AE>
&& min(Pi.x, Pj.x) <= Q.x && Q.x <= max(Pi.x, Pj.x)
&& min(Pi.y, Pj.y) <= Q.y && Q.y <= max(Pi.y, Pj.y))
return true;
else
return false;
}
inline Point_3d invBilinear(Point_3d p, Point_3d a, Point_3d b, Point_3d c, Point_3d d)
{
Point_3d res ;
Point_3d e = b - a;
Point_3d f = d - a;
Point_3d g = a - b + c - d;
Point_3d h = p - a;
double k2 = cross2d(g, f);
double k1 = cross2d(e, f) + cross2d(h, g);
double k0 = cross2d(h, e);
double u, v;
// if edges are parallel, this is a linear equation
if (abs(k2) < 0.001)
{
v = -k0 / k1;
u = (h.x - f.x *v) / (e.x + g.x *v);
p.z = a.z + (b.z - a.z) * u + (d.z - a.z) * v + (a.z - b.z + c.z - d.z) * u * v;
return p;
}
// otherwise, it's a quadratic
else
{
float w = k1 * k1 - 4.0 * k0 * k2;
if (w < 0.0){
// <20><><EFBFBD><EFBFBD><EFBFBD>ڱ߽<DAB1><DFBD><EFBFBD>
if (onSegment(a, b, p)) {
Point_3d tt = b - a;
Point_3d ttpa = p - a;
double scater=ttpa / tt;
if(scater<0||scater>1){ return { -9999,-9999,-9999 }; }
p.z = a.z + scater * tt.z;
return p;
}
else if (onSegment(b, c, p)) {
Point_3d tt = c-b;
Point_3d ttpa = p - b;
double scater = ttpa / tt;
if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; }
p.z = b.z + scater * tt.z;
return p;
}
else if (onSegment(c, d, p)) {
Point_3d tt = d-c;
Point_3d ttpa = p - c;
double scater = ttpa / tt;
if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; }
p.z = c.z + scater * tt.z;
return p;
}
else if (onSegment(d, a, p)) {
Point_3d tt = a-d;
Point_3d ttpa = p - d;
double scater = ttpa / tt;
if (scater < 0 || scater>1) { return { -9999,-9999,-9999 }; }
p.z = d.z + scater * tt.z;
return p;
}
return { -9999,-9999,-9999 };
}
else {
w = sqrt(w);
float ik2 = 0.5 / k2;
float v = (-k1 - w) * ik2;
float u = (h.x - f.x * v) / (e.x + g.x * v);
if (u < 0.0 || u>1.0 || v < 0.0 || v>1.0)
{
v = (-k1 + w) * ik2;
u = (h.x - f.x * v) / (e.x + g.x * v);
}
p.z = a.z + (b.z - a.z) * u + (d.z - a.z) * v + (a.z - b.z + c.z - d.z) * u * v;
return p;
}
}
p.z = a.z + (b.z - a.z) * u + (d.z - a.z) * v + (a.z - b.z + c.z - d.z) * u * v;
return p;
}
//
// WGS84 <20><>J2000 <20><><EFBFBD><EFBFBD>ϵ<EFBFBD>ı
// <20>ο<EFBFBD><CEBF><EFBFBD>ַ<EFBFBD><D6B7>https://blog.csdn.net/hit5067/article/details/116894616
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>http://celestrak.org/spacedata/
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>
// a. Earth Orientation Parameter <20>ļ<EFBFBD><C4BC><EFBFBD> http://celestrak.org/spacedata/EOP-Last5Years.csv
// b. Space Weather Data <20>ļ<EFBFBD><C4BC><EFBFBD> http://celestrak.org/spacedata/SW-Last5Years.csv
// <20><>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>2017<31><37>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/**
<EFBFBD><EFBFBD>wgs84 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵת<EFBFBD><EFBFBD>J2000 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ <EFBFBD><EFBFBD>Ҫ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>WGS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>̵<EFBFBD> t ,BLH
ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
step 1: WGS 84 ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
step 2: Э<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ ת<EFBFBD><EFBFBD>Ϊ˲ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
step 3: ˲ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ ת<EFBFBD><EFBFBD>Ϊ ˲ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
step 4: ˲ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ ת<EFBFBD><EFBFBD>˲ʱƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
step 5: ˲ʱƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵת<EFBFBD><EFBFBD>ΪЭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD>J2000<EFBFBD><EFBFBD>
**/
inline double sind(double degree) {
return sin(degree * d2r);
}
inline double cosd(double d) {
return cos(d * d2r);
}
/*
class WGS84_J2000
{
public:
WGS84_J2000();
~WGS84_J2000();
public:
// step1 WGS 84 ת<><D7AA><EFBFBD><EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
static Eigen::MatrixXd WGS84TECEF(Eigen::MatrixXd WGS84_Lon_lat_ait);
//step 2 Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ ת<><D7AA>Ϊ˲ʱ<CBB2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
static Eigen::MatrixXd ordinateSingleRotate(int axis, double angle_deg);
// step 3 ˲ʱ<CBB2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ ת<><D7AA>Ϊ ˲ʱ<CBB2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
// xyz= ordinateSingleRotate('z',-gst_deg)*earthFixedXYZ;
static int utc2gst(Eigen::MatrixXd UTC, double dUT1, double dAT, double& gst_deg, double& JDTDB);
// step 4 ˲ʱ<CBB2><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ ת<><D7AA>˲ʱƽ<CAB1><C6BD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ϵ
static int nutationInLongitudeCaculate(double JD, double& epthilongA_deg, double& dertaPthi_deg, double& dertaEpthilong_deg, double& epthilong_deg);
// step5 ˲ʱƽ<CAB1><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵת<CFB5><D7AA>ΪЭ<CEAA><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>J2000<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> JDTDB Ϊ<><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> <20>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѧʱ<D1A7><CAB1>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B7BD><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĺ<D0B5><C4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// xyz=ordinateSingleRotate('Z',zetaA)*ordinateSingleRotate('y',-thitaA)*ordinateSingleRotate('z',zA)*xyz;
static int precessionAngle(double JDTDB, double& zetaA, double& thitaA, double& zA);
// YMD2JD ͬʱ YMD2JD<4A><44><EFBFBD><EFBFBD>Ϊ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5> <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EAB7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_${<7B><>С<EFBFBD><D0A1>}<7D>IJ<EFBFBD><C4B2><EFBFBD>-CSDN<44><4E><EFBFBD><EFBFBD>_<EFBFBD><5F><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>ʽ
static double YMD2JD(double y, double m, double d);
static Eigen::MatrixXd WGS842J2000(Eigen::MatrixXd BLH_deg_m, Eigen::MatrixXd UTC, double xp, double yp, double dut1, double dat);
static Landpoint WGS842J2000(Landpoint LBH_deg_m, Eigen::MatrixXd UTC, double xp, double yp, double dut1, double dat);
public:
static std::string EOP_File_Path;
static std::string Space_Weather_Data;
// IAU2000ģ<30><C4A3><EFBFBD><EFBFBD>77<37><37>11<31><31>
static Eigen::Matrix<double, 77, 11> IAU2000ModelParams;
};
*/
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ߶Ƚǡ<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ǣ<EFBFBD>XYZתENU<EFBFBD><EFBFBD>ENUתRAH<EFBFBD><EFBFBD> https://blog.csdn.net/why1472587/article/details/128178417
*/
//<2F><>γ<EFBFBD>ȣ<EFBFBD>BLH<4C><48>
typedef struct BLH {
double B;
double L;
double H;
};
//վ<><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵҲ<CFB5><D2B2>NEU<45><55><EFBFBD><EFBFBD>ϵ<EFBFBD>򶫱<EFBFBD><F2B6ABB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
typedef struct ENU {
double E;
double N;
double U;
};
//rΪ<72><CEAA><EFBFBD><EFBFBD><EFBFBD>򾶣<EFBFBD><41><CEAA><EFBFBD>Ƿ<EFBFBD>λ<EFBFBD>ǣ<EFBFBD><68><CEAA><EFBFBD>ǵĸ߶Ƚǡ<C8BD>
typedef struct RAH {
double R;
double A;
double H;
};
//xyzתblh<6C><68>
BLH xyz2blh(double X, double Y, double Z);
//xyzתenu Xr <20><>֪<EFBFBD><D6AA>վ<EFBFBD><D5BE><EFBFBD><EFBFBD>
ENU xyz2enu(double Xr, double Yr, double Zr, double Xs, double Ys, double Zs);
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>λ<EFBFBD>ǡ<EFBFBD><C7A1>߶Ƚ<DFB6>
RAH Satrah(double Xr, double Yr, double Zr, double Xs, double Ys, double Zs);
//<2F><>ֵд<D6B5>뵽txt<78><74>
void creatTxt(const std::string& txtPath, const std::string& data);