【小沐学GIS】GDAL库安装和使用(C++、Python)

文章目录

  • 1、简介
  • 2、下载和编译(C++)
    • 2.1 二进制构建
      • 2.1.1 Conda
      • 2.1.2 Vcpkg
    • 2.2 源代码构建
      • 2.2.1 nmake.opt方式构建
      • 2.2.2 generate_vcxproj.bat方式构建
    • 2.3 命令行测试
      • 2.3.1 获取S57海图数据
    • 2.4 代码测试
      • 2.4.1 读取tiff信息
  • 3、Python
    • 3.1 安装
    • 3.2 测试
      • 3.2.1 获取版本信息
      • 3.2.2 读取TIFF数据
      • 3.2.3 获取shapefile要素
  • 结语

1、简介

https://github.com/OSGeo/gdal
https://gdal.org/index.html

GDAL 是用于栅格和矢量地理空间数据格式的转换器库,由开源地理空间基金会在 MIT 风格的开源许可下发布。作为一个库,它向调用应用程序提供单个栅格抽象数据模型和单个矢量抽象数据模型,用于所有支持的格式。它还带有各种有用的命令行实用程序,用于数据转换和处理。
在这里插入图片描述

2、下载和编译(C++)

https://gdal.org/download.html

2.1 二进制构建

2.1.1 Conda

Conda 可以在多个平台(Windows、macOS 和 Linux)上使用 安装软件包和管理环境。

conda install -c conda-forge gdal

2.1.2 Vcpkg

vcpkg 中的 gdal 端口由 Microsoft 团队成员和社区贡献者保持最新状态。 vcpkg 的 url 为:https://github.com/Microsoft/vcpkg 。 您可以使用 vcpkg 依赖项管理器下载并安装 gdal:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh  # ./bootstrap-vcpkg.bat for Windows
./vcpkg integrate install
./vcpkg install gdal

2.2 源代码构建

GDAL 的主存储库位于 GitHub 的 https://github.com/OSGeo/GDAL。
您可以通过发出以下命令来获取活动源代码的副本 命令:
git clone https://github.com/OSGeo/GDAL.git

比如这里需要编译gdal2.4.4这个版本,也可以通过如下网址访问源码:
https://download.osgeo.org/gdal/2.4.4/
在这里插入图片描述

2.2.1 nmake.opt方式构建

在解压后的文件夹中找到nmake.opt文件,修改几个配置参数;
在这里插入图片描述
第57行,GDAL_HOME = “C:\warmerda\bld"这个路径是用来存储编译后的头文件、静态库、动态库等;这个路径可以自定义,这里改成了"D:\gdal-dist”。
在这里插入图片描述

打开VS2017下的兼容工具命令提示符,选择管理员身份运行;
在这里插入图片描述
目录切换到你解压的GDAL-2.4.4的文件夹下,输入命令:

# nmake -f makefile.vc
# nmake -f makefile.vc MSVC_VER=1900
# nmake -f makefile.vc MSVC_VER=1900 DEBUG=1
# nmake -f makefile.vc MSVC_VER=1900 DEBUG=1 ANALYZE=1
# nmake -f makefile.vc MSVC_VER=1900 DEBUG=1 ANALYZE=1 WITH_PDB=1
# nmake -f makefile.vc MSVC_VER=1900 WIN64=1nmake -f makefile.vc  WIN64=1

在这里插入图片描述
在这里插入图片描述
编译完成如下:
在这里插入图片描述
再次输入命令。这个命令是用来生成bin、html、data文件夹 。

nmake /f makefile.vc install WIN64=1

在这里插入图片描述
在这里插入图片描述
输入命令,用来生成lib/include文件夹 。

nmake /f makefile.vc devinstall WIN64=1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.2 generate_vcxproj.bat方式构建

执行这个generate_vcxproj.bat文件可以生成gdal库的vc工程文件。
打开VS2017下的兼容工具命令提示符,选择管理员身份运行;
在这里插入图片描述
执行命令:

generate_vcxproj 15.0 64 gdal_vs2017

在这里插入图片描述
生成对应的vs2017的工程文件如下:
在这里插入图片描述

2.3 命令行测试

2.3.1 获取S57海图数据

https://gdal.org/drivers/vector/s57.html

S-57 驱动程序模块生成 S-57 中所有 S-57 功能的功能 S-57 文件和相关更新。S-57 (ENC) 文件通常具有 扩展名“.000”。
S-57 读取器依赖于具有两个支持文件, s57objectclasses.csv,s57attributes.csv在运行时可用 以特定于对象类的方式转换特征。这些 应该在环境变量指向的目录中 S57_CSV,或在当前工作目录中。

  • (1)列出OGR所支持的数据信息。
ogrinfo --formats

在这里插入图片描述

  • (2)ogrinfo查看s57的数据中包含的图层
ogrinfo d:\C1100103.000

在这里插入图片描述

  • (3)将s57中的图层转为shp数据
    知道了s57数据中包含的图层,下面就可以使用ogr2ogr工具来将s57中的图层转为shp数据。
ogr2ogr.exe -f "ESRI Shapefile" D:\s57polygon.shp D:\C1100103.000 Area

