当前位置: 首页 > 编程日记 > 正文

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

相关文章:

Hexo博客NexT主题美化之评论系统

前言 更多效果展示&#xff0c;请访问我的 个人博客。 效果图&#xff1a; Valine 诞生于2017年8月7日&#xff0c;是一款基于Leancloud的快速、简洁且高效的无后端评论系统。 教程&#xff1a; 登录 Leancloud 官网&#xff0c;注册之后创建一个应用&#xff0c;选择【设置】-…

倒计时1天 | 专属技术人的盛会,为你而来!

5G 元年&#xff0c;人工智能 60 年&#xff0c;全球AI市场正发生着巨大的变化&#xff0c;顶尖科技企业和创新力量不断地进行着技术的更迭和应用的推进&#xff0c;专属于 AI 开发者的技术盛宴——2019 AI开发者大会&#xff08;AI ProCon&#xff09;将于 明天&#xff08;9 …

Selenium 2 WebDriver 多线程 并发

我用的是Selenium2&#xff0c;至于它的背景和历史就不赘述了。Selenium2也叫WebDriver。下面讲个例子&#xff0c;用WebDriverjava来写个自动化测试的程序。&#xff08;如果能用firefox去测试的话&#xff0c;我就直接用Selenium IDE录脚本了。。。&#xff09;有个前提&…

GDAL2.1.1库在Ubuntu14.04下编译时遇到的问题处理方法

不用作任何调整&#xff0c;直接在Linux下编译GDAL2.1.1源码的步骤是&#xff1a;$ ./configure $ make $ make install非常简单&#xff0c; 这样也能正常生成gdal动态库、静态库&#xff0c;如果想将生成的文件放到指定的目录&#xff0c;则需改第一条命令为&#xff1a;$ ./…

刷爆了!这项技术BAT力捧!程序员:我彻底慌了...

人工智能离我们还遥远吗&#xff1f;近日&#xff0c;海底捞斥资1.5亿打造了中国首家火锅无人餐厅&#xff1b;阿里酝酿了两年之久的全球首家无人酒店也正式开始运营&#xff0c;百度无人车彻底量产。李彦宏称&#xff0c;这是中国第一款能够量产的无人驾驶乘用车。而阿里的这家…

redux的compose源码,中文注释

用图片会更清楚一点,注释和代码会分的清楚源码解析参考请参考https://segmentfault.com/a/11...

做好职业规划:做自己的船长

要想在职场上有所斩获&#xff0c;就必须做好职业规划。对于职场中人来说&#xff0c;职业规划是职业发展中最关键的向导。职业规划因人而异&#xff0c;不同的对象有不同的需求&#xff0c;因此制定的目标与计划也不尽相同&#xff0c;但个人为自己做职业规划的方法和流程是大…

GDAL中GDALDataset::RasterIO分块读取的实现

GDALDataset类中的RasterIO函数能够对图像任意指定区域、任意波段的数据按指定数据类型、指定排列方式读入内存和写入文件中&#xff0c;因此可以实现对大影像的分块读、写运算操作。针对特大的影像图像&#xff0c;有时为了减少内存消耗&#xff0c;对图像进行分块读取很有必要…

掌握深度学习,为什么要用PyTorch、TensorFlow框架?

作者 | Martin Heller译者 | 弯月责编 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】如果你需要深度学习模型&#xff0c;那么 PyTorch 和 TensorFlow 都是不错的选择。并非每个回归或分类问题都需要通过深度学习来解决。甚至可以说&#xff0c;并…

ICANN敦促业界使用DNSSEC,应对DNS劫持攻击

HTTPS加密 可以有效帮助服务器应对DNS欺骗、DNS劫持、ARP攻击等安全威胁。DNS是什么&#xff1f;DNS如何被利用&#xff1f;HTTPS如何防止DNS欺骗&#xff1f; DNS如何工作&#xff1f; 如果您想访问www.example.com&#xff0c;您的浏览器需要找到该特定Web服务器的IP地址。它…

Lucene.net: the main concepts

2019独角兽企业重金招聘Python工程师标准>>> In the previous post you learnt how to get a copy of Lucene.net and where to go in order to look for more information. As you noticed the documentation is far from being complete and easy to read. So in …

einsum,一个函数走天下

作者 | 永远在你身后转载自知乎【导读】einsum 全称 Einstein summation convention&#xff08;爱因斯坦求和约定&#xff09;&#xff0c;又称为爱因斯坦标记法&#xff0c;是爱因斯坦 1916 年提出的一种标记约定&#xff0c;本文主要介绍了einsum 的应用。简单的说&#xff…

常用排序算法的C++实现

排序是将一组”无序”的记录序列调整为”有序”的记录序列。假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;rirj&#xff0c;且ri在rj之前&#xff0…

4.65FTP服务4.66测试登录FTP

2019独角兽企业重金招聘Python工程师标准>>> FTP服务 测试登录FTP 4.65FTP服务 文件传输协议&#xff08;FTP&#xff09;&#xff0c;可以上传和下载文件。比如我们可以把Windows上的文件shan上传到Linux&#xff0c;也可以把Linux上的文件下载到Windows上。 Cent…

JavaScript的应用

DOM, BOM, XMLHttpRequest, Framework, Tool (Functionality) Performance (Caching, Combine, Minify, JSLint) ---------------- 人工做不了&#xff0c;交给程序去做&#xff0c;这样可以流程化。 Maintainability (Pattern) http://www.jmarshall.com/easy/http/ http://dj…

miniz库简介及使用

