很快就会GDAL库更新1.11版本号以后,在发现以前写RPC像方偏差修正模型校准结果特别大(在更新结果以前的版本号和PCI结果一致)。因此初步推断是GDAL库的bug,通过各个參数改动发现原来是指定的DEM採样方式致使的。工具
当指定DEM的採样方式为最邻近时,校订结果误差很是大,当DEM採样方式为双线性採样和三次立方卷积採样时,处理的结果与以前的结果同样。截图如图1所看到的。红色区域为对照区域,如图2所看到的。spa
图1 PCI校订结果全图命令行
图2 图1中的红色区域按实际像素放大显示结果code
如下是使用gdalwarp工具外加仿射修正模型进行校订的结果。首先使用DEM为最邻近採样,gdalwarp命令行例如如下:开发
gdalwarp -of GTiff -tr 2.5 2.5 -t_srs ESRI::"D:\WGS_1984_UTM_Zone_50N.prj" -rpc -r cubic -wm 1024 -to "RPC_AFFINE=-32.67376693 0.99919599 0.00013941 28.71988840 0.00062236 1.00004356" -to "RPC_DEM=D:\Data\正射纠正基础数据\DEM数据\beijing_all2.img" -to "RPC_DEMINTERPOLATION=near" D:\Data\711_214_26sep2006_p5\SrcData\bandf.tif D:\bandf_rpc1.tif --config GDAL_FILENAME_IS_UTF8 NO处理的结果与PCI结果对照方图3所看到的。
接下来指定DEM重採样方式为双线性。代码和处理结果例如如下:rpc
gdalwarp -of GTiff -tr 2.5 2.5 -t_srs ESRI::"D:\WGS_1984_UTM_Zone_50N.prj" -rpc -r cubic -wm 1024 -to "RPC_AFFINE=-32.67376693 0.99919599 0.00013941 28.71988840 0.00062236 1.00004356" -to "RPC_DEM=D:\Data\正射纠正基础数据\DEM数据\beijing_all2.img" -to "RPC_DEMINTERPOLATION=bilinear" D:\Data\711_214_26sep2006_p5\SrcData\bandf.tif D:\bandf_rpc2.tif --config GDAL_FILENAME_IS_UTF8 NO处理的结果与PCI结果对照方图4所看到的。
图4 GDAL指定DEM插值为双线性处理结果get
接下来指定DEM重採样方式为三次立方卷积,代码和处理结果例如如下:
博客
gdalwarp -of GTiff -tr 2.5 2.5 -t_srs ESRI::"D:\WGS_1984_UTM_Zone_50N.prj" -rpc -r cubic -wm 1024 -to "RPC_AFFINE=-32.67376693 0.99919599 0.00013941 28.71988840 0.00062236 1.00004356" -to "RPC_DEM=D:\Data\正射纠正基础数据\DEM数据\beijing_all2.img" -to "RPC_DEMINTERPOLATION=cubic" D:\Data\711_214_26sep2006_p5\SrcData\bandf.tif D:\bandf_rpc3.tif --config GDAL_FILENAME_IS_UTF8 NO处理的结果与PCI结果对照方图5所看到的。
图5 GDAL指定DEM插值为三次立方卷积处理结果it
改动GDAL源代码中的文件gdal_rpc.cpp两处地方,就是将GDT_Int32改动为GDT_Float64。缘由很是easy就是变量dfDMEH是一个double类型。读取数据的时候也需要依照double类型进行读取,而原来的代码是依照Int32类型读取,致使读取出来的DEM高程值有问题。编译
改动后代码见图6,共同拥有两处。坐标正变换和逆变换都需要改动。
图6 改动后的GDAL代码
改动后又一次编译GDAL就能够。使用改动后的程序,指定DEM插值为最邻近后处理的结果如图7。