GDAL源码剖析(一)

article/2025/11/6 1:23:22

前言:一直在使用和研究GDAL的相关东西,发现网上对GDAL的内容倒是不少,但是很少有系统的介绍说明,以及内部的一些结构说明,基于这些原因,将本人的一些粗浅的理解放在此处,形成一个系列,暂时名为《GDAL源码剖析》(名称有点大言不惭,欢迎大家口水吐之,板砖拍之),供大家交流参考,有什么错误之处,望大家不吝指正,本系列对于GDAL的使用均是在Windows平台下,对于Linux平台下的不在此系列讨论范围之内。此外,转载本博客内容,请注明出处,强烈鄙视转载后不注明出处的“类剽窃”行为。

一、GDAL简介

    GDAL官方网站http://www.gdal.org/,本文章中的基本内容都是参照官网中的信息,如有错误或者与官网中的内容冲突,以官网中的为正确。

在开始文章之前,我想先提出几个问题,什么是GDAL?GDAL能做什么?GDAL怎么使用?GDAL内部结构是怎么组织的?GDAL提供的算法原理是什么?对于上面的几个问题,希望大家看完该系列文章后能对上面的几个问题少点疑惑,希望能对感兴趣的童鞋们有所帮助。本人不才,文章中难免会出现问题,希望大家不吝指正。

什么是GDAL?这个问题比较简单,通俗的讲,GDAL是一个读写空间数据(这里的空间数据包括栅格数据和矢量数据)的开源库(但不仅限于此,此外还提供了一些非常常用的算法和工具)。严格的讲,大家可以参考GDAL首页上的介绍。

 GDAL is a translator library for raster geospatial dataformats that is released under an X/MIT style Open Source license by the Open Source Geospatial Foundation. As alibrary, it presents a singleabstract data model to the calling application for allsupported formats. It also comes with a variety of usefulcommandline utilities fordata translation and processing. TheNEWSpage describes the July 2011 GDAL/OGR 1.8.1 release.

The related OGR library(which lives within the GDAL source tree) provides a similar capability forsimple features vector data.

二、GDAL目录结构

    首先对于GDAL的目录结构进行一个简单的介绍。GDAL源代码下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource,或者安装svn从源代码服务器下载,svn地址是:http://svn.osgeo.org/gdal/trunk。

    如果是使用下载的压缩包,其目录结构如下图:


图1 GDAL源码压缩包文件目录结构

    如果使用svn下载的源代码,目录结构如下:

图2 GDAL SVN源码文件目录结构

从上面两张图中可以看出,GDAL的目录结构不管是用什么方式获取的源代码,它的目录结构都是一样的,下面就针对目录结构中的每个文件夹和文件做一个简单的说明。(按照字母顺序来进行说明)

   下面先对文件夹进行说明:

1、alg文件夹:alg文件夹中存放的是GDAL库中提供的一些算法的源代码,这些算法包括但不限于:DEM生成等高线算法;图像纠正算法(几何纠正,TPS纠正,正射RPC纠正);栅格矢量化算法;矢量栅格化算法;格网计算算法;PCT和RGB互转算法;分类图的小碎斑块去除算法等。

2、apps文件夹:apps文件夹中存放的是GDAL库中提供的一些命令行工具集的源代码,这些工具集的介绍可以参考http://gdal.org/gdal_utilities.html,将来我会对这些工具做一个简单的说明。其中有些工具非常的有用,比如gdalinfo,可以使用该工具来查看图像的元数据信息等。

3、bridge文件夹:bridge文件夹中存放的是用来连接GDAL抽象类的定义以及GDAL自己的结构体定义和实现的源代码。具体到后面涉及到GDAL的实现原理时会对该文件夹作一个比较详细的介绍。

4、data文件夹:data文件夹中存放的是GDAL库中需要用到的一些“配置文件”(此处用配置文件可能不太准确),这些文件主要有ESRI的投影文件,ESPG的投影文件,PCI的投影和椭球体文件,autoCAD的头文件,以及其他的一些文件。在GDAL库中有很多时候会自动读取该文件夹中的文件,一般是通过环境变量来查找该文件夹,环境变量的名字叫GDAL_DATA,值就是data文件夹的路径,或者可以在你的程序中使用函数 CPLSetConfigOption("GDAL_DATA","C:\GDAL\data");来进行设置该文件夹的目录,如果没有设置GDAL会自动从环境变量中查找,如果还是没有找到,那么GDAL可能会提示错误,比如如果不设置GDAL_DATA,那么在写如atuocad的dxf格式的时候就提示创建不成功,后面遇到的话会再进行说明。

