jsy的个人博客分享 http://blog.sciencenet.cn/u/jsy

博文

地图投影相关库proj4和ogr

已有 2981 次阅读 2021-2-7 19:22 |个人分类:点滴积累|系统分类:科研笔记

1proj4库下载地址:https://proj.org/download.html


将源码编译成动态链接库,得到库文件proj_i.lib和动态链接库proj.dll


 这个库有两大功能:1)定义地图投影;2)实现投影坐标与地理坐标的正反变换。


 常用函数与用法举例: 


#include "projects.h" 

#define RAD_TO_DEG  57.29577951308232

#define DEG_TO_RAD  .0174532925199432958 

int main()

{

    char*  pszProj4Defn = "+proj=utm +zone=50 +datum=WGS84 +units=m +no_defs";

 

    //初始化

    projPJ pj = pj_init_plus(pszProj4Defn);

 

    projXY projected_loc;

    projLP geodetic_loc;

 

    geodetic_loc.u = 116.32*DEG_TO_RAD;

    geodetic_loc.v = 30.15*DEG_TO_RAD;

 

    projected_loc = pj_fwd(geodetic_loc, (PJ*)pj);//坐标正算(从地理坐标到投影坐标)

    geodetic_loc = pj_inv(projected_loc, (PJ*)pj);//坐标反算(从投影坐标到地理坐标)

 

    printf( "%s\n", pszProj4Defn);

    printf( "%lf  %lf \n", geodetic_loc.u*RAD_TO_DEG, geodetic_loc.v*RAD_TO_DEG);

    printf( "%lf  %lf \n", projected_loc.u, projected_loc.v);

 

    return 0;

 

}

 

运行结果如下:

+proj=utm +zone=50 +datum=WGS84 +units=m +no_defs

116.320000  30.150000

434513.663145  3335601.945570

 

2wkt字符串

 

Wkt是用于描述地图投影的结构化的空间参考字符串,可以通过gdal函数GetProjectionRef()从现有图像获取,其典型结构如下所示:

 

PROJCS["UTM_Zone_50N",//投影名称

         GEOGCS["GCS_WGS_1984",//地理坐标系名称

                   DATUM["WGS_1984",//空间参考大地基准名称

                            SPHEROID["WGS_84",6378137.0,298.257223563]],//参考椭球及参数

                   PRIMEM["Greenwich",0.0],//子午线名称,与格林威治子午线偏差

                   UNIT["Degree",0.0174532925199433]],//地理坐标系单位:每个单位多少弧度

         PROJECTION["Transverse_Mercator"],//地图投影类型

                   PARAMETER["False_Easting",500000.0],//地图投影参数:东偏多少米

                   PARAMETER["False_Northing",0.0], //地图投影参数:北偏多少米

                   PARAMETER["Central_Meridian",117.0], //地图投影参数:中央经线多少度

                   PARAMETER["Scale_Factor",0.9996], //地图投影参数:比例系数

                   PARAMETER["Latitude_Of_Origin",0.0], //地图投影参数:中心纬线多少度

                   UNIT["Meter",1]] //地图投影参数:投影坐标系单位:每个单位多少米

 

Wkt是一个嵌套的结构体字符串。空间参考包括两种类型,

一是地理坐标系(GEOGCS),

二是投影坐标系(PROJCS),其中投影坐标系(PROJCS)是定义在地理坐标系(GEOGCS)的基础之上的,包括投影类型(PROJECTION)和相关的参数(PARAMETER)。

地理坐标系也是一个嵌套的结构体字符串,包括:大地基准(DATUM)和零子午线(PRIMEM)。

其中大地基准(DATUM)包括参考椭球(SPHEROID)的形状(扁率)、大小(长半轴)和定位、定向两部分。定位、定向通常用ToWGS84七参数来表示,如果ToWGS84七参数省略,就表示当前参考椭球与WGS84椭球的中心点重合且三坐标轴方向和坐标单位均与WGS84参考椭球相一致。

其中零子午线(PRIMEM)参数指的是零子午线与格林威治子午线之差,此值绝大多数情况下为0.0,此时,坐标为地理经纬度的大地基准(DATUM)相当于是地理坐标系了。


投影坐标系的参数与投影类型是相关的。常用的如TM(横轴墨卡托)投影参数包括:中央经线(Central_Meridian)、中心纬线(Latitude_Of_Origin)、东偏(False_Easting)、北偏(False_Northing)、比例系数(Scale_Factor)这5个投影参数。其中UTM(通用横轴墨卡托)投影是TM(横轴墨卡托)投影的一个特例,UTM投影参数5个参数固定为如下值:

中心纬线(Latitude_Of_Origin):0

东偏(False_Easting):500000

北偏(False_Northing):0(北半球)或10000000(南半球)

比例系数(Scale_Factor):0.9996

中央经线(Central_Meridian):带号*6-183  (其中带号的取值范围1~60

可以看出UTM投影相当于只有2个投影参数:带号,是否北半球。

 

地理坐标系单位(UNIT)一般为角度(Degree),投影坐标系单位(UNIT)一般为米(Meter)。

 

3ogr

ogr库是gdal的一部分,定义并实现了空间参考类OGRSpatialReference,这个库不仅能自定义地图投影参数,还实现了wktproj4两个字符串接口,用起来很方便。相关头文件和类的部分函数如下:

#include "ogr_spatialref.h"

3.1) 与proj4的接口函数

    OGRErr      importFromProj4( const char * );//根据proj4字符串初始化

OGRErr      exportToProj4( char ** ) const;//输出proj4字符串

3.2) wkt字符串的接口函数

    OGRErr      importFromWkt( char ** );//根据现有wkt初始化

OGRErr      exportToWkt( char ** ) const;//输出wkt字符串

3.3) 常用的用户自定义地图投影函数

    /** Universal Transverse Mercator */

    OGRErr      SetUTM( int nZone, int bNorth = TRUE );

    /** Transverse Mercator */

    OGRErr      SetTM( double dfCenterLat, double dfCenterLong,

                       double dfScale,

                       double dfFalseEasting, double dfFalseNorthing );

    OGRErr      SetGeogCS( const char * pszGeogName,

                           const char * pszDatumName,

                           const char * pszEllipsoidName,

                           double dfSemiMajor, double dfInvFlattening,

                           const char * pszPMName = NULL,

                           double dfPMOffset = 0.0,

                           const char * pszUnits = NULL,

                           double dfConvertToRadians = 0.0 );

    OGRErr      SetTOWGS84( double, double, double,

                            double = 0.0, double = 0.0, double = 0.0,

                            double = 0.0 );

/** 或者直接从epsg编码一次性得到所有参数 */

    OGRErr      importFromEPSG( int );




https://wap.sciencenet.cn/blog-3465734-1271126.html

上一篇:摄影测量与计算机视觉的几何关系及其转换
下一篇:卫星影像的虚拟化处理方法
收藏 IP: 171.113.200.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-28 00:47

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部