diff --git a/lib/maths/mathfunc.cpp b/lib/maths/mathfunc.cpp index de2bd44..939e03d 100644 --- a/lib/maths/mathfunc.cpp +++ b/lib/maths/mathfunc.cpp @@ -88,16 +88,11 @@ double gctl::sqrtn(double d,int n,double eps) return halfx; } -/** - * @brief 计算一个椭圆在不同位置的半径 - * - * @param[in] x_len x方向半径 - * @param[in] y_len y方向半径 - * @param[in] x_arc 椭圆绕原点逆时针旋转的角度 (弧度) - * @param[in] arc 计算方向与x轴正方向的夹角(弧度) 逆时针为正 - * - * @return 半径值 - */ +double gctl::geographic_area(double lon1, double lon2, double lat1, double lat2, double R) +{ + return fabs(R*R*(arc(lon2) - arc(lon1))*(sind(lat2) - sind(lat1))); +} + double gctl::ellipse_radius_2d(double x_len, double y_len, double arc, double x_arc) { if (fabs(x_len - y_len) < 1e-8) // 就是个圆 直接加 @@ -108,20 +103,6 @@ double gctl::ellipse_radius_2d(double x_len, double y_len, double arc, double x_ return sqrt(pow(x_len*cos(arc-x_arc),2) + pow(y_len*sin(arc-x_arc),2)); } -/** - * @brief 计算已椭圆为基准面的高程数据的绝对坐标位置。 - * - * 假设高程数据的测量方向(如大地水准面)为椭圆切线的垂直方向(与切点与坐标原点的连线方向不一致) - * 则高程点的绝对空间位置的维度值与切点的维度值也不一致。此函数可以计算校正后的维度值与球心半径。 - * - * @param x_len 椭圆的x方向半径(一般为长轴) - * @param y_len 椭圆的y方向半径(一般为短轴) - * @param arc 计算方向与x轴正方向的夹角(弧度) 逆时针为正(等于纬度) - * @param elev 切点的高程值 - * @param out_arc 校正后的维度值 - * @param out_rad 校正后高程点的球心半径 - * @param x_arc x轴正方向绕原点逆时针旋转的角度 (弧度),默认为0 - */ void gctl::ellipse_plus_elevation_2d(double x_len, double y_len, double arc, double elev, double &out_arc, double &out_rad, double x_arc) { @@ -158,17 +139,6 @@ void gctl::ellipse_plus_elevation_2d(double x_len, double y_len, double arc, dou return; } -/** - * @brief 椭球或者球在不同球面位置的半径 - * - * @param[in] x_len x方向半径 - * @param[in] y_len y方向半径 - * @param[in] z_len z方向半径 - * @param[in] phi 计算方向与x轴正方向的夹角(弧度) 逆时针为正 - * @param[in] theta 计算方向与z轴正方向的夹角(弧度) 逆时针为正 - * - * @return 半径值 - */ double gctl::ellipsoid_radius(double x_len, double y_len, double z_len, double phi, double theta) { return x_len*y_len*z_len/sqrt(pow(y_len*z_len*sin(theta)*cos(phi),2) + diff --git a/lib/maths/mathfunc.h b/lib/maths/mathfunc.h index ae5c557..b030577 100644 --- a/lib/maths/mathfunc.h +++ b/lib/maths/mathfunc.h @@ -71,6 +71,18 @@ namespace gctl */ double sqrtn(double val, int order, double eps = 1e-5); + /** + * @brief 计算经纬度网格的面积 + * + * @param lon1 经度起点 + * @param lon2 经度终点 + * @param lat1 纬度起点 + * @param lat2 纬度终点 + * @param R 半径 + * @return 面积 + */ + double geographic_area(double lon1, double lon2, double lat1, double lat2, double R); + /** * @brief 计算一个椭圆在不同位置的半径 * diff --git a/lib/maths/mathfunc_t.h b/lib/maths/mathfunc_t.h index e21db46..c6baae5 100644 --- a/lib/maths/mathfunc_t.h +++ b/lib/maths/mathfunc_t.h @@ -42,6 +42,12 @@ namespace gctl return (T(0) < d) - (d < T(0)); } + template + inline T arc(T deg) + { + return deg*GCTL_Pi/180.0; + } + template inline T sind(T deg) {