5、doc文件夹:doc文件夹存放的是用来生产GDAL帮助文档的一些dox文件,dox文件是使用doxygen工具来进行生成的,后面会对doxygen工具作一个简单的介绍和说明,以及在自己的工程中怎么使用doxygen生成自己的程序的开发帮助文档等。总之一句话,这个文件夹就是用来生成GDAL库的帮助文档的一些东西。后面会告诉大家如何生成一份GDAL的帮助文档,当然你也可以把gdal.org整个网站抓下来,J

6、frmts文件夹:这个文件夹可以说是GDAL代码中东西最多的一个文件夹了,每次更新GDAL的版本后都会发现这个文件夹中会多出几个文件夹,同时GDAL也会中支持的文件格式中多出来几个新的文件格式。没错,这个文件夹存放的就是GDAL针对每种不同的特定的图像格式解析的源代码,可以举几个简单的例子,比如bmp文件夹就是解析BMP图像的,hfa文件夹就是用来解析Erdas的img图像格式,raw文件夹用来读取ENVI的hdr文件,还有pcidsk文件夹就是读取PCI的pix格式的等等。所以这个文件夹存放的是解析各个文件格式的源代码。

7、gcore文件夹:通过名字大家也应该知道这个文件夹是做什么的了,叫core的肯定都是很核心的东西了,这个文件夹就是GDAL的灵魂所在,主要存放的GDAL抽象类的数据集,波段,图像读写接口等都在这个里面实现的。如果要知道GDAL的抽象类是怎么对图像格式进行抽象的,可以看看这个里面的代码。

8、html文件夹:html文件夹如果使用压缩包的话,里面应该是空的,这个文件夹主要是用来存放GDAL的生成的帮助文档的地方,主要是使用前面介绍的doc文件夹中的dox脚本,使用doxygen工具生成的GDAL帮助文档会出现在这个文件夹中。后面会和doc文件夹一起进行一个详细介绍。

9、m4文件夹:m4文件夹存放的有好几个已m4为后缀名的文件,m4文件叫MacroProcessor Library,m4文件是编译基础中最核心的文件,这个文件主要是用autoconf来产生configure配置文件,继而自动生成Makefile文件。这个文件夹中Windows平台下貌似没什么作用,可能是我还不知道吧,在此略过。

10、man文件夹:man文件夹貌似是用来生成linux或者其他平台下的帮助文件,估计是可以使用linux下的man帮助吧。Windows平台下貌似也没什么用,略过。

11、ogr文件夹:用过GDAL的肯定知道ogr库吧,在很久很久以前,GDAL和OGR是两个库,GDAL专门负责读取栅格数据,OGR库负责读取矢量数据,然后可能是因为两个库分开有些不方便,比如GDAL的算法库中经常会用到矢量数据的读取,或者还有别的原因吧,现在将这两个库整合在了一起,目前OGR库就是GDAL库的一个子集。其实OGR库还是可以单独编译出来的。Ogr文件夹就是存放OGR库源代码的文件夹。这个文件夹里面也是有很多东西的,后面再详细进行介绍。

12、port文件夹:port文件夹中存放的是port库的东西,port库对于GDAL库来说是一个底层的支持库,port库中定义了一些字符串的操作,文件处理,网页请求,数据库连接,哈希表,字符加密文件压缩等基础的函数。比如GDAL中所有的导出函数符号CPL_DLL就是在这个port文件夹中定义的,还有frmts文件夹中,打开文件,打开数据库,打开网络路径等都是用的port库,以及字符串的处理等。

13、swig文件夹:swig文件夹主要是存放swig的脚本。Swig全称叫SimplifiedWrapper and Interface Generator,网址是www.swig.org,          swig的作用就是可以将C/C++写的库封装为Python,C#,Java,Perl和 Ruby等其他语言的访问接口。网上GDAL的C#版本就是使用swig来编译出来实现的,很强大吧。后面有时间的话,会写一篇关于swig编译GDAL的文章。

14、vb6文件夹:这个文件夹中用来将GDAL编译成一个VB6的模块,对于里面具体的文件说明,以及如何编译参考文件夹中的readme.txt,由于我对VB6的使用,还是仅限于拖个按钮,写个单击事件的基础,对于模块之间的调用,实在是不太懂,所在就不说明了。想用VB6使用GDAL的可以自己研究一下,应该也不是很难。

15、wince文件夹:顾名思义,这个文件夹中的东西就是用来编译Windows CE平台下的GDAL库用的,具体编译请参考其中的说明文档。

文件夹介绍完了,下面对文件进行一个大概说明:

1、aclocal.m4:同上面的m4文件夹

2、autogen.sh:Linux平台下的shell文件,用来调用autoconf来产生configure配置文件的。

3、COMMITERS:该文件中的内容是GDAL开发人员的信息,姓名,联系邮箱以及各自负责开发的模块说明等。

