《GDAL源码剖析与开发指南》一一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源码。

时间: 2024-11-27 20:06:53

《GDAL源码剖析与开发指南》一一1.9 简单的调用的相关文章

《GDAL源码剖析与开发指南》一一1.8 GDAL帮助文档生成

1.8 GDAL帮助文档生成 GDAL源码剖析与开发指南1.8.1 Doxygen简介 Doxygen是生成C++注释文档的标准工具,也支持其他语言,如C.Objective-C.C#.PHP.Java.Python.IDL (Corba and Microsoft flavors).Fortran.VHDL.Tcl等. 我们可以通过三种方式来使用Doxygen. 1.从源文件中以HTML形式生成在线文档浏览器,或者以LATEX形式生成非在线的参考手册,也支持RTF (MS-Word).Post

《GDAL源码剖析与开发指南》一一1.7 SWIG编译

1.7 SWIG编译 GDAL源码剖析与开发指南1.7.1 SWIG简介 SWIG全称是Simplified Wrapper and Interface Generator,官方网站是http://www.swig.org/.SWIG是一个开发工具,能够将使用C或者C++编写的软件与其他各种高级编程语言进行嵌入联接.SWIG能应用于各种不同类型的语言,包括常用脚本编译语言例如Perl.PHP.Python.Tcl.Ruby.PHP等,也包括非脚本编译语言,如C#.Common Lisp (CLI

《GDAL源码剖析与开发指南》一一1.5 GDAL源码目录

1.5 GDAL源码目录 GDAL源码剖析与开发指南 下载的GDAL源代码压缩包目录如图1-2所示,使用SVN迁出的GDAL源代码目录如图1-3所示. 从图1-2和图1-3所示可以看出,不管用什么方式获取GDAL的源代码,它的目录结构都是一样的.下面我们就针对目录结构中的每个文件夹和文件作一个简单的说明(按照字母顺序). 1.5.1 文件夹说明 对于图1-3中所示的文件夹,详细说明如下. alg:该文件夹存放的是GDAL库中提供的一些算法的源代码,这些算法包括但不限于:DEM生成等高线算法,图像

《GDAL源码剖析与开发指南》一一1.6 GDAL编译

1.6 GDAL编译 GDAL源码剖析与开发指南 GDAL的编译分为三个小节,第一节是常规编译,使用微软的Visual Studio 2008进行编译,如果用微软的其他编译器,编译过程与此类似.需要注意的是,GDAL已经不再支持Visual C++6.0编译器.第二小节主要说明怎样修改GDAL的配置文件,以使GDAL支持更多的数据格式以及算法等.第三小节对编译GDAL的64位版本进行说明. 1.6.1 常规编译 1.使用Visual Studio 2008 IDE编译 在GDAL的源代码目录中,

《GDAL源码剖析与开发指南》一一1.1 什么是GDAL

1.1 什么是GDAL GDAL源码剖析与开发指南 GDAL全称是Geospatial Data Abstraction Library(地理空间数据抽象库),是一个在X/MIT许可协议下读写空间数据(包括栅格数据和矢量数据)的开源库,它利用抽象数据模型来表达所支持的各种文件格式,还使用一系列命令行工具来进行数据转换和处理. OGR(OGR Simple Features Library)是GDAL项目的一个分支,功能与GDAL类似,只是它提供对矢量数据的读写支持.同时它实现了一个对空间参考信息

《GDAL源码剖析与开发指南》一一1.3 GDAL支持的数据格式

1.3 GDAL支持的数据格式 GDAL源码剖析与开发指南 GDAL支持的数据格式分为两种:栅格数据格式和矢量数据格式.GDAL在每次版本更新的时候,都会加入对新的格式的支持.本书使用GDAL1.10版本中支持的栅格数据格式,如表1-1所示,支持的矢量数据格式如表1-2所示. 注意 文件的最大存储大小不仅由文件的格式决定,而且和操作系统有关系.

《GDAL源码剖析与开发指南》一一1.4 GDAL源码下载

1.4 GDAL源码下载 GDAL源码剖析与开发指南 GDAL的源码下载有两种方式.第一种是直接下载打包好的压缩包,下载地址为:http://trac.osgeo.org/gdal/wiki/DownloadSource.另外,GDAL的各个历史版本都可以在这个地址进行下载:http://download.osgeo.org/gdal/.这种下载方式很简单,此处不作说明.下载完成,使用压缩软件解压即可. 第二种下载方式是使用SVN源代码管理工具直接从GDAL的源码服务器进行下载.下载地址是:ht

《GDAL源码剖析与开发指南》一一1.2 GDAL特点

1.2 GDAL特点 GDAL源码剖析与开发指南GDAL提供对多种栅格数据的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式. OGR提供对矢量数据格式的读写支持,包括ESRI Shapefiles.S-57.SDTS.PostGIS.Oracle Spatial.Mapinfo mid/mif和Mapinfo TAB等. GDAL库还提供了一系列算法接口,比如矢量栅

《GDAL源码剖析与开发指南》导读

前言 GDAL源码剖析与开发指南 GDAL全称是Geospatial Data Abstraction Library(地理空间数据抽象库),是一个在X/MIT许可协议下读写空间数据(包括栅格数据和矢量数据)的开源库,它利用抽象数据模型来表达所支持的各种文件格式,还使用一系列命令行工具来进行数据转换和处理. 由于GDAL库支持很多数据格式,目前几乎所有的GIS和RS软件底层都使用GDAL来读写空间数据. 目前国内外关于GDAL的图书非常少,比较权威的只有GDAL官网的说明文档,导致用户缺少实用的