将源码编译成动态链接库,得到库文件proj_i.lib和动态链接库proj.dll
这个库有两大功能:1)定义地图投影;2)实现投影坐标与地理坐标的正反变换。
常用函数与用法举例:
#include "projects.h"
#define RAD_TO_DEG57.29577951308232
#define DEG_TO_RAD.0174532925199432958
intmain()
{
char* pszProj4Defn ="+proj=utm +zone=50 +datum=WGS84 +units=m +no_defs";
//初始化
projPJpj = pj_init_plus(pszProj4Defn);
projXYprojected_loc;
projLPgeodetic_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);
return0;
}
运行结果如下:
+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的接口函数
OGRErrimportFromProj4(const char* );//根据proj4字符串初始化
OGRErrexportToProj4(char** )const;//输出proj4字符串
3.2)与wkt字符串的接口函数
OGRErrimportFromWkt(char** );//根据现有wkt初始化
OGRErrexportToWkt(char** )const;//输出wkt字符串
3.3) 常用的用户自定义地图投影函数
/** Universal Transverse Mercator */
OGRErrSetUTM(intnZone,intbNorth =TRUE);
/** Transverse Mercator */
OGRErrSetTM(doubledfCenterLat,doubledfCenterLong,
doubledfScale,
doubledfFalseEasting,doubledfFalseNorthing );
OGRErrSetGeogCS(const char* pszGeogName,
const char* pszDatumName,
const char* pszEllipsoidName,
doubledfSemiMajor,doubledfInvFlattening,
const char* pszPMName =NULL,
doubledfPMOffset = 0.0,
const char* pszUnits =NULL,
doubledfConvertToRadians = 0.0 );
OGRErrSetTOWGS84(double,double,double,
double= 0.0,double= 0.0,double= 0.0,
double= 0.0 );
/**或者直接从epsg编码一次性得到所有参数 */
OGRErrimportFromEPSG(int);
转载本文请联系原作者获取授权,同时请注明本文来自金淑英科学网博客。
链接地址:http://blog.sciencenet.cn/blog-3465734-1271126.html
上一篇:摄影测量与计算机视觉的几何关系及其转换
下一篇:卫星影像的虚拟化处理方法