4、config.guess,config.sub,configure,configure.in:这四个文件貌似都是linux平台下的配置文件,中Windows下没啥用,略过。

5、Doxyfile:Doxyfile就是前面doc文件夹中说明提到的doxygen的工程文件,用来生成帮助文档用的,后面在介绍doxygen的使用是会对该文件进行一个说明。

6、GDALmake.opt.in:这个文件是linux平台下的GDAL库编译配置文件,功能在后面的nmake.opt中介绍。

7、gdalnightlysvn.sh:Linux平台下调用svn获取GDAL源代码的一个shell脚本。

8、GNUmakefile:GNU的make文件。

9、HOWTO-RELEASE:GDAL发布版本的一些说明。

10、    install-sh:GDAL的安装shell脚本,Linux平台下。

11、    LICENSE.TXT:GDAL的许可说明文件。

12、    ltmain.sh:libtool的shell脚本,Linux平台下,Windows下貌似没用到。

13、    makefile.vc:GDAL的编译文件,用来将源代码编译成dll文件,后面会在GDAL编译中作一个介绍。

14、    makegdal_gen.bat:用来生成VS的工程文件的一个批处理文件,后面在GDAL编译中会对该文件的使用方式做一个说明。

15、    makegdal10.sln:文件夹中所有的sln文件都是VS的项目文件,文件名后的数字代表的是VS的版本号。

16、    makegdal10.vcxproj和makegdal71.vcproj:VS的工程文件,该文件可以由makegdal_gen.bat文件自动生成,后面详细介绍。

17、    mkbindist.sh,mkgdaldist.sh和mktestdist.sh:三个shell脚本文件,Windows下没用,略过。

18、    NEWS:GDAL的新增功能,以及修复的bug记录等。

19、    nmake.opt:GDAL编译选项配置文件,在编译GDAL中,可以指定GDAL绑定的其他库等都在这个里面进行设置。在后面的GDAL编译中会详细介绍说明。

20、    nmake-wince.opt:编译wince版本的编译选项配置文件。

21、    PROVENANCE.TXT:GDAL目录说明文件,如果上面说明的不够清楚,可以参考这个文件。

22、    submake.bat:一个编译的批处理文件,目前没啥用。

23、    svnkeywords.sh:又是svn的一个shell脚本。

24、    VERSION:GDAL版本信息。


第一篇完,后续文章陆续奉上,敬请期待新作!

http://chatgpt.dhexx.cn/article/xxXnlKdO.shtml

相关文章

gis利器之Gdal(一)

现如今,随着很多行业对gis的了解越来越深入,很多关于智慧的标签便纷纷贴上了,比如智慧园区、智慧交通、智慧城市、智慧校园等等诸多的行业深度应用。国内外有很多gis的相关产品,国外有大名鼎鼎的arcgis,国内有超图、ma…

GDAL教程(一)查看帮助文档

一、在GDAL官网https://www.gdal.org/可以查看英文帮助。 二、Main Page主页 1.开头介绍了什么是GDAL(Geospatial Data Abstraction Library地理空间数据抽象库)以及GDAL源码各个版本的下载链接。 2.User Oriented Documentation使用定向的文档&#x…

Ubuntu 安装 GDAL C++库

1. GDAL简介 GDAL 是读写大量的栅格空间数据格式的广泛应用的开源库。该库起源于 1998年,已经大幅进化。 它支持他自己的数据模型和应用程序接口(API)。 从最初的单一发展的起源,GDAL已发展成为一个分布式的项目,开发人员的数量相对比较大。 GDAL官网下载以及安装教程。 2. …

JAVA使用GDAL入门指南

如果你打开了这篇博客,那么你肯定和我当初一样的苦逼。 话不多说,分析下我学习gdal的一丢丢心得。 1.你要知道什么GDAL,它是干什么的。 gdal到底是什么呢,相信你已经百度过了。。。。 ** 2.Java集成gdal 2.1 下载Java版本的gd…

在Python中安装GDAL(最简单,最详细图文教程)

在Python中安装GDAL(最简单,最详细图文教程) 今天是2021年1月20日。为了安装在pythong中安装GDAL,我浏览了几十个网页,发现有99%都是垃圾,浪费了我非常多的时间。最后我安装成功了,在这里我把我的全过程放在这里。希望大家少走些弯路,也少浪费点时间。 首先我的专业背…

Python中安装GDAL库

GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理,可以用来处理栅格数据如遥感影像、DEM等。 1. 下载GDAL 安装GDAL库是…

python安装gdal库

1、直接输入pip install gdal,报错无法安装。 原因:GDAL不是纯净的python库,无法像pip install flask这样安装库文件。 解决方法: 2、首先要明确自己安装路径下有没有gdal这个文件 在winr,输入cmd,键入…

