很快就会GDAL库更新1.11版本号之后,在发现之前写RPC像方误差修正模型校准结果特别大(在更新结果之前的版本号和PCI结果一致)。所以初步推断是GDAL库的bug,经过各个參数改动发现原来是指定的DEM採样方式导致的。
当指定DEM的採样方式为最邻近时,校正结果偏差非常大,当DEM採样方式为双线性採样和三次立方卷积採样时,处理的结果与之前的结果一样。截图如图1所看到的。红色区域为对照区域,如图2所看到的。
图1 PCI校正结果全图
图2 图1中的红色区域按实际像素放大显示结果
以下是使用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数据eijing_all2.img" -to "RPC_DEMINTERPOLATION=near" D:Data711_214_26sep2006_p5SrcDataandf.tif D:andf_rpc1.tif --config GDAL_FILENAME_IS_UTF8 NO处理的结果与PCI结果对照方图3所看到的。
图3 GDAL指定DEM插值为最邻近处理结果
接下来指定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数据eijing_all2.img" -to "RPC_DEMINTERPOLATION=bilinear" D:Data711_214_26sep2006_p5SrcDataandf.tif D:andf_rpc2.tif --config GDAL_FILENAME_IS_UTF8 NO处理的结果与PCI结果对照方图4所看到的。
图4 GDAL指定DEM插值为双线性处理结果
接下来指定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数据eijing_all2.img" -to "RPC_DEMINTERPOLATION=cubic" D:Data711_214_26sep2006_p5SrcDataandf.tif D:andf_rpc3.tif --config GDAL_FILENAME_IS_UTF8 NO处理的结果与PCI结果对照方图5所看到的。
图5 GDAL指定DEM插值为三次立方卷积处理结果
改动GDAL源代码中的文件gdal_rpc.cpp两处地方,就是将GDT_Int32改动为GDT_Float64。原因非常easy就是变量dfDMEH是一个double类型。读取数据的时候也须要依照double类型进行读取,而原来的代码是依照Int32类型读取,导致读取出来的DEM高程值有问题。
改动后代码见图6,共同拥有两处。坐标正变换和逆变换都须要改动。
图6 改动后的GDAL代码
改动后又一次编译GDAL就可以。使用改动后的程序,指定DEM插值为最邻近后处理的结果如图7。
图7 改动后正射的结果对照
已经将该问题反馈至GDAL开发组。详细地址为:http://trac.osgeo.org/gdal/ticket/5553。据预计,在未来的版本号会被纠正。
版权声明:本文博客原创文章。博客,未经同意,不得转载。