程序设计:gdal:从小组框架更新的gdal

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
程序设计:gdal:从小组框架更新的gdal [2022/09/27 18:47]
60.188.11.23 已恢复为旧版 (2022/09/25 16:51)
程序设计:gdal:从小组框架更新的gdal [2022/09/28 06:24] (当前版本)
101.67.49.191 已恢复为旧版 (2022/06/14 10:29)
行 1: 行 1:
 +====== 小组新框架 ======
 +<WRAP center round download 60%>
 +[[http://pan.baidu.com/share/link?shareid=1010315468&uk=856011220|新框架下载地址]]
 +</WRAP>
 +===== 框架说明: =====
 +
 +==== 文件夹 ====
 +  * vc6工程文件在vc60下
 +  * vs2010工程文件在vc100下
 +  * src 文件夹中包括源代码(.h,.cpp文件)
 +  * include 包括gdal和aramdillo头文件
 +  * lib 包括完整的gdal(所有格式、投影库、geos库,矢量格式)、openBlas0.2.8版的dll和lib
 +  * res 中含有资源文件
 +  * data 为测试数据目录
 +==== 框架使用 ====
 +
 +  - 打开工程
 +  - 参照Fix.h,Fix.cpp,建立和修改对话框中的各种内容
 +  - 参照MainFrm.cpp 中OnAddImage函数中读取、处理,写入影像
 +  - 处理函数最好单独用一个类来写,demo中实例比较简单,只是两个影像相加,所以没有写。
 +  - 需要速度的时候,请使用Release编译,编译完成后,lib中的dll文件将会自动拷贝到执行文件的文件夹中,不需要像更新那样手动拷贝
 +==== 矩阵库 ====
 +<wrap hi>简单的double矩阵乘法、求逆、转置、行列式、线性最小二乘,可以直接调用CMatrix类中的函数(头文件 Matrix.h)</wrap>\\
 +vs2010可以使用Armadillo矩阵库(使用模板实现,可以多种数据类型),只需要包括头文件:
 + #include "armadillo/armadillo"
 +具体使用请自己看Armadillo矩阵库文档
 + \include\armadillo\doc.html
 +==== 影像预处理 ====
 +CPreprocessing类中包括对影像简单的预处理,包括: 
 +  - 重投影函数
 +  - 重采样函数
 +  - 裁剪函数
 +  - 将hdf、netcdf一类有子数据集的数据转换成单个tif文件的函数
 ====== 从原有框架变到新的gdal,有以下步骤: ====== ====== 从原有框架变到新的gdal,有以下步骤: ======
  
-  - StdAfx.h文件中,注释掉  #include "GeoImagerLib.h" +    - StdAfx.h文件中,注释掉  #include "GeoImagerLib.h" 
-  - 在使用原有框架读取数据的cpp文件中, 注释掉  #include "RasterLib.h" +    - 在使用原有框架读取数据的cpp文件中, 注释掉  #include "RasterLib.h" 
-  - 下载文件[[http://pan.baidu.com/share/link?shareid=443159&uk=856011220|gdal.zip]],解压 +    - 下载文件[[http://pan.baidu.com/s/13R6i5#dir/path=%252FGDAL|gdalogr.zip]],解压 
-  - 拷贝解压出来的lib和include文件夹到工程中 +    - 拷贝解压出来的lib和include文件夹到工程中 
-  - 工程,设置中(win32 Debug和win32 Release需要分别设置) +    - 工程,设置中(win32 Debug和win32 Release需要分别设置) 
-    * 在C/C++选项卡中,选择Category为Preprocessor,在Additional include directories中添加  include +      * 在C/C++选项卡中,选择Category为Preprocessor,在Additional include directories中添加  include 
-    * 在link选项卡中,选择Category为General,在Object/library modules:中,添加 "gdal_i.lib" +      * 在link选项卡中,选择Category为General,在Object/library modules:中,添加 "gdal_i.lib" 
-    * 在link选项卡中,选择Category为Input,在Additional library path:中,添加 "lib" +      * 在link选项卡中,选择Category为Input,在Additional library path:中,添加 "lib" 
-  - 将lib文件夹中的gdal110.dll等dll文件拷贝到Debug、Release文件夹下 +    - 将lib文件夹中的gdal110.dll等dll文件拷贝到Debug、Release文件夹下 
-  - 在读取写入的地方,添加头文件 <wrap tip>#include "gdal_priv.h"</wrap> +    - 在读取写入的地方,添加头文件 <wrap tip>#include "gdal_priv.h"</wrap> 
-  - 可删除的文件: +    - 可删除的文件: 
-  <code> + 
-gdal12.dll +<code> gdal12.dll GeoImagerLib.h GLib.h GlobeLib.dll hd420md.dll hm420md.dll MRF.h RasterLib.h RSGeoReferLibd.dll RSGlobalLibd.dll RSGlobalLibd.lib RSImageDlld.dll RSImageDlld.lib 
-GeoImagerLib.h + 
-GLib.h +<code> 
-GlobeLib.dll +</code> 
-hd420md.dll +</code>
-hm420md.dll +
-MRF.h +
-RasterLib.h +
-RSGeoReferLibd.dll +
-RSGlobalLibd.dll +
-RSGlobalLibd.lib +
-RSImageDlld.dll +
-RSImageDlld.lib +
-  </code>+
  
 ====== 读取写入文件说明 ====== ====== 读取写入文件说明 ======
行 54: 行 78:
  poBand = ds1->GetRasterBand(j+1);  poBand = ds1->GetRasterBand(j+1);
  //将数据写入Inputimg1[j],RasterIOd中,参数具体含义见下文:  //将数据写入Inputimg1[j],RasterIOd中,参数具体含义见下文:
- poBand->RasterIO(GF_Read,0, 0, WidthAllHeightAll,Inputimg1[j],WidthAll,HeightAll,GDT_Float64,0,0);+ poBand->RasterIO(GF_Read,0, 0, WidthHeight,Inputimg1[j],Width,Height,GDT_Float64,0,0);
 } }
 //用完之后,关闭dataset即可,不需要释放GDALRasterBand //用完之后,关闭dataset即可,不需要释放GDALRasterBand
行 94: 行 118:
  int     nLineSpace      int     nLineSpace    
  
 +</code>
 +===== 分块读取、处理数据 =====
 +分块读取,处理数据,也使用RasterIO函数。GdalDataset 和 GdalRasterBand都支持RasterIO函数分块读取和写入数据
 +
 +<code c++>
 +GDALAllRegister();//注册类型,打开影像必须加入此句
 +GDALDataset *ds1; 
 +ds1 = (GDALDataset *) GDALOpen(input1,GA_ReadOnly);//input1为文件名
 +if(ds1 == NULL) //读取失败
 +{
 + AfxMessageBox("cant open the unReferard image!");
 + return ;
 +}
 +
 +WidthAll = ds1->GetRasterXSize(); //影像宽度
 +HeightAll = ds1->GetRasterYSize();//影像高度
 +BandNum = ds1->GetRasterCount();//影像波段数
 +//读取波段数据
 +GDALRasterBand *poBand;//不需要释放,只需要最后是否GDALDataset
 +double **Inputimg1 = new double*[BandNum];
 +
 +int blockx = 512;//分块大小
 +int blocky = 512;
 +//分块处理.将影像分成很多blockx*blocky大小的块,通过循环对每一块进行处理
 +int nxNum = WidthAll/blockx+1;//计算列方向上块数
 +int nyNum = HeightAll/blocky+1;//计算行方向块数
 +
 +int i,j,k;
 +int Width,Height;//块的实际宽和高
 +for (i = 0; i < nxNum; ++i) // 
 +{
 + for ( j = 0; j < nyNum; ++j) 
 + {
 + //确定实际块大小
 + Width = (WidthAll - (i+1)*blockx) > 0? blockx : (WidthAll - i * blockx);
 + Height = (HeightAll - (j+1)*blocky) > 0? blocky : (HeightAll - j * blocky);
 + //分块读取数据
 + for ( k = 0; k < BandNum; ++k) 
 + {
 + Inputimg1[j] = new double[Width*Height];
 + //注意,获取波段数从1开始计数!!
 + poBand = ds1->GetRasterBand(k+1);
 + //将数据写入Inputimg1[j],RasterIOd中,参数具体含义见RasterIO:
 + poBand->RasterIO(GF_Read,0, 0, Width, Height,Inputimg1[j],Width,Height,GDT_Float64,0,0);
 + }
 +/**
 +处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理
 +
 +处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理处理
 +*/
 + }
 +}
 +
 +//用完之后,关闭dataset即可,不需要释放GDALRasterBand
 +GDALClose(ds1);
 </code> </code>
 ===== 写入文件 ===== ===== 写入文件 =====
行 127: 行 206:
  //GDT_Byte和byte **OutputImg 要对应!  //GDT_Byte和byte **OutputImg 要对应!
  poBandOut->RasterIO(GF_Write,0, 0, WidthAll, HeightAll,OutputImg[j],WidthAll,HeightAll,GDT_Byte,0,0);  poBandOut->RasterIO(GF_Write,0, 0, WidthAll, HeightAll,OutputImg[j],WidthAll,HeightAll,GDT_Byte,0,0);
 +
 + //注意,需要加上这一句,将缓存数据才会真的写入到文件中
 +                //或者最后GDALClose(OutDs)才会写入数据,否则会是空数据
  poBandOut->FlushCache();  poBandOut->FlushCache();
  }  }
行 135: 行 217:
  </code>  </code>
 创建文件函数Create和CreateCopy说明 创建文件函数Create和CreateCopy说明
 +<WRAP center round tip 60%>
 +Create将创建不带坐标的新影像
 +
 +CreateCopy将创建和设置copy影像相同大小、相同坐标系的影像
 +</WRAP>
 +
 <code c++> <code c++>
 ///从已有的dataset中创建 ///从已有的dataset中创建
  • 程序设计/gdal/从小组框架更新的gdal.txt
  • 最后更改: 2022/09/28 06:24
  • 101.67.49.191