Gdal总结

1、头文件 #include<gdal.h> #include<gdal_priv.h> #include<gdalwarper.h> 2、注册驱动设置中文路径加载数据 //注册所有的驱动GDALAllRegister();//设置支持中文路径和文件名CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); /…

gdal概览

GDAL 1 gdal库2 栅格驱动3 栅格数据集&#xff08;就是包含各种栅格属性的一个类&#xff09;3.1 坐标&#xff08;6个参数&#xff09;3.1.2 tif文件的地理坐标&#xff08;两种情况&#xff09; 3.2 波段数、大小、投影等信息3.3 读取栅格像元3.4 创建栅格影像3.4.1 直接用数…

2.GDAL简介

1. 什么使GDAL GDAL全称是Geospatial Data Abstraction Library(地理空间数据抽象库),在一个X/MIT许可协议下读写空间数据(包括栅格数据和矢量数据)的开源库&#xff0c;它利用抽象数据模型来表达所支持的各种文件格式&#xff0c;还使用一系列命令行来进行数据转换和处理。 …

GDAL学习笔记02:GDAL基础知识

你的习惯决定了你会成为什么样的人。 GDAL学习笔记02&#xff1a;GDAL基础知识 前言1. 版本2. 摘要3. 说明4. 微信公众号GISRSGeography 一、GDAL简介二、导入GDAL三、读取遥感影像的信息 前言 1. 版本 1.1 山东青岛&#xff0c;2022年7月17日&#xff0c;Version 1 2. 摘要…

GDAL 安装教程(Python)

引言 本文介绍 GDAL&#xff08;Geospatial Data Abstraction Library&#xff0c;空间数据抽象库&#xff09;的 Python 版本安装教程。 简介 GDAL 是用于栅格和矢量地理空间数据格式的开源转换器。向调用应用程序提供所有受支持格式的单个栅格抽象数据模型和单个矢量抽象数…

TrAdaBoost

TraAdaBoost是AdaBoost算法的扩展。 TraAdaBoost核心思想&#xff1a; same-distribution instance feature:训练数据中与测试数据分布相同的数据&#xff0c;用Ts表示&#xff0c;m 错误预测增加权重 diff-distribution instance feature:训练数据中与测试数据分布不同的数据&…

Boost Build

Window XP Visual Studio 2008 获取Boost库源码 我们可以从http://www.boost.org/ 上获取boost的源代码。当前最新版本为1.45.0。 解压到指定目录 例如&#xff1a;D:/Program Files/boost/目录下 获取bjam 一种方式&#xff1a;从http://sourceforge.net/projects/boos…

BoF and Bos

Bag of freebies 采用一些方法使模型有更高的准确度但是不增加模型的复杂度和模型的推理代价 PS&#xff1a;数据增强应该在图像标准化(normalization)之前完成&#xff1b; Library: Albumentations arxiv github docsAugmentor arxiv github docs Biomedical image augment…

Boost 作为客户端 boost

系列文章目录 lotus Boost 作为客户端 系列文章目录前言一、同步区块高度二、boost 初始化1. 生成钱包地址2. boost设置默认钱包地址 三、boostx向存储市场添加资金四、发单五、离线交易参考 前言 Boost 作为客户端 一、同步区块高度 可以远程调用其它api&#xff0c;也可以…

DART booster

XGBoost基本上都是组合大量小学习率的回归树。在这种情况,越晚添加的树比越早添加的树更重要。 Rasmi根据深度神经网络社区提出一个新的使用dropout的boosted trees,并且证明它在某些情况有更好的结果。 以下是新的tree boosterdart的介绍。 原始文章 特征 Drop Trees是…

boost::format

实在不好意思&#xff0c;原本计划每天一篇&#xff0c;这几天工作遇到问题&#xff0c;只好改为“不定期”一篇&#xff0c; 今天是format library&#xff0c;其实N天前我已经看过了&#xff0c;也动手实验了一下&#xff0c;现在才来把笔记补上。 用过MFC或ATL中的CString的…

adboost

要明确Adaboost是一种算法。 介绍一下Adaboost的历史。 Adaboost的前身的Boosting算法。 Boosting是一种提高任意给定学习算法准确度的方法。它的思想起源于Valiant提出的PAC(Probably Approximately Correct)学习模型。Valiant和Kearns提出了弱学习和强学习的概念,识别错误…

buuctf easymd5

点击f12&#xff0c;查看源代码看看有没有消息 Hint&#xff1a;select * from ‘admin’ where password md5($pass,ture) 我们要让passwordmd5($pass,ture) mysql里面&#xff0c;在用作布尔型判断时&#xff0c;以数字开头的字符串会被当做整型数。 要注意的是这种情况是必…