GDAL库简介以及在Windows下编译过程
GDAL(Geospatial Data Abstraction Library,地理空间数据抽象库)是一个在X/MIT许可协议下的开源栅格空间数据转换库。官网http://www.gdal.org/index.html,也可参考GitHub https://github.com/OSGeo/gdal,最新release版本为2.1.1.
GDAL是一个在X/MIT许可协议下读写空间数据(包括栅格数据和矢量数据)的开源库,它利用抽象数据模型来表达所支持的各种文件格式,还使用一系列命令行工具来进行数据转换和处理。
OGR(OGR Simple Features Library)是GDAL项目的一个分支,功能与GDAL类似,只是它提供对矢量数据的读写支持。同时它实现了一个对空间参考信息进行处理的类,用来对空间数据的空间信息进行处理。
GDAL支持的数据格式分为两种:栅格数据格式和矢量数据格式。GDAL在每次版本更新的时候,都会加入对新的格式的支持。
GDAL2.1.1源码中目录结构介绍:
alg:该目录下存放的是GDAL库中提供的一些算法的源代码;
apps:该目录下存放的是GDAL库中提供的一些命令行工具集的源代码;
bridge:该目录下存放的是用来连接GDAL抽象类的定义与GDAL自己的结构体定义及其实现的源代码;
data:该目录下存放的是GDAL库中需要用到的一些”配置文件”;
doc:该目录下存放的是用来生成GDAL帮助文档的一些dox文件;
frmts:该目录下存放的是GDAL针对不同的特定图像格式解析的源代码;
gcore:该目录下存放的是GDAL抽象类的数据集、图像、波段的读写接口等代码;
html:该目录下存放的是GDAL生成的帮助文档;
m4:该目录下存放的是以m4为后缀的文件,m4文件叫Macro Processor Library,主要是用autoconf来产生configure配置文件,继而自动生成Makefile文件;该目录在Windows下无用;
man:该目录下存放的是用来生成Linux或者其它平台下的帮助文件,Windows下无用;
ogr:该目录下存放的是OGR库源代码;
port:该目录下存放的是CPL库的源代码;CPL是一个GDAL的底层支持库,CPL库中定义了一些字符串的操作、文件处理、网页请求、数据库连接、哈希表、字符加密文件、压缩等基础的函数;
swig:该目录下存放的是swig的脚本;swig的作用就是可以将C/C++的库封装为Python、C#、Java、Perl和Ruby等其它语言的访问接口;
vb6:该目录用来将GDAL编译成一个VB6的模板;
alcocal.m4:该文件是用autoconf来产生configure配置文件;
autogen.sh:shell文件,该文件通过调用autoconf来产生configure配置文件;
COMMITERS:该文件中的内容是GDAL开发人员的信息,包括姓名、联系邮箱以及各自负责开发的模块说明等;
Doxyfile:用来生成帮助文件;
GDALmake.opt.in:该文件是Linux平台下的GDAL库编译配置文件;
gdalnightlysvn.sh:该文件是Linux平台下调用svn获取GDAL源代码的一个shell脚本;
GNUmakefile:GNU的make文件;
HOWTO-RELEASE:该文件是GDAL发布版本的一些说明;
install-sh:该文件是Linux平台下GDAL安装的shell脚本;
LICENSE.TXT:该文件是GDAL的许可说明文件;
ltmain.sh:Linux平台下libtool的shell脚本,windows下无用;
makefile.vc:GDAL的编译文件,用来将源代码编译成dll文件;
makegdal_gen.bat:用来生成VS的工程文件的批处理文件;
NEWS:该文件是介绍GDAL的新增功能以及修复的bug记录等;
nmake.opt:GDAL编译选项配置文件,在编译GDAL时,可以指定GDAL绑定的其它库;
PROVENANCE.TXT:GDAL目录说明文件;
VERSION:GDAL版本信息。
下面介绍GDAL2.1.1源码在windows vs2013中的编译步骤:
1. 从http://download.osgeo.org/gdal/2.1.1/下载最新稳定版本2.1.1,gdal211.zip并解压缩至E:\GitCode\GDAL_Test\src\gdal目录下;
2. 修改nmake.opt文件: MSVC_VER=1800 GDAL_HOME = "E:\GitCode\GDAL_Test\lib_x64_release"
3. 以管理员身份打开”VS2013 x64 兼容工具命令提示”;
4. 首先切换到VS2013的安装目录下执行:
C:\Program Files (x86)\Microsoft Visual Studio12.0\VC\vcvarsall.bat amd64;
5. 然后切换到GDAL源码目录E:\GitCode\GDAL_Test\src\gdal下依次执行:
nmake /f makefile.vc MSVC_VER=1800 WIN64=YES nmake /f makefile.vc MSVC_VER=1800 WIN64=YES install nmake /f makefile.vc MSVC_VER=1800 WIN64=YES devinstall
6. 执行完以上三条命令后,就会在E:\GitCode\GDAL_Test\lib_x64_release目录下生成gdal x64 release相应头文件、静态库和动态库
7. 按照以上类似步骤即可生成x64 debug、win32 release、win32 debug相应库:
C:\Program Files (x86)\Microsoft Visual Studio12.0\VC\vcvarsall.bat x86 nmake /f makefile.vc MSVC_VER=1800 DEBUG=1
如按照以上的步骤生成的库运行时提示缺失msvcr120.dll,则修改nmake.opt文件,将130行到138行,四处的/MD改成/MT即可。
按照上面的步骤只能生成相应的库,确不能生成vc工程,下面介绍下能生成vc工程的操作步骤:
1. 将nmake.opt文件中的SYM_PREFIX=_ 改为SYM_PREFIX=
2. 将makefile.vc中的内容
BASE_INCLUDE = /INCLUDE:_GDALSimpleImageWarp@36 \ /INCLUDE:_GDALReprojectImage@48 \ /INCLUDE:_GDALComputeMedianCutPCT@32 \ /INCLUDE:_GDALDitherRGB2PCT@28 \ /INCLUDE:_OCTNewCoordinateTransformation@8 $(VB6_SAFEARRAYSYM)
调整为:
BASE_INCLUDE = /INCLUDE:$(SYM_PREFIX)GDALSimpleImageWarp \ /INCLUDE:$(SYM_PREFIX)GDALReprojectImage \ /INCLUDE:$(SYM_PREFIX)GDALComputeMedianCutPCT \ /INCLUDE:$(SYM_PREFIX)GDALDitherRGB2PCT \ /INCLUDE:$(SYM_PREFIX)OCTNewCoordinateTransformation $(VB6_SAFEARRAYSYM)
3. 在刚才打开的命令行窗口中输入:makegdal_gen.bat 10.00 64 > makegdal10.vcproj ,执行完后会生成makegdal10.vcproj;
4. 打开vs2013,将其makegdal10.vcproj加入到工程中,会升级到vs2013;
创建一个控制台工程GDAL_Test,测试生成库的正确性,测试代码如下:
#include <iostream>
#include <gdal_priv.h>
#include <ogrsf_frmts.h>
#include <gdal_alg.h>
int main()
{
const char* image_name = "E:/GitCode/GDAL_Test/test_images/a.tif";
GDALAllRegister();
GDALDataset* poSrc = (GDALDataset*)GDALOpen(image_name, GA_ReadOnly);
if (poSrc == nullptr) {
std::cout << "input image error" << std::endl;
return -1;
}
int width_src = poSrc->GetRasterXSize();
int height_src = poSrc->GetRasterYSize();
int band_count_src = poSrc->GetRasterCount();
fprintf(stderr, "width: %d, height: %d, bandCount: %d\n", width_src, height_src, band_count_src);
GDALDataType gdal_data_type = poSrc->GetRasterBand(1)->GetRasterDataType();
int depth = GDALGetDataTypeSize((GDALDataType)gdal_data_type);
fprintf(stderr, "depth: %d\n", depth);
GDALClose((GDALDatasetH)poSrc);
std::cout << "ok" << std::endl;
return 0;
}
结果如下:
由于编译GDAL源码需要较长的时间,这里把windows下x86/x64 debug/release编译好的库都放在了GitHub上,有需要的可以去下载。
GitHub:https://github.com/fengbingchun/GDAL_Test
GDAL库简介以及在Windows下编译过程的更多相关文章
- bundler-sfm windows下编译过程中出现的错误
一.“sysdep1.h”文件缺失 错误提示: fatal error C1083: 无法打开包括文件: “sysdep1.h”: No such file or directory 这些作为这个软件 ...
- 如何在WINDOWS下编译BOOST C++库 .
如何在WINDOWS下编译BOOST C++库 cheungmine 2008-6-25 写出来,怕自己以后忘记了,也为初学者参考.使用VC8.0和boost1.35.0. 1)下载boost ...
- windows下编译和安装boost库
boost是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库. 获取方式 boost提供源码形式的安装包,可以从boost官方网站下载,目前最新版本是1.59.0. 本机上正好有boos ...
- [转] Windows下编译OpenSSL
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
- 在Windows下编译FFmpeg详细说明
MinGW:一个可自由使用和自由发布的Windows特定头文件和使用GNC工具集导入库的集合,允许你生成本地的Windows程序而不需要第三方C运行时 MinGW,即 Minimalist GNU F ...
- Windows下编译memcached-1.4.5(32bit和64bit)
1.简介 Memcached 是一个高性能的分布式内存对象缓存系统.它通过将数据缓存在内存中来减少对数据库和文件系统的访问,减轻数据库及操作系统的负担,提高应用系统的速度. 目前已经很多系统应用了me ...
- Windows下编译OpenSSL(使用VS2013)
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
- Windows下编译objective-C
Windows下编译objective-C 2011-08-31 14:32 630人阅读 评论(0) 收藏 举报 windowscocoa工具objective clibraryxcode 目录 ...
- windows下编译ffmpeg
windows 编译ffmpeg 搞过很多次,每次总是磕磕碰碰,从头到尾不能一直顺利,浪费一些时间.终究起原因,都是当时记得,过段时间就忘了.好记性不如烂笔头,大好周末晚上,闲暇无事,记录最近一次编译 ...
随机推荐
- angularJS报错$apply already in progress的原因和解决方法
如果我们使用了AngularJS中的$scope.$apply()或者$scope.$digest(),我们很可能会遇到类似下面的错误,虽然这个错误没有太大影响,但是在日志中看起来还是很不爽的,日志中 ...
- Mysql分表和分区的区别、分库分表介绍与区别(转)
分表和分区的区别: 一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这 ...
- CSS 优先级和特指度
1.ID 选择符 > 类选择符 > 元素选择符.特指度高的优先级高 2.行内样式 > 内嵌样式 > 链接样式 3.设定的样式 > 继承的样式 特指度的计算: 特指度能够用 ...
- 「SLYZ Online Judge#74 Be」
只有学校里的电脑才能看的题目 昊哥从牛客搬的,懒得找原题了 题意就是多组询问,每次询问一条树上路径,将这条路径上的点拿下来做\(0/1\)背包,求使得点权和为\(K\)的倍数的方案有几种 \(n< ...
- VC++ MFC工程中中如何将一个工程的资源(如对话框)复制到另外一个工程
问题的提出:在工程1中用到的资源,在工程2中已有现成的.即工程1中要用到的对话框和工程2的完全相同,而工程2中对该对话框的布局已设计好.控件变量都绑定好了.但由于该对话框的控件特别多,如果在工程1中再 ...
- PAT——1001 害死人不偿命的(3n+1)猜想 (15)
对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1? 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值. 输出格式:输出从n计算到1需要的步数. 输入样例 ...
- CToolBarCtrl工具栏设置总结(转)
(一)工具条控制的主要功能 所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮.检查盒按钮.无线按 钮等.工具条对象类派生于主窗口架框类CframeWnd或CMDIFrame ...
- 掺合模式(Mixin)
Mixin是JavaScript中用的最普遍的模式,可以就任意一个对象的全部或部分属性拷贝到另一个对象上.从提供的接口来看,有的是对对象的操作,有的是对类的操作.对类的操作又称为掺元类(Mixin c ...
- ASP.NET Core中怎么实现Url rewrite功能
我们可以使用ASP.NET Core的中间件来实现Url rewrite功能,下面我们定义一个中间件ReplaceQueryStringMiddleware来替换Http请求中的Url参数即Query ...
- OSMboxPend()
1. 原型:void *OSMboxPend(OS_EVENT *pevent, INT16U timeout, INT8U *err) 2. 参数意义: pevent :消息邮箱 timeout ...