当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 没有括号的字符串四则运算
  • android 水平居中对齐并举例
  • wordpress教程视频 wordpress教程网盘 wordpress教程推荐wordpress教程网
  • ERC314协议
  • 3.每日LeetCode-爬楼梯(Go,Java,Python)
  • SpringCloud系列(23)--手写实现负载轮询算法
  • 使用paddlepaddle框架构建ViT用于CIFAR10图像分类
  • 基于Vue2与3版本的Element UI与Element Plus入门
  • 【蓝桥杯选拔赛真题76】python找出元素 第十四届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • LeetCode/NowCoder-链表经典算法OJ练习3
  • 使用elementUI的form表单校验时,错误提示位置异常解决方法
  • Qt学习记录(14)线程
  • pdf打开方式怎么设置默认?分享这几种设置方法
  • Ribbon负载均衡(自己总结的)
  • Wpf 使用 Prism 实战开发Day24
  • 30天自制操作系统-2
  • 5、React组件事件详解
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Consul Config 使用Git做版本控制的实现
  • HashMap ConcurrentHashMap
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • jdbc就是这么简单
  • mysql中InnoDB引擎中页的概念
  • PermissionScope Swift4 兼容问题
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • sublime配置文件
  • Vue学习第二天
  • 爱情 北京女病人
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于HAProxy的高性能缓存服务器nuster
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 小程序开发之路(一)
  • 用Visual Studio开发以太坊智能合约
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Linux权限管理(week1_day5)--技术流ken
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • $(selector).each()和$.each()的区别
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (理论篇)httpmoudle和httphandler一览
  • (转)jdk与jre的区别
  • (转)负载均衡,回话保持,cookie
  • (轉)JSON.stringify 语法实例讲解
  • **PHP二维数组遍历时同时赋值
  • .chm格式文件如何阅读
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET导入Excel数据
  • .NET企业级应用架构设计系列之技术选型
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)