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标记的测试脚本。