使用GDAL库中的RPC校正问题

最近将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校正问题

时间: 2024-10-08 23:24:57

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

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

近期在做基于RPC的像方改正模型.方便对数据进行測试,改动了GDAL库中的RPC纠正模型,使之能够支持RPC像方改正參数. 以下是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一化后的经度纬度高程. 将上面的公式变形,使用偏移系数和缩放系数带入,能够得到图像的行列号坐标与经纬度坐标之间的坐标转换关系.整理后的公式例如以下所看到的.下标带s的为缩放系数,下标为0的表示偏移系数,rc为图像行列号,此处的PLH为地面经纬度坐标.P1-P4为有理函数的多项式系数. 使用像方改正模型

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

最近在做基于RPC的像方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC像方改正参数. 下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一化后的经度纬度高程. 将上面的公式变形,使用偏移系数和缩放系数带入,可以得到图像的行列号坐标与经纬度坐标之间的坐标转换关系.整理后的公式如下所示,下标带s的为缩放系数,下标为0的表示偏移系数,rc为图像行列号,此处的PLH为地面经纬度坐标,P1-P4为有理函数的多项式系数. 使用像方改正模型的公式如

Linux下非root权限安装与使用GDAL库的方法

学习GDAL的话推荐两个网站. GDAL的官方文档:www.gdal.org 李民录老师的博客:http://blog.csdn.net/liminlu0314/article/category/777646 下面进入正题. 笔者的系统为RHEL4. 建议Linux的使用者习惯非root权限的操作,这是一个好习惯,在工作中会很有帮助. 首先安装GDAL依赖库PROJ.4和GEOS. PROJ.4是提供投影坐标系相关操作的库,GEOS是提供空间分析计算相关的库.都是开源的项目,可以自行Google

Gdal库计算形心方法。

在Gdal库中计算形心的方法如下: int OGRGeometry::Centroid( OGRPoint *poPoint ) const 其函数实现中,是调用的Geos库中的GEOSGetCentroid()方法,最终在Geos的bool Geometry::getCentroid(Coordinate& ret) const函数中创建了CentroidArea对象,并将几何对象添加进去,获取到其形心.代码如下: CentroidArea cent; cent.add(this); if (

使用GDAL图书馆RPC校正问题

很快就会GDAL库更新1.11版本号之后,在发现之前写RPC像方误差修正模型校准结果特别大(在更新结果之前的版本号和PCI结果一致).所以初步推断是GDAL库的bug,经过各个參数改动发现原来是指定的DEM採样方式导致的. 当指定DEM的採样方式为最邻近时,校正结果偏差非常大,当DEM採样方式为双线性採样和三次立方卷积採样时,处理的结果与之前的结果一样.截图如图1所看到的.红色区域为对照区域,如图2所看到的. 图1 PCI校正结果全图 图2  图1中的红色区域按实际像素放大显示结果 以下是使用g

GDAL库——读取图像并提取基本信息

GDAL库是一个跨平台的栅格地理数据格式库,包括读取.写入.转换.处理各种栅格数据格式(有些特定的格式对一些操作如写入等不支持).它使用了一个单一的抽象数据模型就支持了大多数的栅格数据.这里有GDAL库支持的格式:http://www.gdal.org/formats_list.html 注:本文在Qt开发环境下使用GDAL库. 在Qt中使用GDAL库时,除了要加gdal_priv.h头文件外,还需要在xxx.pro文件内加上LIBS += -lgdal ,文件用可编辑的文档打开. 使用GDAL

GDAL库学习笔记(1):无缝拼接Google卫星图

开工之前要先了解一下瓦片地图,瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变.实现原理就是,首先确定地图服务平台所要提供的缩放级别的数量N,把缩放级别最低.地图比例尺最大的地图图片作为金字塔的底层,即第0层,并对其进行分块,从地图图片的左上角开始,从左至右.从上到下进行切割,分割成相同大小(比如256x256像素)的正方形地图瓦片,形成第0层瓦片矩阵;在第O层地图图片的基础上,按每2x2像素合成为一个像素的方法生成第1层地图图片,并对其进

golang中的rpc包用法

RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我所在公司的项目是采用基于Restful的微服务架构,随着微服务之间的沟通越来越频繁,就希望可以做成用rpc来做内部的通讯,对外依然用Restful.于是就想到了golang标准库的rpc包和google的grpc. 这篇文章重点了解一下golang的rpc包. 介绍 golang的rpc支持三个级别的RPC:TCP.HTTP.JSONRPC.但Go的RPC包

基于GDAL库,读取.grd文件(以海洋地形数据为例)C++版

技术背景 海洋地形数据主要是通过美国全球地形起伏数据(GMT)获得,数据格式为grd(GSBG)二进制数据,打开软件通过是Surfer软件,surfer软件可进行数据的编辑处理,以及进一步的可视化表达等功能操作:由于Surfer软件不支持二次开发,没有提供相应的SDK供开发者进行使用,所以这一切只能通过相应类似的技术进行实现,首先,数据的读取,如何通过编程实现数据的读取操作呢?这里就要说一下GIS软件所使用的一个开源库-GDAL,GDAL库的具体解释资料,请查阅官方网站[https://www.