miniz&#xff1a;Google开源库&#xff0c;它是单一的C源文件&#xff0c;紧缩/膨胀压缩库&#xff0c;使用zlib兼容API&#xff0c;ZIP归档读写&#xff0c;PNG写方式。关于miniz的更详细介绍可以参考&#xff1a;https://code.google.com/archive/p/miniz/miniz.c is a loss…

iOS之runtime详解api(三)

第一篇我们讲了关于Class和Category的api&#xff0c;第二篇讲了关于Method的api&#xff0c;这一篇来讲关于Ivar和Property。 4.objc_ivar or Ivar 首先&#xff0c;我们还是先找到能打印出Ivar信息的函数&#xff1a; const char * _Nullable ivar_getName(Ivar _Nonnull v) …

亚马逊首席科学家李沐「实训营」国内独家直播,马上报名 !

开学了&#xff0c;别人家的学校都开始人工智能专业的学习之旅了&#xff0c;你呢&#xff1f;近年来&#xff0c;国内外顶尖科技企业的 AI 人才抢夺战愈演愈烈。华为开出200万年薪吸引 AI 人才&#xff0c;今年又有 35 所高校新增人工智能本科专业&#xff0c;众多新生即将开展…

人脸检测库libfacedetection介绍

libfacedetection是于仕琪老师放到GitHub上的二进制库&#xff0c;没有源码&#xff0c;它的License是MIT&#xff0c;可以商用。目前只提供了windows 32和64位的release动态库&#xff0c;主页为https://github.com/ShiqiYu/libfacedetection&#xff0c;采用的算法好像是Mult…

倒计时1天 | 2019 AI ProCon报名通道即将关闭(附参会指南)

2019年9月5-7日&#xff0c;面向AI技术人的年度盛会—— 2019 AI开发者大会 AI ProCon&#xff0c;震撼来袭&#xff01;2018 年由 CSDN 成功举办 AI 开发者大会一年之后&#xff0c;全球 AI 市场正发生着巨大的变化。顶尖科技企业和创新力量不断地进行着技术的更迭和应用的推…

法院判决:优步无罪,无人车安全员可能面临过失杀人控诉

据路透社报道&#xff0c;负责优步无人车在亚利桑那州致人死亡事件调查的律师事务所发布公开信宣布&#xff0c;优步在事故中“不承担刑事责任”&#xff0c;但是当时在车上的安全员Rafaela Vasquez要接受进一步调查&#xff0c;可能面临车辆过失杀人罪指控。2018年3月&#xf…

09 Storage Structure and Relationships

目标&#xff1a;存储结构&#xff1a;Segments分类&#xff1a;Extents介绍&#xff1a;Blocks介绍&#xff1a;转载于:https://blog.51cto.com/eread/1333894

边界框的回归策略搞不懂?算法太多分不清?看这篇就够了

作者 | fivetrees来源 | https://zhuanlan.zhihu.com/p/76477248本文已由作者授权&#xff0c;未经允许&#xff0c;不得二次转载【导读】目标检测包括目标分类和目标定位 2 个任务&#xff0c;目标定位一般是用一个矩形的边界框来框出物体所在的位置&#xff0c;关于边界框的回…

人脸识别引擎SeetaFaceEngine简介及在windows7 vs2013下的编译

SeetaFaceEngine是开源的C人脸识别引擎&#xff0c;无需第三方库&#xff0c;它是由中科院计算所山世光老师团队研发。它的License是BSD-2.SeetaFaceEngine库包括三个模块&#xff1a;人脸检测(detection)、面部特征点定位(alignment)、人脸特征提取与比对(identification)。人…

当移动数据分析需求遇到Quick BI

我叫洞幺&#xff0c;是一名大型婚恋网站“我在这等你”的资深老员工&#xff0c;虽然在公司五六年&#xff0c;还在一线搬砖。“我在这等你”成立15年&#xff0c;目前积累注册用户高达2亿多&#xff0c;在我们网站成功牵手的用户达2千多万。目前我们的公司在CEO的英名带领下&…

为什么选择数据分析师这个职业?

我为什么选择做数据分析师&#xff1f; 我大学专业是物流管理&#xff0c;学习内容偏向于管理学和经济学&#xff0c;但其实最感兴趣的还是心理学&#xff0c;即人在各种刺激下反应的机制以及原理。做数据分析师&#xff0c;某种意义上是对群体行为的研究和量化&#xff0c;两者…

人脸识别引擎SeetaFaceEngine中Detection模块使用的测试代码

人脸识别引擎SeetaFaceEngine中Detection模块用于人脸检测&#xff0c;以下是测试代码&#xff1a;int test_detection() {std::vector<std::string> images{ "1.jpg", "2.jpg", "3.jpg", "4.jpeg", "5.jpeg", "…

基于Pygame写的翻译方法

发布时间&#xff1a;2018-11-01技术&#xff1a;pygameeasygui概述 实现一个翻译功能&#xff0c;中英文的互相转换。并可以播放翻译后的内容。 翻译接口调用的是百度翻译的api接口。详细 代码下载&#xff1a;http://www.demodashi.com/demo/14326.html 一、需求分析 使用pyg…

冠军奖3万元!CSDN×易观算法大赛开赛啦

伴随着5G、物联网与大数据形成的后互联网格局的逐步形成&#xff0c;日益多样化的用户触点、庞杂的行为数据和沉重的业务体量也给我们的数据资产管理带来了不容忽视的挑战。为了建立更加精准的数据挖掘形式和更加智能的机器学习算法&#xff0c;对不断生成的用户行为事件和各类…