RFC 22:RPC地理参考
作者:弗兰克·温特丹
联系方式:warmerdam@pobox.com
状态:通过、实施
总结
提出了一种基于元数据表示的有理多项式系数(RPCs)的图像定位机制。
许多现代原始卫星产品都与rpc一起分发,包括GeoEye和DigitalGlobe的产品。RPCs提供了对图像上的地理参照的更高的系统描述,并且还包含了在理论上使正交校正(给定DEM)和一些3D操作(如建筑物高度计算)成为可能的观察几何的信息。
RPC域元数据
带有RPC的数据集将在“RPC”域中包含以下数据集级元数据项,以标识有理多项式。
错误偏差:错误-偏差。以米为单位的图像中所有点的水平轴的均方根偏差误差(未知时为-1.0)
错误:错误-随机。图像中每个点每水平轴的均方根随机误差(米)(如果未知,则为-1.0)
LINE_OFF:线偏移
SAMP_OFF:采样偏移
纬度偏移
LONG_OFF:大地经度偏移
高度偏移:大地高度偏移
线比例尺:线比例尺
采样比例:采样比例
纬度比例尺:大地纬度比例尺
LONG_比例尺:大地经度比例尺
高度比例尺:大地高度比例尺
线数系数(1-20):线分子系数。rn方程分子中多项式的20个系数。(空格分隔)
LINE_DEN_COEFF(1-20):线分母系数。rn方程分母中多项式的20个系数。(空格分隔)
SAMP_NUM_COEFF(1-20):样本分子系数。cn方程分子中多项式的20个系数。(空格分隔)
SAMP_DEN_COEFF(1-20):样本分母系数。cn方程分母中多项式的20个系数。(空格分隔)
这些字段直接从文档“潜在GeoTIFF RPC文档”派生,位于:
http://geotiff.maptools.org/rpc_prop.html
用line OFF和SAMP OFF表示的线和像素偏移相对于像素的中心(#5993)
更新NITF驱动程序
此模型中已支持RPC,但将被修改为将它们放入RPC域而不是主元数据域。
添加对读取Digital Globe.RPB文件的支持。
暂时不支持编写rpc。
更新GeoTIFF驱动程序
升级以支持读取Digital Globe.RPB文件。
可能支持读取空间成像(GeoEye?)rpc.txt文件。
支持读取RPC TIFF标记(根据 http://geotiff.maptools.org/rpc_prop.html )
支持编写RPC TIFF标记。
支持写入.RPB文件(如果RPB=YES或PROFILE不是GDALGeoTIFF)。
对GenImgProj变压器的更改
目前,很难使用GDALGenImgProjTransformer()可靠地创建基于rpc的warp transformer,因为它将优先于rpc使用geotransform(如果可用)。许多包含有用RPC信息的图像还包括geotransform(近似或精确)。因此,建议修改GDALCreateGenImgProjTransformer()函数,以便在创建转换器时提供更多指导。拟议的新职能是:
void *
GDALCreateGenImgProjTransformer2( GDALDatasetH hSrcDS, GDALDatasetH hDstDS,
char **papszOptions );
支持的选项:
SRC_SRS:WKT SRS用作hsrcd的覆盖。
DST_SRS:WKT SRS用作hdstd的覆盖。
GCPS_OK:如果为false,则不使用GCPS,默认为TRUE。
MAX_GCP_ORDER:尽可能用于GCP派生多项式的最大顺序。默认值是根据gcp的数量自动选择。值为-1将触发使用薄板样条曲线而不是多项式。
方法:可以具有GEOTRANSFORM、GCP_多项式、GCP_TPS、GEOLOC_数组、RPC中的一个值,以强制在源数据集上仅考虑一种地理定位方法。
RPC_HEIGHT:用于RPC计算的固定高度。
这取代了以前的函数,该函数不支持传递任意选项,因此不易扩展。旧函数将通过调用新函数重新实现。
最重要的补充是方法选项,可以设置为专门使用图像到地理参考坐标系方法之一,而不是让代码来选择它认为最好的方法。
对gdalwarp和gdaltransform的更改
为了便于将transformer选项传递到更新后的GDALCreateGenImgProjTransformer2(),将更新gdalwarp和gdaltransform程序(基于此函数构建)以包含-to(transformer选项)开关并使用新函数。
通过翻译保持地理位置
RPC信息需要通过不改变数据空间排列的翻译来复制和保存。为此,RPC元数据复制将添加到:
VRT驱动程序的CreateCopy()。
GDALDriver的默认CreateCopy()。
GDALPamDataset::CopyInfo()
当且仅当没有进行大小调整或子设置时,将更新gdalúu translate以将RPC元数据复制到中间内部VRT。
对RPC转换器的更改
实现从像素/直线到纬度/长/高的迭代“反变换”,而不是简单的线性近似器。
添加对RPC_HEIGHT offset的支持,因此所有到transformer的Z值都假定是相对于此偏移的(通常是真实的和场景的平均高程)。
使RPC转换器可序列化(在VRT文件等中)。
向后兼容性问题
以前,NITF驱动程序在默认域中返回RPC元数据。在GDAL 1.6.0的RFC实现中,使用此元数据的任何应用程序都需要咨询RPC域。这个 RPC_ 元数据值的前缀也已删除。
GDALCreateGenImgProjTransformer()函数被保留,因此添加新的通用工厂不会导致兼容性问题。
SWIG绑定问题
原始访问是由已建立的元数据api进行的,因此不需要对此进行任何更改。
Warp API只绑定在一个高级别,因此在这方面不应该有任何更改。
出于测试目的,需要在GDAL transformer API周围提供绑定。以下计划的绑定松散地基于OGRCoordinateTransformation API绑定。到目前为止,我只发现TransformPoint(bDstToSrc,x,y,z)入口点在Python中很有用,甚至返回了一个(bSuccess,(x,y,z))结果,这有点尴尬。有更好的办法吗?
/************************************************************************/
/* Transformer */
/************************************************************************/
%rename (Transformer) GDALTransformerInfoShadow;
class GDALTransformerInfoShadow {
private:
GDALTransformerInfoShadow();
public:
%extend {
GDALTransformerInfoShadow( GDALDatasetShadow *src, GDALDatasetShadow *dst,
char **options ) {
GDALTransformerInfoShadow *obj = (GDALTransformerInfoShadow*)
GDALCreateGenImgProjTransformer2( (GDALDatasetH)src, (GDALDatasetH)dst,
options );
return obj;
}
~GDALTransformerInfoShadow() {
GDALDestroyTransformer( self );
}
// Need to apply argin typemap second so the numinputs=1 version gets applied
// instead of the numinputs=0 version from argout.
%apply (double argout[ANY]) {(double inout[3])};
%apply (double argin[ANY]) {(double inout[3])};
int TransformPoint( int bDstToSrc, double inout[3] ) {
int nRet, nSuccess = TRUE;
nRet = GDALUseTransformer( self, bDstToSrc,
1, &inout[0], &inout[1], &inout[2],
&nSuccess );
return nRet && nSuccess;
}
%clear (double inout[3]);
int TransformPoint( double argout[3], int bDstToSrc,
double x, double y, double z = 0.0 ) {
int nRet, nSuccess = TRUE;
argout[0] = x;
argout[1] = y;
argout[2] = z;
nRet = GDALUseTransformer( self, bDstToSrc,
1, &argout[0], &argout[1], &argout[2],
&nSuccess );
return nRet && nSuccess;
}
#ifdef SWIGCSHARP
%apply (double *inout) {(double*)};
%apply (double *inout) {(int*)};
#endif
int TransformPoints( int bDstToSrc,
int nCount, double *x, double *y, double *z,
int *panSuccess ) {
int nRet;
nRet = GDALUseTransformer( self, bDstToSrc, nCount, x, y, z, panSuccess );
return nRet;
}
#ifdef SWIGCSHARP
%clear (double*);
%clear (int*);
#endif
} /*extend */
};
文档
除了标准的API文档外,RPC元数据机制还将引入到“GDAL数据模型”文档中。
实施
这项工作将由弗兰克·温特丹在加拿大核安全委员会的支持下执行。
测试
将实现包含RPC、GCP_TPS、GCP_多项式、GEOLOC和GEOTRANSFORM方法的transformer API的测试脚本。
将编写用于读写RPB和GeoTIFF RPC标记的测试脚本。