在这里插入图片描述

注意事项:
在C++程序开始中使用下面的代码即可读取到S57的图层。

CPLSetConfigOption("GDAL_DATA","C:\warmerda\bld\data");

如果使用的ogrinfo的命令行工具,在命令行中加入下面的参数也可以。

--config GDAL_DATA C:\warmerda\bld\data

2.4 代码测试

2.4.1 读取tiff信息

  • pro工程文件设置:
INCLUDEPATH +=$$PWD/gdal244/includeLIBS +=-L$$PWD/gdal244/lib\-lgdal_i
DESTDIR = ../bin
  • 主程序代码文件(main.cpp):
#include "gdal_priv.h"
#include <QDebug>int main(int argc, char *argv[])
{GDALAllRegister();//注册驱动GDALDataset  *poDataset;//请输入你的正确的数据文件路径poDataset = (GDALDataset *) GDALOpen( "D:/earth/osgearth/data/boston-inset-wgs84.tif", GA_ReadOnly );if( poDataset == NULL ){qDebug()<<"poDataset is NULL"<<endl;return 0;}//获取图像宽、高、波段数int width = poDataset->GetRasterXSize();int height = poDataset->GetRasterYSize();int bandCount = poDataset->GetRasterCount();qDebug()<<width<<" "<<height<<" "<<bandCount<<endl;GDALClose(poDataset);//记得关闭数据return 1;
}
  • 运行后结果如下:
    在这里插入图片描述

3、Python

3.1 安装

  • (1)这里尝试直接安装gdal库。
pip install GDAL

在这里插入图片描述
安装失败了。
在这里插入图片描述

  • (2)使用conda安装。
conda install gdal -c conda-forge
  • (3)使用第三方whl文件安装

https://github.com/cgohlke/geospatial-wheels/releases

pip install D:/test/GDAL-3.4.3-cp38-cp38-win_amd64.whl

在这里插入图片描述

3.2 测试

3.2.1 获取版本信息

from osgeo import gdal
ver = gdal.VersionInfo('VERSION_NUM')
print(ver)

在这里插入图片描述

3.2.2 读取TIFF数据

from osgeo import gdal# 开启异常
gdal.UseExceptions()
gdal.AllRegister() # 打开不存在的数据集
ds = gdal.Open("D:/earth/osgearth/data/boston-inset-wgs84.tif")bands = ds.RasterCount # 获取波段数
img_width, img_height = ds.RasterXSize, ds.RasterYSize # 获取影像的宽高
geotrans = ds.GetGeoTransform() # 获取影像的投影信息
proj = ds.GetProjection() # 获取影像的投影信息print("bands", bands)
print("width", img_width)
print("height", img_height)
print("geotrans", geotrans)
print("proj", proj)

在这里插入图片描述

3.2.3 获取shapefile要素

import os
from osgeo import ogrdaShapefile = r"data/100000.shp"
driver = ogr.GetDriverByName('ESRI Shapefile')
dataSource = driver.Open(daShapefile, 0) # 0 只读. 1 读写.# 检查数据源是否有效.
if dataSource is None:print ('不能打开 %s' % (daShapefile))
else:print ('打开 %s' % (daShapefile))layer = dataSource.GetLayer()featureCount = layer.GetFeatureCount()print ("%s 要素个数: %d" % (os.path.basename(daShapefile),featureCount))for i in range(layer.GetFeatureCount()):feature = layer.GetFeature(i)# 获取field信息for j in range(feature.GetFieldCount()):field = feature.GetField(j)print("field", field)# 获取几何信息geometry = feature.GetGeometryRef()print("geometry: ", geometry)# 获取几何类型geometryType = geometry.GetGeometryName()print("geometryType: ", geometryType)

在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零基础入门篇④ 初识Python(注释、编码规范、关键字...)

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏订阅地址 👉Python从…

C语言 | Leetcode C语言题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; int height(struct TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || fabs(leftHeight - rightHeight) > 1) {…

Android硬件渲染环境初始化

Android硬件渲染环境初始化 一.硬件加速渲染的开启1.ThreadedRenderer的初始化2.RenderProxy的创建 二.RenderProxy中组件的初始化1.RenderThread的创建2.CanvasContext的创建3.DrawFrameTask的初始化 三.RenderThread的启动1.RenderThread中组件的初始化2.RenderThread中任务的…

arXiv AI 综述列表(2024.05.20~2024.05.24)

公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 每周末更新&#xff0c;完整版进群获取。 Q 群在群文件&#xff0c;VX 群每周末更新。 目录 1. Beyond Traditional Single Object Tracking: A …

基于yolov2深度学习网络的昆虫检测算法matlab仿真,并输出昆虫数量和大小判决

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 .......................................................... for i 1:12 % 遍历结…

播兔短剧模板:图鸟UI在前端短剧平台中的应用与实践

一、引言 随着移动互联网的快速发展&#xff0c;短剧平台因其短小精悍、内容丰富的特点&#xff0c;逐渐成为用户休闲娱乐的新宠。为了满足短剧平台对前端技术的需求&#xff0c;图鸟播兔短剧模板应运而生。该模板基于图鸟UI进行开发&#xff0c;采用纯前端技术&#xff0c;支…

【C语言回顾】文件操作

前言1. 文件打开模式2. 示例代码2.1 打开和关闭文件2.2 读写文件2.3 二进制文件操作 结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】动态内存管理 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键三连; } 前言 各位小伙伴大家好&…

