【小沐学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=1

nmake -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/include

LIBS +=-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 ogr

daShapefile = 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???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实时通信的方式——WebRTC

文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方&#xff1f; 不同的音视频编解码能力如何沟通&#xff1f;&#xff08;媒体协商SDP&#xff09;如何联系上对方&#xff1f;&#xff08;网络协商&#xff09; 常用的API音视频采集getUserMedia核心对象RTCPeerConne…

对vue3/core源码ref.ts文件API的认识过程

对toRef()API的认识的过程: 最开始认识toRef()是从vue3源码中的ref.ts看见的,右侧GPT已经举了例子 然后根据例子,在控制台输出ref对象是什么样子的: 这就是ref对象了,我们根据对象中有没有__v_isRef来判断是不是一个ref对象,当对象存在且__v_isRef true的时候他就判定为是一个…

5.20Git

版本控制工具Git&#xff0c;其他的工具还有SVN 共享代码&#xff0c;追溯记录&#xff0c;存储.c文件 Git实现的功能&#xff1a;回溯&#xff08;以前某个时间节点的数据情况&#xff09;共享&#xff08;大家共享修改&#xff09; Git&#xff1a;80% SVN&#xff…

webpack编译过程

webpack编译过程 初始化 此阶段&#xff0c;webpack会将**CLI参数**、**配置文件**、**默认配置**进行融合&#xff0c;形成一个最终的配置对象。​ 对配置的处理过程是依托一个第三方库yargs完成的 ​ 此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备 ​…

从 Word 文档中提取图像:docx和 wxPython 的强强联合

在文档处理领域&#xff0c;Word 文档通常包含嵌入的图像&#xff0c;这些图像可以增强视觉吸引力和有效地传达信息。然而&#xff0c;从 Word 文档中提取这些图像可能是一项耗时费力的任务&#xff0c;特别是当您需要处理多个文件时。此时&#xff0c;Python 和 wxPython 就派…

翻译AnyDoor: Zero-shot Object-level Image Customization

摘要 本研究介绍了AnyDoor&#xff0c;这是一款基于扩散模型的图像生成器&#xff0c;能够在用户指定的位置&#xff0c;以期望的形状将目标对象传送到新场景中。与为每个对象调整参数不同&#xff0c;我们的模型仅需训练一次&#xff0c;就能在推理阶段轻松地泛化到多样化的对…

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车&#xff0c;然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例&#xff1a; 3、继续回车&#xff0c;然后会看到以下字眼 Enter…

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用&#xff0c;无需在本地设备上进行存储和处…

html通过数据改变,图片跟着改变

改变前 改变后 通过数据来控制样式展示 <template><div>通过num控制图标是否更改{{num}}<div class"box"><!-- 如果num大于1则是另一种&#xff0c;样式&#xff0c;如果小时1&#xff0c;则是另一种样式 --><div class"item&qu…

python-计算比赛最终成绩

【问题描述】学校举办“爱中华&#xff0c;爱经典”经典古诗词朗诵大赛&#xff0c;一共邀请了n位评委为每一名参赛选手评分&#xff0c;每位评委对某选手的评分从键盘输入&#xff0c;并存入一个列表中&#xff0c;去掉一个最高分&#xff0c;去掉一个最低分后&#xff0c;其余…

OWASP top10--SQL注入(一)

SQL注入式攻击技术&#xff0c;一般针对基于Web平台的应用程序.造成SQL注入攻击漏洞的原因&#xff0c;是由于程序员在编写Web程序时&#xff0c;没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改构造参数&#xff0c;提交SQL查询语句&#xff0c;并传递至服务器端…

深入探索Python基础:两个至关重要的函数

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、初学者的基石&#xff1a;print与input函数 二、类型转换&#xff1a;从字符串到浮点数…

牛客小白月赛94 解题报告 | 珂学家 | 茴字有36种写法

前言 很久没写题解了&#xff0c;有幸参加了94小白月赛内测&#xff0c;反馈是很nice&#xff0c;AK场。 争议的焦点在于哪题最难 D题E题(没有F题)F题(没有E题) 你选哪题呢&#xff1f; 题解 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小苯的九宫格 思路…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

ComfyUI完全入门:图生图局部重绘

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 这篇文章的主题和美女有关&#xff0c;不过并不是教大家生产美女视频&#xff0c;而是讲解 ComfyUI 的图生图局部重绘&#xff0c;其中将会以美女图片为例&#xff0c;来展示局部重绘的强大威力。 先看看效果&…

[机缘参悟-187] - 《道家-水木然人间清醒1》读书笔记 - 真相本质 -10- 关系界限 - 一个人只有放下自我,才能看清世界的真相

目录 一、现实生活中&#xff0c;每个人都是盲人摸象 二、一个人认知的本质是神经网络的模型训练 三、每个人的认知具有局限 四、放下自我&#xff0c;就是跳出自我的认知局限 五、站在上帝的视角&#xff0c;俯瞰不同众生的千差万别的大脑认知系统 六、个体的独特性&…

Linux驱动(2)---Linux内核的组成

1.Linux内核源码目录 arch包含和硬件体系相关结构相关源码&#xff0c;每个平台占用一个目录 block&#xff1a;块设备驱动程序I/O调度 crypto&#xff1a;常用加密和三列算法&#xff0c;还有一些压缩和CRC校验算法。 documentation:内核个部分的通用解释和注释.。 drive…

访存优化实践之一 : CPU、GPU、DDR与访存路径介绍

一、CPU的访存路径 上图是目前主流的CPU架构介绍。可以看到,CPU的访存路径:先经过MMU,然后经过Cache,最后到达DRAM。这其中涉及到的关键内容为基于MMU的内存管理以及缓存机制。 1.1、基于MMU的内存管理 众所周知,在计算机设计之处是没有虚拟地址的概念的,CPU发出的地址即…

cocosCreator动态生成二维码

cocosCreator 版本&#xff1a;3.7.2 开发语言&#xff1a;typeScript 我们在游戏开发中&#xff0c;经常会生成一个专属于玩家个人的二维码&#xff0c;比如说推广、充值等功能。 接到这个任务&#xff0c;在网上找了下&#xff0c;还是有很多教程的。但是这些教程大部分都是用…

【全网最全】2024电工杯数学建模B题53页成品论文+完整matlab代码+完整python代码+数据预处理+可视化结果等(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片链接&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024电工杯数学建模B题53页成品论文完整matlab、py代码19建模过程代码数据等&#xff08;后续会更新&#xff09;「首先来看看目前已有的资…