改动GDAL库支持RPC像方改正模型
近期在做基于RPC的像方改正模型。方便对数据进行測试,改动了GDAL库中的RPC纠正模型,使之能够支持RPC像方改正參数。
以下是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一化后的经度纬度高程。
将上面的公式变形,使用偏移系数和缩放系数带入,能够得到图像的行列号坐标与经纬度坐标之间的坐标转换关系。整理后的公式例如以下所看到的。下标带s的为缩放系数,下标为0的表示偏移系数,rc为图像行列号,此处的PLH为地面经纬度坐标。P1~P4为有理函数的多项式系数。
使用像方改正模型的公式例如以下所看到的,Line和Sample为图像的行列号,rc为通过RPC模型将地面点经纬度高程计算得到的行列号,deltaR和DeltaC为像方改正数。
deltaR和DeltaC像方改正数使用仿射变换模型,详细公式例如以下,A0~A2为行方向的改正系数,B0~B2为列方向改正系数。无改正时这六个系数均为0.
将上面两个公式合并之后,再将DeltaR和DeltaC移向等式坐标,合并同类项之后。就得到了终于的一个仿射变换系数。此时无改正时。六个系数变为0 1 0 0 0 1。该系数为以下是用的终于系数。
改动的代码非常少,在GDAL源代码中的alg目录里面的gdal_rpc.cpp中,详细改动三处地方。
第一处。GDALRPCTransformInfo结构体,在结构体中添加两个double [6]的数组。用于保存RPC像方改正系数。
改动后的代码例如以下。最后两个參数adfAffineTransform和adfReverseAffineTransform分别表示RPC像方改正系数及其逆变换系数。
typedef struct {
GDALTransformerInfo sTI;
GDALRPCInfo sRPC;
double adfPLToLatLongGeoTransform[6];
int bReversed;
double dfPixErrThreshold;
double dfHeightOffset;
double dfHeightScale;
char *pszDEMPath;
DEMResampleAlg eResampleAlg;
int bHasTriedOpeningDS;
GDALDataset *poDS;
OGRCoordinateTransformation *poCT;
double adfGeoTransform[6];
double adfReverseGeoTransform[6];
double adfAffineTransform[6]; //RPC adjustment affine transform
double adfReverseAffineTransform[6]; //RPC adjustment reverse affine transform
} GDALRPCTransformInfo;
第二处。在函数GDALCreateRPCTransformer()中,主要是将參数papszOptions中的像方改正系数进行解析,然后给结构体中新加的两个数组赋值。
便于兴许进行坐标转换的时候使用。改动后的代码例如以下,因为代码太长,仅仅贴出我改动的部分代码。以下代码中The Affine transform parameters部分的代码由我新加,主要是通过一个RPC_AFFINE来指定像方改正的六个系数,六个系数中间用空格隔开。然后将解析后的六个系数计算逆变换系数。默认系数是0 1 0 0 0 1,表示不进行像方改正。
//前面的代码省略
/* -------------------------------------------------------------------- */
/* The DEM interpolation */
/* -------------------------------------------------------------------- */
const char *pszDEMInterpolation = CSLFetchNameValueDef( papszOptions, "RPC_DEMINTERPOLATION", "bilinear" );
if(EQUAL(pszDEMInterpolation, "near" ))
psTransform->eResampleAlg = DRA_NearestNeighbour;
else if(EQUAL(pszDEMInterpolation, "bilinear" ))
psTransform->eResampleAlg = DRA_Bilinear;
else if(EQUAL(pszDEMInterpolation, "cubic" ))
psTransform->eResampleAlg = DRA_Cubic;
else
psTransform->eResampleAlg = DRA_Bilinear; /* -------------------------------------------------------------------- */
/* The Affine transform parameters */
/* -------------------------------------------------------------------- */
const char *pszRpcAffine = CSLFetchNameValueDef( papszOptions, "RPC_AFFINE", "0 1 0 0 0 1" );
if(pszRpcAffine != NULL) //解析RPC像方改正仿射变换參数
{
char** papszTokens = CSLTokenizeString2( pszRpcAffine, " ", 0 );
int nTokens = CSLCount(papszTokens);
if(nTokens == 6) //must be 6
{
for (int i=0; i<6; i++)
psTransform->adfAffineTransform[i] = atof(papszTokens[i]);
}
else
{
psTransform->adfAffineTransform[1] = 1;
psTransform->adfAffineTransform[5] = 1;
} GDALInvGeoTransform( psTransform->adfAffineTransform, psTransform->adfReverseAffineTransform );
CSLDestroy(papszTokens);
} /* -------------------------------------------------------------------- */
/* Establish a reference point for calcualating an affine */
/* geotransform approximate transformation. */
/* -------------------------------------------------------------------- */
//后面的代码省略
第三处改动的地方就是在进行坐标转换的函数中。即函数GDALRPCTransform()中,这里面主要改动两部分。第一个部分就是坐标正变换的时候,第二个是坐标逆变换的时候,在坐标正变换的时候,也就是从经纬度坐标换算到原始图像行列号坐标时,等使用RPC模型转换完毕后。再使用仿射变换的逆变换系数进行改正。在坐标逆变换的时候,也就是从原始图像行列号换算到经纬度坐标时,先使用仿射变换的正变换系数进行改正,然后将改正后的行列号带入RPC模型进行转换到经纬度。改动的代码就两行。可是原始的代码太多。就贴出来我新增的部分。
//此处是坐标正变换的时候新增的代码
GDALApplyGeoTransform(psTransform->adfReverseAffineTransform, padfX[i], padfY[i], padfX + i, padfY + i );
panSuccess[i] = TRUE; //此处是坐标逆变换的时候新增的代码
GDALApplyGeoTransform(psTransform->adfAffineTransform, padfX[i], padfY[i], padfX + i, padfY + i );
double dfResultX, dfResultY;
改动完之后,保存,然后又一次编译GDAL库就可以。
之后我们就能够使用gdalwarp.exe这个超牛的工具来进行校正了。详细的命令就是在原来使用-rpc的命令基础上,添加一个-to “RPC_AFFINE=0 1 0 0 0 1”就可以。当然这六个系数须要自己敲代码使用控制点来进行反算,仅仅要三个控制点就可以,使用1个或两个控制点仅仅能计算一个平移模型,即上面公式中的A0和B0。完整的命令行为:
gdalwarp.exe -rpc -to "RPC_AFFINE=-32.714672501057066 0.999199897235577 0.000158731686899 28.720843336473692 0.000589585516339 1.000068008511035" D:\rpctest\banda.tif D:\rpctest\banda_affine.tif
改动GDAL库支持RPC像方改正模型的更多相关文章
- 修改GDAL库支持RPC像方改正模型
最近在做基于RPC的像方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC像方改正参数. 下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...
- 修改GDAL库支持IRSP6数据
使用GDAL库发现不能打开IRSP6的数据,不过看GDAL提供的文件格式里面却是支持IRSP6的数据的,具体可以参考网页http://www.gdal.org/frmt_fast.html.下面图1是 ...
- 使GDAL库支持中文路径或中文文件名的处理方法
之前生成的gdal 2.1.1动态库,在通过命令行执行时,遇到有中文路径或中文图像名时,GDALOpen函数不能正确的被调用,如下图: 解决方法: 1. 在所有使用GDALAllRegist ...
- 使用GDAL库中的RPC校正问题
最近将GDAL库更新至1.11版本之后,发现之前写的RPC像方改正模型校正的结果偏差特别大(更新版本之前结果和PCI处理的结果一致).所以初步判断是GDAL库的bug,经过各个参数修改发现原来是指定的 ...
- GDAL库——读取图像并提取基本信息
GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL ...
- 浅析GDAL库C#版本支持中文路径问题(续)
上篇博客中主要说了GDAL库C#版本中存在的问题,其表现形式主要是:"文件名中的汉字个数是偶数,完全没有影响,读取和创建都正常,如果文件名中的汉字个数是奇数,读取和创建都会报错." ...
- GDAL库扩展Landsat系列MTL文件格式支持
Landsat系列卫星提供的数据,一般都是每个波段一个tif文件,然后外加一个MTL.txt的元数据文件,使用gdal可以直接打开每个波段的tif文件,但是有时候想在打开tif数据的同时能够自动读取M ...
- 浅析GDAL库C#版本支持中文路径问题
GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...
- GDAL库中WFS服务中含有中文不能获取数据的问题
GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别.通过调试发现,其原因有下面两点: 1.输入的URL路径没有使用UTF8编码而从网 ...
随机推荐
- Java数组与栈内存、堆内存
package ch4; /** * Created by Jiqing on 2016/11/9. */ public class ArrayInRam { public static void m ...
- ThinkPHP5中find()和select()区别
ThinkPHP5中find()和select()区别 读取数据是指读取数据表中的一行数据(或者关联数据),主要通过find方法完成,例如: 1 2 3 4 $User = M("User& ...
- 网络通信-ping命令
- c# 结构 struct
结构是使用 struct 关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构. 一般情况下,我们很少使用结构,而且很多人也并不建议使用结构,但作为.NET Framework 一般型別 ...
- php实现自动加载类
PHP 实现自动加载类:
- Conservative GC (Part two :MostlyCopyingGC )
目录 MostlyCopyingGC 概要 堆结构 分配 new_obj()函数 add_pages()函数 GC执行过程 mostly_copying()函数 promote_page()函数 pa ...
- Python组织文件 实践:将文件的不同版本备份为ZIP文件
功能:备份文件夹.能将文件的不同版本备份下来,并且每个有不同的名字 #! python3 # backupToZip.py - 备份文件的不同版本到压缩文件中 import zipfile,os #f ...
- 现在有一个函数A和函数B,请你实现B继承A
现在有一个函数A和函数B,请你实现B继承A // 方式1 function B(){} function A(){} B.prototype = new A(); // 方式2 function A( ...
- 绿色版SecureCRT启动崩溃,遇到一个致命的错误且必须关闭
百度搜了半天,大家都是说删除注册表的VanDyke就能解决问题,但是我用的是绿色版的,删除VanDyke后还不行. 然后试了一下重新解压出一个绿色版的SecureCRT,发现能用. 但之前我配置了很多 ...
- 维护的JSP站点数据丢失
两个月前换了份工作,然后接手了三台server.上面乱七八糟的网站和应用大把. 当中有维护一个瀚石苑:http://www.hanshiyuan.com/.三天两头的丢失数据. 都不知道怎么找回,好在 ...