分享:怎么才能保证大数据查询的准确性?

随着大数据应用到金融风控领域&#xff0c;大数据越来越重要了&#xff0c;很多朋友在查大数据的时候都会遇到一个问题&#xff0c;那就是自己查询的大数据什么信息都没有&#xff0c;要么就是很少&#xff0c;这是什么原因呢?要怎么才能保证大数据查询的准确性呢?下面小编就…

Java进阶学习笔记3——static修饰成员方法

成员方法的分类&#xff1a; 类方法&#xff1a;有static修饰的成员方法&#xff0c;属于类&#xff1a; 成员方法&#xff1a;无static修饰的成员方法&#xff0c;属于对象。 Student类&#xff1a; package cn.ensource.d2_staticmethod;public class Student {double scor…

双拼打字,可以尝试这个练习平台

本文将介绍由本人开发的双拼练习平台打字侠&#xff0c;以及一些对新手学习双拼的建议。课程一共233课&#xff0c;共分为两大部分&#xff1a; 韵母键位&#xff0c;主要练习双拼中韵母对应的键盘键位&#xff0c;同时提供可视化的键盘指法示意图。 实战练习&#xff0c;同时…

Selenium常用命令(python版)

日升时奋斗&#xff0c;日落时自省 目录 1、Selenium 2、常见问题 1、Selenium 安装Python和配置环境没有涉及 注&#xff1a;如有侵权&#xff0c;立即删除 首先安装selenium包&#xff0c;安装方式很简单 pip install selenium 注:我这里已经安装好了&#xff0c;所以…

怎么一键消除路人?教你三个消除方法

怎么一键消除路人&#xff1f;在数字时代&#xff0c;摄影已成为我们记录生活、表达情感的重要方式。然而&#xff0c;完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客&#xff0c;但却足以破坏你精心构图的美好瞬间。…

分割文本文件

分割一个.txt文件&#xff0c;可以选择在命令行中使用split指令&#xff0c;或者编写一段脚本进行操作。以下是一个简单的Python脚本来分割文本文件&#xff1a; def split_file(file, lines):# Open source filewith open(file, r) as source:count 0atEOF Falsewhile not …

shell笔记脚本3

执行脚本文件demo2.sh, 观察打印VAR4效果 执行脚本文件后, 在交互式Shell环境打印VAR4, 观察打印VAR4效果 结论 全局变量在当前Shell环境与子Shell环境中可用, 父Shell环境中不可用 小结 自定义变量的分类 自定义局部变量: 就是在一个脚本文件内部使用 var_namevalue 自…

128天的创意之旅:从初心到成就,我的博客创作纪念日回顾

文章目录 &#x1f680;机缘&#xff1a;初心的种子——回望创作之旅的启航&#x1f308;收获&#xff1a;成长的果实——128天创作之旅的宝贵馈赠❤️日常&#xff1a;创作与生活的交织&#x1f44a;成就&#xff1a;代码的艺术&#x1f6b2;憧憬&#xff1a;未来的蓝图 &…

Mujoco仿真【xml文件的学习 3】

在学习Mujoco仿真的过程中&#xff0c;为了与时俱进&#xff0c;之前的mujoco210版本不再使用&#xff0c;改用了mujoco-3.1.4版本&#xff0c;下面继续mujoco仿真的学习&#xff01; 先前关于mujoco的学习博客汇总如下&#xff1a; 强化学习&#xff1a;MuJoCo机器人强化学习…

2024最新(PC+WEB+IOS+Android)即时通讯系统客户端仿默往IM源码下载

2024最新(PCWEBIOSAndroid)即时通讯系统客户端仿默往IM源码下载(总大小约2.4G&#xff09; 系统功能配置灵活、海量并发、稳定可靠、数据安全&#xff0c;2小时快速部署、数据安全、单聊群聊、系统通知等通信功能&#xff0c;支持App、PC、Web等多端快速接入。 群功能&#xf…

Linux 软件包管理器 yum的下载、功能介绍及使用

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 Linux下的三种软件安装方…

panic对defer语句的执行的影响

1.主线程中的panic会直接导致所有正在运行的go协程无法执行,还会导致声明在它之后的defer语句无法执行。 package mainimport ("fmt""time" )func main() {defer fmt.Println("defer1") //声明在panic之前的defer会执行go func() {defer fmt.Pri…

蓝桥杯Web开发【大赛大纲】15届

一、 组别 Web应用开发分为&#xff1a;大学组和职业院校组。 每位选手只能申请参加其中一个组别的竞赛。各个组别单独评奖。 研究生和本科生只能报大学组。 其它高职高专院校可自行选择报任意组别。 二. 竞赛赛程 省赛时长&#xff1a;4小时。 决赛时长&#xff1a;4小…