《GDAL源码剖析与开发指南》一一1.9 简单的调用
本节书摘来自异步社区出版社《GDAL源码剖析与开发指南》一书中的第1章,第1.9节,作者:李民录 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.9 简单的调用
GDAL源码剖析与开发指南
关于GDAL的使用,关键是要熟悉GDAL的组织结构、类以及类的函数等。最常用的就是动态库的GDAL,当然我们也可以使用静态库,这里只是简单地介绍使用动态GDAL库来做开发。
下面我们简单地使用C++、C#、Python和Java 4种语言分别进行示例,来说明如何使用GDAL进行开发。
1.9.1 C ++使用GDAL
首先我们打开Visual Studio2008,新建一个Win32的控制台工程(名字叫GDALCppTest),然后在工程的属性对话框中,找到“配置属性”→“C/C++”→“常规”,在右侧的“附加包含目录”中将GDAL的include文件夹路径填写到输入框,如图1-14所示。
我们继续在属性对话框中找到“配置属性”→“链接器”→“常规”,在右侧的“附加库目录”中将GDAL的lib文件夹路径填写完整,如图1-15所示。
最后在“配置属性”→“链接器”→“输入”,在右侧的“附加依赖项”中将gdal_i.lib填写完整。然后点击“确定”按钮即可。至此,使用GDAL的环境全部搭建完成,剩下的就是在代码中使用GDAL了。
我们将以下代码复制到刚才新建工程中的cpp文件中,保存后编译。正常情况下系统会提示生成成功,然后我们将GDAL编译出来的gdal110.dll及其依赖的dll文件复制到编译出来的exe所在目录,最后运行,会在控制台上输出图像的一些信息。
#include "gdal\_priv.h"
int main()
{//注册文件格式GDALAllRegister();const char* pszFile = "C:\\Test.img";//使用只读方式打开图像GDALDataset *poDataset = (GDALDataset*) GDALOpen( pszFile, GA\_ReadOnly );if( poDataset == NULL ){printf( "File: %s不能打开!\n",pszFile);return 0;}//输出图像的格式信息printf( "Driver:%s/%s\n",poDataset->GetDriver()->GetDescription(),poDataset->GetDriver()->GetMetadataItem( GDAL\_DMD\_LONGNAME) );//输出图像的大小和波段个数printf( "Size is%dx%dx%d\n",poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),poDataset->GetRasterCount());//输出图像的投影信息if( poDataset->GetProjectionRef() != NULL )printf( "Projectionis `%s'\n", poDataset->GetProjectionRef() );//输出图像的坐标和分辨率信息double adfGeoTransform[6];if( poDataset->GetGeoTransform( adfGeoTransform) == CE\_None ){printf( "Origin =(%.6f,%.6f)\n",adfGeoTransform[0], adfGeoTransform[3]);printf( "PixelSize = (%.6f,%.6f)\n",adfGeoTransform[1], adfGeoTransform[5]);}//读取第一个波段GDALRasterBand *poBand = poDataset->GetRasterBand( 1 );//获取该波段的最大值最小值,如果获取失败,则进行统计int bGotMin, bGotMax;double adfMinMax[2];adfMinMax[0] = poBand->GetMinimum( &bGotMin);adfMinMax[1] = poBand->GetMaximum( &bGotMax);if( ! (bGotMin&& bGotMax) )GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);printf( "Min=%.3fd,Max=%.3f\n", adfMinMax[0], adfMinMax[1] );int nXSize = poBand->GetXSize();float *pafScanline = new float[nXSize];//读取图像的第一行数据poBand->RasterIO(GF\_Read, 0, 0, nXSize,1, pafScanline, nXSize,1, GDT\_Float32, 0, 0 );delete []pafScanline;//关闭文件GDALClose((GDALDatasetH)poDataset);
}
执行的结果如图1-16所示。
1.9.2 C#使用GDAL
我们首先打开Visual Studio 2008,新建一个Visual C#的控制台应用程序(名字叫GDALCSTest),然后在工程的“引用”点击右键,打开“添加引用”对话框,找到浏览标签页,将GDAL以_cshrp.dll结尾的四个dll添加到工程中,如图1-17所示。
接下来我们将下面的代码复制到刚才新建工程中的Program.cs文件中,保存后编译。正常情况下系统会提示生成成功,然后我们将GDAL编译出来的gdal110.dll及其依赖的dll文件复制到编译出来的exe所在目录,最后运行,会在控制台上输出图像的一些信息。
需要值得注意的是,在64位的系统下,如果GDAL编译的时候是32位的,那么选择编译C#工程的时候,我们要使用X86编译才能正常运行,否则会报错。
using System;
using OSGeo.GDAL;
using OSGeo.OSR;
namespace GDALCSTest
{class Program{static void Main(string[] args){Console.WriteLine("");try{//注册文件格式Gdal.AllRegister();string strFile = "F:\\Work\\GDAL源码剖析\\GDALTest\\Test.tif";//使用只读方式打开图像Dataset ds = Gdal.Open(strFile, Access.GA\_ReadOnly);if (ds == null){Console.WriteLine("不能打开:" + strFile);System.Environment.Exit(-1);}Driver drv = ds.GetDriver();if (drv == null){Console.WriteLine("Can't get driver.");System.Environment.Exit(-1);}//输出图像的格式信息Console.WriteLine("Dirver :" + drv.GetDescription());Console.WriteLine("Using driver " + drv.LongName);//输出图像的大小和波段个数Console.WriteLine(" RasterCount: " + ds.RasterCount);Console.WriteLine(" RasterSize (" + ds.RasterXSize + "," + ds.RasterYSize + ")");//输出图像的投影信息Console.WriteLine(" Projection: " + ds.GetProjectionRef());//输出图像的坐标和分辨率信息double[] adfGeoTransform = new double[6];ds.GetGeoTransform(adfGeoTransform);Console.WriteLine("Origin =(" + adfGeoTransform[0] + "," + adfGeoTransform[3] + ")");Console.WriteLine("PixelSize = (" + adfGeoTransform[1] + "," + adfGeoTransform[5] + ")");Console.WriteLine("");//读取第一个波段Band band = ds.GetRasterBand(1);double val;int hasval;band.GetMinimum(out val, out hasval);if (hasval != 0)Console.WriteLine(" Minimum: " + val.ToString());band.GetMaximum(out val, out hasval);if (hasval != 0)Console.WriteLine(" Maximum: " + val.ToString());int nXSize = ds.RasterXSize;float[] pafScanLine;pafScanLine = new float[nXSize];band.ReadRaster(0,0, nXSize, 1, pafScanLine, nXSize, 1, 0, 0);}catch (Exception e){Console.WriteLine("Application error: " + e.Message);}}}
}
1.9.3 Python使用GDAL
在使用Python版本GDAL之前,我们首先要确保GDAL的Python版本安装成功,否则无法按照下面的步骤进行安装。
按照1.7.3小节的python编译步骤进行编译,之后我们将GDAL所有的dll文件复制到python版本的GDAL安装目录中,如图1-18所示。
接下来我们使用记事本等工具,将以下代码复制进去,保存为GDALPythonTest.py。
from osgeo import gdal
from osgeo.gdalconst import *
gdal.AllRegister()
#使用只读方式打开图像
ds = gdal.Open("F:\Work\GDAL源码剖析\GDALTest\Test.tif",GA\_ReadOnly)
#输出图像的格式信息
print ds.GetDriver().ShortName
#输出图像的大小和波段个数
print ds.RasterXSize
print ds.RasterYSize
print ds.RasterCount
#输出图像的投影信息
print ds.GetProjectionRef()
#输出图像的坐标和分辨率信息
adfGeoTransform = ds.GetGeoTransform()
print adfGeoTransform[0]
print adfGeoTransform[3]
print adfGeoTransform[1]
print adfGeoTransform[5]
band = ds.GetRasterBand(1)
#读取图像的第一行数据
data = band.ReadRaster( 0, 0, ds.RasterXSize, 1,
ds.RasterXSize, 1, band.DataType )
我们在开始菜单中的Python目录中打开“IDLE(Python GUI)”,在弹出的程序中,使用文件菜单中的打开命令打开刚才保存的GDALPythonTest.py文件,如图1-19所示,然后按“F5”运行,即可输出影像的一些信息,如图1-20所示。
**
1.9.4 Java使用GDAL**
Java使用GDAL,这里使用的IDE是Eclipse。我们使用Eclipse新建一个工程,名字叫GDALJavaTest,然后在这个工程中新建一个名为GDALTestApp的类,打开GDALTestApp.java,将里面的代码修改为以下代码内容,然后保存,如图1-21所示。
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
public class GDALTestApp {/*** @param args*/public static void main(String[] args) {gdal.AllRegister();String fileName\_tif = "F:\\Work\\GDAL源码剖析\\GDALTest\\Test.tif"; //使用只读方式打开图像Dataset hDataset = gdal.Open(fileName\_tif, gdalconstConstants. GA\_ReadOnly);if (hDataset == null){System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());System.err.println(gdal.GetLastErrorMsg());System.exit(1);}//输出图像的格式信息Driver hDriver = hDataset.GetDriver();System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());//输出图像的大小和波段个数int iXSize = hDataset.getRasterXSize();int iYSize = hDataset.getRasterYSize();int iBandCount = hDataset.getRasterCount();System.out.println("Size is " + iXSize + ", " + iYSize + "," + iBandCount);Band band = hDataset.GetRasterBand(1);int itype = band.GetRasterDataType();System.out.println(itype + "\n");//读取一行数据int buf[] = new int[iXSize]; band.ReadRaster(0, 0, iXSize, 1, buf); hDataset.delete();// 可选gdal.GDALDestroyDriverManager();}
}
我们将之前编译Java版本GDAL时生成的五个文件(dll和jar文件)复制到工程所在文件夹中,然后点击“工程”右键,选择“Build Path->configure build path”,弹出“属性”对话框,然后切换到“libraries”标签,点击“Add Jars…”,选择gdal.jar和名字中有ini的dll文件,添加到lib中,如图1-22所示,然后确定,编译运行即可。
**
1.9.5 调试GDAL源代码**
很多时候我们需要查看GDAL的源代码以了解它的内部实现,为了更好地理解源代码,可以通过调试查看源代码中变量的内容。
调试GDAL的源代码,需要GDAL的debug版本以及编译GDAL的时候生成的pdb等调试文件。此外我们也可以把GDAL的源代码加入到自己的工程中,但是这样太费时费力。
这里介绍一个很简单的方法:首先编译一下GDAL的debug版本(具体步骤可以参考1.6节的内容),将编译生成的文件(主要有gdal110.dll,gdal_i.exp,gdal_i.lib,gdal.lib,gdal110.pdb,gdal110.ilk,gdal110.exp等)复制到自己工程的生成目录中,然后调试自己的程序,在执行到GDALOpen函数(或者其他GDAL的函数)时按“F11”键,就可以进入到GDAL的源代码中进行调试。
对于使用C#语言来说,也可以跨语言来对GDAL进行调试。首先我们要确保GDAL库编译时使用debug版本,同时编译的C#版本也是debug版本。在执行调试时我们需要将GDAL的C#版本中八个dll文件及其对应的pdf等文件全部复制到测试程序输出目录,然后在测试目录的属性中勾选“启用非托管代码调试”,最后启动,按“F11”键即可进入GDAL源码。
《GDAL源码剖析与开发指南》一一1.9 简单的调用相关推荐
- java实现gdal栅格矢量化,《GDAL源码剖析与开发指南》一一1.5 GDAL源码目录
本节书摘来自异步社区出版社<GDAL源码剖析与开发指南>一书中的第1章,第1.5节,作者:李民录 更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.5 GDAL ...
- 《GDAL源码剖析与开发指南》导读
前言 GDAL源码剖析与开发指南 GDAL全称是Geospatial Data Abstraction Library(地理空间数据抽象库),是一个在X/MIT许可协议下读写空间数据(包括栅格数据和矢 ...
- GDAL源码剖析(一)
前言:一直在使用和研究GDAL的相关东西,发现网上对GDAL的内容倒是不少,但是很少有系统的介绍说明,以及内部的一些结构说明,基于这些原因,将本人的一些粗浅的理解放在此处,形成一个系列,暂时名为< ...
- GDAL源码剖析(四)之命令行程序说明二
接博客GDAL源码剖析(四)之命令行程序说明一http://blog.csdn.net/liminlu0314/article/details/6978589 其中有个nearblack,gdalbu ...
- GDAL源码剖析(二)之编译说明
一.简单的编译 1.使用VisualStudio IDE编译 首先进入GDAL的源代码目录,可以看到有几个sln为后缀的文件名,比如makegdal10.sln,makegdal80.sln,make ...
- GDAL源码剖析(六)之GDAL开发及其调试
写在开头:最近工作太忙,没时间更新,今天抽空更新一篇,上篇博客是四,这篇是六,中间还有一篇第五篇,主要将GDAL中的Python工具集,尽快给大家更新. 一.简单的调用 关于GDAL的使用,网上的资料 ...
- GDAL源码剖析(十)之编写自己的扩展格式
一.简介 该节内容参考GDAL的英文原文:http://www.gdal.org/gdal_drivertut.html. 通常,可以通过从GDALDataset和GDALRasterBand继承来实 ...
- GDAL源码剖析(九)之GDAL体系架构
在GDAL库中包含栅格数据的读写,矢量数据的读写,以及栅格和矢量数据的相关算法.下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明.本人英文很烂,有些部分写出来的东西自己都看不懂,如果不 ...
- GDAL源码剖析(四)之命令行程序说明一
一.GDAL工具通用命令 下面的工具主要参考的GDAL官方网站中提供的帮助文档说明,此外还有我的一些经验,GDAL官方具体地址为:http://gdal.org/gdal_utilities.html ...
最新文章
- Enterprise Library 2.0 技巧(1):如何使用外部配置文件
- decode的mysql用法_MySQL DECODE( )用法及代码示例
- Extjs 更换主题(转载)
- 优秀!22岁读博士,26岁当教授,因为太优秀反而没人敢追?
- 20179214 《网络攻防实践》第五周学习
- 用post方式获取html,httpclient中怎么使用post方法获取html的源码
- box2D斜面摩擦力和sprite朝向的兼顾取舍
- 计算机英语emulated,【英语词汇】 imitate、mimic、mock、 simulate、emulate 这组词都有...
- python制作表情,使用Python制作滑稽表情
- js字符串时间格式与中国标准时间格式相互转换
- 【工具-SublimeText3】在SublimeText3中无法高亮 .vue 文件内容和less代码的解决方案
- kafka的topic,broker,partition之间的关系
- 浅谈“李氏代换”——从纪念金庸和斯坦李说起
- 易方达e钱包汇添富现金宝-竞品分析
- about Netdarw
- java基于springboot的网上商城购物系统
- 简单的javascript学习01
- 数字孪生流域建设是什么意思?它有哪些可行性关键技术?
- PS对图片进行透明化处理以及字体颜色的加深
- php图像识别条形码,ThinkPHP用barcode制作条形码