最近学习Opendrive地图解析需要使用到投影坐标变换,于是开始学习PROJ4,PROJ4的源代码可在GitHub中找到,地址如下:https://github.com/OSGeo/PROJ,PROJ4官方文档链接如下:Data types — PROJ 8.2.1 documentation,编译过程可参考我的文章:PROJ4在Ubuntu18.04系统的编译过程及测试代码_Rogers_的博客-CSDN博客
回到正题,针对我所常用的数据类型和函数解释及用法如下:
数据类型 | 数据含义 |
PJ | 最基础的数据类型,用于存储给定投影的所有信息 |
PJ_DIRECTION | 投影变换关系,有三个值1,0,-1分别代表正变换,不变,负变换,也可用PJ_FWD,PJ_IDENT,PJ_INV表示 |
PJ_CONTEXT | 上下文,创建一个上下文即一个投影在一个线程的操作,使用proj_context_create()进行创建,并使用proj_context_destroy()销毁 |
PJ_AREA | 在proj_create_crs_to_crs()中选择所给两个坐标参考系中的最佳转换 |
PJ_LP | 结构体,存储大地坐标经纬度,通常以弧度表示,包含两个变量, PJ_LP.lam即为经度,PJ_LP.phi即为纬度 |
PJ_XY | 结构体,存储笛卡尔坐标,包含两个变量,x,y,分别代表东和北方向 |
PJ_UV | 结构体,存储通用坐标,包含两个变量,u,v,可以替代上述两个坐标,取决于用法 |
三维坐标系和时空坐标系的数据类型PJ_LPZ 相较二维多一个z,代表垂直分量 PJ_XYZ 同上 PJ_UVW 同上
PJ_LPZT | 相较三维多一个t,代表时间分量 |
PJ_XYZT | 同上 |
PJ_UVWT | 同上,也可以用enu表示前三个变量 |
另外还有旋转角,方位角等不常用,用到时可自行去官网查询用法和解释;
PJ_COORD:复杂坐标系类型,为所有坐标系的集合,可用于表示任何坐标系,指定坐标系可使用PJ_COORD.坐标系类型,如PJ_COORD.xyzt。
PJ_FACTORS:投影因素,具体如下:
typedef struct {
double meridional_scale;//经纬度坐标的子午线刻度
double parallel_scale;//经纬度坐标的平行刻度
double areal_scale;//经纬度坐标的面积比例因子
double angular_distortion;//经纬度坐标的角变形
double meridian_parallel_angle;//经纬度坐标的子午线或平行线角度
double meridian_convergence;//经纬度坐标的网格偏角
double tissot_semimajor;//最大比例因子
double tissot_semiminor;//最小比例因子
double dx_dlam;//x对经度的偏导
double dx_dphi;//x对纬度的偏导
double dy_dlam;//y对经度的偏导
double dy_dphi;//y对纬度的偏导
} PJ_FACTORS;
PJ_OPERATIONS | 结构体,用于描述对投影的操作,id代表该操作的编号,PJ代表操作的切入点,descr代表操作说明 |
PJ_ELLPS | 结构体,用于描述椭球体的属性,id代表椭球体编号,major代表椭球的长半轴或球体半径,ell代表椭球参数,name代表椭球体名称 |
PJ_UNITS | 结构体,描述距离单位,详细见文档 |
PJ_PRIME_MERIDIANS | 结构体,描述本初子午线,详细见文档 |
剩下数据类型,对投影操作用处不大,此处不做解释,需要时详细见文档。
常用函数还在摸索中,内容也很多,将会留到下篇文章进行编写,初次写文章还不熟练,希望各路大佬批评指正!感谢。