最近将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数据\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所示。

图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数据\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插值为双线性处理结果

接下来指定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插值为三次立方卷积处理结果

修改GDAL源码中的文件gdal_rpc.cpp两处地方,就是将GDT_Int32修改为GDT_Float64。原因很简单就是变量dfDMEH是一个double类型,读取数据的时候也需要按照double类型进行读取,而原来的代码是按照Int32类型读取,导致读取出来的DEM高程值有问题。修改后代码见图6,共有两处,坐标正变换和逆变换都需要修改。

图6 修改后的GDAL代码

修改后重新编译GDAL即可。使用修改后的程序,指定DEM插值为最邻近后处理的结果如图7。

图7 修改后正射的结果对比
已经将该问题反馈至GDAL开发组,具体地址为:http://trac.osgeo.org/gdal/ticket/5553。估计下个版本就会修正。

使用GDAL库中的RPC校正问题的更多相关文章

  1. GDAL库中WFS服务中含有中文不能获取数据的问题

    GDAL库中目前提供了对WFS服务发布的数据进行获取,目前发现对于中文的服务名称或者图层名为中文,GDAL不能正确识别.通过调试发现,其原因有下面两点: 1.输入的URL路径没有使用UTF8编码而从网 ...

  2. GDAL 2.0版本RPC校正速度测试

    GDAL2.0版本的更新日志中提到了对RPC校正的优化,今天测试了一下,发现提升的速度还是蛮快的,测试的数据是一个IRS-P5的数据. 单线程测试 首先使用一个线程进行测试,使用下面的批处理进行运行, ...

  3. gdal库中设置prj4库全路径的用法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 gdal库实现投影转换之类的功能实际上底层都是调用prj4库的功能.如果gdal使用非静态的方式集成prj4库,实际上 ...

  4. 修改GDAL库支持RPC像方改正模型

    最近在做基于RPC的像方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC像方改正参数. 下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...

  5. 改动GDAL库支持RPC像方改正模型

    近期在做基于RPC的像方改正模型.方便对数据进行測试,改动了GDAL库中的RPC纠正模型,使之能够支持RPC像方改正參数. 以下是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一 ...

  6. GDAL库进度信息编写示例

    GDAL进度信息编写 GDAL库中的算法以及读写数据的时候一般都会提供两个与进度信息相关的参数,下面分别进行描述: GDALProgressFunc pfnProgress void * pProgr ...

  7. GDAL库三个读取Jpeg2000格式驱动测试

    0.目的 GDAL库中提供了四五种读取Jpeg2000的驱动,但是各个驱动读取数据的效率各不相同,下面就针对三种读取jpeg2000的效率进行测试. GDAL库中提供的读取Jpeg2000的驱动有下面 ...

  8. 浅析GDAL库C#版本支持中文路径问题

    GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...

  9. GDAL库调试(包括跨语言调试)

    很多时候都需要调试GDAL库,尤其是像学习GDAL库中的某些算法是如何实现的时候,调试就必不可少了. 首先说明用C++的调试.以VS2008为例进行说明. 编译DEBUG版本的GDAL库,这个可以参考 ...

随机推荐

  1. URL、网址、域名

    URL (Uniform Resource Locator)统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL ...

  2. 关于惠普hp服务器开机时F10菜单变成F10 Function Disabled的解决方法

    今天笔者由于在Intelligent Provisioning智能配置里不小心将"启动Intelligent Provisioning"选项钩选成禁用了,如下 结果就造成,在之后服 ...

  3. ionic 禁用 手势 滑动返回

    $ionicConfigProvider.views.swipeBackEnabled(false); 在 应用的 config里面 配置下 上面的那句话 就OK了.

  4. python webdriver环境搭建

    一.准备安装包 1.下载python 2.下载setuptools 3.下载pip 二.windows环境安装 1.安装python,建议选择python2.7.5版本. 2.安装setuptools ...

  5. drool-6.5的自学demo

    先丢代码地址 https://gitee.com/a247292980/drools 再丢pom.xml <project xmlns="http://maven.apache.org ...

  6. 用python爬了自己的微信,原来好友都是这样的!

    偶然了解到Python里的itchat包,它已经完成了wechat的个人账号API接口,使爬取个人微信信息更加方便.鉴于自己很早之前就想知道诸如自己微信好友性别比例都来自哪个城市之类的问题,于是乎玩心 ...

  7. Docker的名字空间

    名字空间是 Linux 内核一个强大的特性.每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样.名字空间保证了容器之间彼此互不影响. pid 名字空间 不同用户的进程就是 ...

  8. linux系统性能监控--CPU利用率

    在对系统的方法化分析中,首要且最基本的工具之一常常是对系统的 CPU利用率进行简单测量. Linux以及大多数基于 UNIX的操作系统都提供了一条命令来显示系统的平均负荷(loadaverage) . ...

  9. iOS中的NSURLProtocol

    转自:iOS知识小集 NSURLProtocol类(注意,这个不是协议)经常用于实现一些URL Loading System相关的黑魔法.它可以拦截URL Loading System相关的网络请求, ...

  10. JDK 源码学习——ByteBuffer

    ByteBuffer 在NIO的作用 Java SE4 开始引入Java NIO,相比较于老的IO,更加依赖底层实现.引入通道(Channels),选择器(selector),缓冲(Buffers). ...