||
1)proj4库下载地址: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
2)wkt字符串
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)。
3)ogr库
ogr库是gdal的一部分,定义并实现了空间参考类OGRSpatialReference,这个库不仅能自定义地图投影参数,还实现了wkt和proj4两个字符串接口,用起来很方便。相关头文件和类的部分函数如下:
#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 );
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-10-19 23:02
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社