Qt+GDAL开发笔记(一):在windows系统mingw32编译GDAL库、搭建开发环境和基础Demo

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131931309

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:三方库开发技术

上一篇:没有了
下一篇:敬请期待…


前言

  麒麟系统上做全球北斗定位终端开发,调试工具要做一个windows版本方便校对,北斗GPS发过来的是大地坐标,应用需要的是经纬度坐标,所以需要转换,可以使用公式转换,但是之前涉及到了山He智能一个项目使用WG,最终选择了GDAL库进行转换。

注意

  如果读者不强制要求mingw32,建议不要使用mingw32版本的dgal。编译过程非常曲折。


相关博客

  《麒麟系统开发笔记(十二):在国产麒麟系统上编译GDAL库、搭建基础开发环境和基础Demo》
  《Qt+GDAL开发笔记(一):在windows系统mingw32编译GDAL库、搭建开发环境和基础Demo》


大地坐标简介

概述

  大地坐标(Geodetic coordinate)是大地测量中以参考椭球面为基准面的坐标,地面点P的位置用大地经度L、大地纬度B和大地高H表示。

原理

  当点在参考椭球面上时,仅用大地经度和大地纬度表示。大地经度是通过该点的大地子午面与起始大地子午面(通过格林尼治天文台的子午面)之间的夹角。规定以起始子午面起算,向东由0°至180°称为东经;向西由0°至180°称为西经。大地纬度是通过该点的法线与赤道面的夹角,规定由赤道面起算,由赤道面向北从0°至90°称为北纬;向南从0°到90°称为南纬。大地高是地面点沿法线到参考椭球面的距离。

北京54坐标系:BJZ54

  北京54坐标系(BJZ54)是指北京54坐标系为参心大地坐标系,大地上的一点可用经度L54、纬度M54和大地高H54定位,它是以克拉索夫斯基椭球为基础,经局部平差后产生的坐标系。

  • 长半轴a = 6378245m
  • 短半轴b = 6356863.0188m
  • 第一偏心率平方e2 = 0.006693421622
  • 扁率α =1/298.3

世界大地坐标系统:WGS-84

  WGS-84坐标系是世界大地坐标系统,其坐标原点在地心,采用WGS-84椭球(1984世界大地坐标系)。
  WGS-84坐标系是美国国防部研制确定的大地坐标系,是一种协议地球坐标系。
  WGS-84坐标系的定义是:原点是地球的质心,空间直角坐标系的Z轴指向BIH(1984.0)定义的地极(CTP)方向,即国际协议原点CIO,它由IAU和IUGG共同推荐。X轴指向BIH定义的零度子午面和CTP赤道的交点,Y轴和Z,X轴构成右手坐标系。
  WGS-84椭球采用国际大地测量与地球物理联合会第17届大会测量常数推荐值,采用的两个常用基本几何参数:

  • 长半轴a = 6378137m
  • 短半轴b = 6356752.3142m
  • 第一偏心率平方e2 = 0.00669437999013
  • 扁率 α= 1/298.257223563

国家大地坐标系:CGCS2000

  2000国家大地坐标系,是我国当前最新的国家大地坐标系,英文名称为China Geodetic Coordinate System 2000,英文缩写为CGCS2000。
  2000国家大地坐标系的原点为包括海洋和大气的整个地球的质量中心;2000国家大地坐标系的Z轴由原点指向历元2000.0的地球参考极的方向,该历元的指向由国际时间局给定的历元为1984.0的初始指向推算,定向的时间演化保证相对于地壳不产生残余的全球旋转,X轴由原点指向格林尼治参考子午线与地球赤道面(历元2000.0)的交点,Y轴与Z轴、X轴构成右手正交坐标系。采用广义相对论意义下的尺度。

  • 长半轴a = 6378137m
  • 短半轴b = 6356752.314m
  • 第一偏心率平方e2 = 0.00669438002290
  • 扁率α = 1/298.257222101

GDAL库

概述

  GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。 OGR是GDAL项目的一个分支,提供对矢量数据的支持。 有很多著名的GIS类产品都使用了GDAL/OGR库,包括ESRI的ARCGIS 9.3,Google Earth和跨平台的GRASS GIS系统。利用GDAL/OGR库,可以使基于Linux的地理空间数据管理系统提供对矢量和栅格文件数据的支持。

功能特征

  • GDAL提供对多种栅格数据的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。
  • GDAL使用抽象数据模型(abstract data model)来解析它所支持的数据格式,抽象数据模型包括数据集(dataset),坐标系统,仿射地理坐标转换(Affine Geo Transform),大地控制点(GCPs),元数据(Metadata),栅格波段(Raster Band),颜色表(Color Table),子数据集域(Subdatasets Domain),图像结构域(Image_Structure Domain),XML域(XML:Domains)。
  • GDALMajorObject类:带有元数据的对象。
  • GDALDdataset类:通常是从一个栅格文件中提取的相关联的栅格波段集合和这些波段的元数据;
  • GDALDdataset也负责所有栅格波段的地理坐标转换(georeferencing transform)和坐标系定义。
  • GDALDriver类:文件格式驱动类,GDAL会为每一个所支持的文件格式创建一个该类的实体,来管理该文件格式。
  • GDALDriverManager类:文件格式驱动管理类,用来管理GDALDriver类。

OGR体系结构

  • Geometry类:Geometry (包括OGRGeometry等类)封装了OpenGIS的矢量数据模型,并提供了一些几何操作,WKB(Well Knows Binary)和WKT(Well Known Text)格式之间的相互转换,以及空间参考系统(投影)。
  • Spatial Reference类:OGRSpatialReference封装了投影和基准面的定义。
  • Feature类:OGRFeature封装了一个完整feature的定义,一个完整的feature包括一个geometry和geometry的一系列属性。
  • Feature Definition类:OGRFeatureDefn里面封装了feature的属性,类型、名称及其默认的空间参考系统等。一个OGRFeatureDefn对象通常与一个层(layer)对应。
  • Layer类:OGRLayer是一个抽象基类,表示数据源类OGRDataSource里面的一层要素(feature)。
  • Data Source类:OGRDataSource是一个抽象基类,表示含有OGRLayer对象的一个文件或一个数据库。
  • Drivers类:OGRSFDriver对应于每一个所支持的矢量文件格式。类OGRSFDriver由类OGRSFDriverRegistrar来注册和管理。

下载地址

  Home:https://gdal.org/download.html
 选择3.2.1版本


准备MSYS2编译环境

  (这里首先使用时mysy1.0,会遇到系统枚举未知,于是换msys2)。
  (这里msys2又踩坑几天,依赖库互相依赖glibc,libtool,pkg-config等各种问题,互相绕来绕去,好不容易能编译最后还识别不出系统标识,还在坚持,所以又换了下msys642,重新做一遍,去掉所有路径,直接安装入msys642,确认通过后再开始使用路径prefix来配置再编译安装提取库文件)
  这个是windows上方正linux编译库的环境。
  自行下载,解压即可:
  在这里插入图片描述

  点击“msys2.bat”启动即可:
  在这里插入图片描述

  这里我们需要使用Qt5.9.3的mingw32开发,所以要把Qt的mingw32编译器copy到这个根目录下,这样在则合格msys环境里就可以引入了:
  在这里插入图片描述

  然后:
  在这里插入图片描述

  路径引入下:

export PATH=$PATH:/mingw530_32/bin

  在这里插入图片描述


编译GDAL

步骤一:下载解压

export PATH=$PATH:/mingw530_32/bin
cd /home/21497/compile
mkdir gdal

  在这里插入图片描述

  然后将gdal的包copy到msys的主目录下去:
  在这里插入图片描述

cd gdal
tar xvf gdal-3.2.1.tar.gz
ls -l

  在这里插入图片描述

步骤二:配置configure

  这里为了让库生成到指定目录下设置了prefix参数:

cd /home/21497/compile/gdal/gdal-3.2.1
./configure --prefix=/home/21497/compile/gdal/install
./configure --prefix=/home/21497/compile/gdal/install --without-libtool

  在这里插入图片描述

  错误“configure:error: PROJ 6 symbols not found”,需要编译PROJ6:
  在这里插入图片描述

  请查看后面的章节“编译PROJ6”,编译完成后,回到此处继续配置:

cd gdal-3.2.1
./configure

  还是报错,但是可以知道已经是有头文件和库文件了,然后开始强制:
  在这里插入图片描述

  在这里插入图片描述

  还是找不到头文件,再来个绝的:
  在这里插入图片描述

  还不行,直接给他注释掉:
  在这里插入图片描述

  直接强制注释掉看了,强制放开定义HAVA_PROJ_H(每个文件夹都放了,还强制屏蔽了测试,就不行过不去,源码大法最终结果:
  在这里插入图片描述

  配置通过:
  在这里插入图片描述

  Proj6也是yes的。

步骤三:编译mak

  (PS:这个库,mingw32-make就出错或者异常,make就可以过,基本前者过不去就使用make了都,反正编译出来时纯gcc的,gcc又是引入到了Qt5.9.3的mingw32的gcc了)

make -j4

  开始编译,这个gdal库编译,花费了一些时间,出错:
  在这里插入图片描述

  这个msys642对于头文件确实是有些问题的,还是老办法,所有头问价你直接copy到这个“geo_keyp.h”文件夹,这样理论上可以:
  在这里插入图片描述

  编译,确实过了(PS:为什么msys642他不自己加载头文件路径,额外加的环境变量他也不行,不细究了),继续编译:

make

  在这里插入图片描述

  编译完成后:
  在这里插入图片描述

  继续一次make不带j的,确保都正确编译通过了:
  在这里插入图片描述

  在这里插入图片描述

步骤四:安装make install

  安装

make install

  在这里插入图片描述

  在这里插入图片描述

步骤五:工程引入本次编译的库

  (PS:这里工程基于麒麟系统v1.0.0,升级为v1.1.0,融合windows平台Qt5.9.3的mingw32版本)
  之前安装的都是安装到系统路径去了,所以此处先引入系统路径的库。
  在这里插入图片描述

  至此,成功。


编译PROJ6

步骤一:下载解压

  下载地址:https://proj.org
  选择版本6.2.0
  下载后拷贝至MSYS2:

cd /home/21497/compile
mkdir proj
cd proj

  

tar xfv proj-6.2.0.tar.gz

  

步骤二:配置configure

  这里为了让库生成到指定目录下设置了prefix参数:

cd /home/21497/compile/proj/proj-6.2.0/
./configure --prefix=/home/21497/compile/proj/install
./configure --without-libtool

  
  配置错误“SQLITE3”,如下图:
  
  请查看后面的章节“编译SQLITE3”,编译完成后,回到此处继续配置:

cd /home/21497/compile/proj/proj-6.2.0/

  此时编译还是出现错误该错误,报错可能是pkgconfig的问题,安装“编译pkgconfig”,换mingw642解决了,继续:
  

步骤三:编译make

make -j4

  开始编译:
  在这里插入图片描述

  在这里插入图片描述

  这里,找不到头文件:
  在这里插入图片描述

  添加头文件路径还是报错,直接强制,然后继续:
  在这里插入图片描述

  在这里插入图片描述

  添加了库路径也还是报错,直接强制,然后继续:
  在这里插入图片描述

  终于编译过去:
  在这里插入图片描述

  在这里插入图片描述

  回到“gdal”库。

步骤四:安装make install

  要使用管理员权限,不然安装失败,无法系统目录创建:

sudo make install

  测试,不需要ldconfig也可以依赖了,至此proj6库编译完成。


编译SQLITE3

步骤一:下载解压

  https://www.sqlite.org/download.html
  在这里插入图片描述

  在这里插入图片描述

tar xvf sqlite-autoconf-3420000.tar.gz

  在这里插入图片描述

步骤二:配置configure

  这里为了让库生成到指定目录下设置了prefix参数:

cd /home/21497/compile/sqlite3/sqlite-autoconf-3420000
./configure --prefix=/home/21497/compile/sqlite3/install

  在这里插入图片描述

  配置错误:
  在这里插入图片描述

  (PS:凡事不要慌,慢慢的睁开眼睛一行行看error)
  修改配置:

./configure --prefix=/home/21497/compile/sqlite3/install --disable-dependency-tracking

  然后继续配置:
  在这里插入图片描述

  配置成功:
  在这里插入图片描述

步骤三:编译make

  在这里插入图片描述

  这里编译会libtool出错,无解,于是尝试将sqlite往后退一个版本,就通过了,重新来步骤:
  在这里插入图片描述

cd sqlite-snapshot-202101271915
./configure --prefix=/home/21497/compile/sqlite3/install
mingw32-make.exe -j4

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

步骤四:安装make install

mingw32-make install

  失败了,如下图:
  在这里插入图片描述

  因为make不一样,所以直接修改下Makefile:
  在这里插入图片描述

  就可以过去了:
  在这里插入图片描述

步骤五:检查编译成功

  在这里插入图片描述

  以上是为了提取路径,依赖它的库编译发现有问题:
  在这里插入图片描述

  为了一刀切,直接重新配置不带路径再来一次,部署到msys中:

cd /home/21497/compile/sqlite3/sqlite-snapshot-202101271915/
./configure
mingw32-make.exe
mingw32-make install

  (install记得修改Makefile的CC为mingw32-make)
  在这里插入图片描述

  换msys642和3.42,使用make(不使用mingw32-make)成功了:
  在这里插入图片描述
  在这里插入图片描述
  在这里插入图片描述


编译pkgconfig(废弃,但是保留步骤)

步骤一:下载解压

  下载地址:https://www.freedesktop.org/wiki/Software/pkg-config/
  在这里插入图片描述

tar xvf pkgconfig-0.6.0.tar.gz

  在这里插入图片描述

步骤二:配置configure

cd pkgconfig-0.6.0/
./configure

  在这里插入图片描述

  在这里插入图片描述

  换0.29版本:
  在这里插入图片描述

  修改下配置:

./configure –with-internal-glib

  出现各种错误,无解,后来换mingw32-make配置proj6就没此错误了。


结尾

  本篇解决问题尝试较多,最终编译过去就没有再去引入模块了,因为解决过程耗时长达约三天,试错msys各种环境,各种开源库版本,路径源码调整,最终才本篇才完成。
  如果读者不强制要求mingw32,建议不要使用mingw32版本的dgal。


上一篇:没有了
下一篇:敬请期待…


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131931309

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

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

相关文章

驱动开发 day3 (模块化驱动启动led,蜂鸣器,风扇,震动马达)

模块化驱动启动led,蜂鸣器,风扇,震动马达并加上Makefile 封装模块化驱动,可自由安装卸载驱动,便于驱动更新(附图) 1.安装模块驱动同时初始化各个设备并使能 2.该驱动会自动创建驱动节点. 3.通过c函数程序输入控制各个设备 4.卸载模块驱动 //编译驱动…

K8s卷存储详解(一)

K8s卷存储详解(一) K8s 存储K8s卷分类K8s目前支持的卷类型 临时卷类型EmptyDirCSI 临时卷通用临时卷 K8s 存储 什么是卷?为什么要用卷? 我们知道K8s是基于容器,对各个Pod进行管理的。Pod是由容器构成的,我…

开发中遇到的 cookie 问题

1. cookie 无法跨域携带问题 尽管已经登录,但是请求接口返回状态码:202,msg: 未登录,如下图所示; 1.1 XMLHttpRequest.withCredentials未设置 如果需要跨域 AJAX 请求发送 Cookie,需要withCre…

使用wxPython和pillow开发拼图小游戏(四)

上一篇介绍了使用本地图片来初始化游戏的方法,通过前边三篇,该小游戏的主要内容差不多介绍完了,最后这一篇来介绍下游戏用时的计算、重置游戏和关闭窗口事件处理 游戏用时的计算 对于游戏用时的记录,看过前几篇的小伙伴可能也发现…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块3

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Springboot初识(二)

文章目录 前言一.Spring配置文件1.1 配置文件的作用1.2 配置文件的类型 二.properties配置⽂件说明2.1 基本语法2.2 读取配置文件 三.yml 配置⽂件说明2.1 基本语法2.2 读取配置文件2.3 注意事项 前言 上篇文章我们介绍了什么是SpringBoot和怎么去创建一个SpringBoot项目,现在…

13.5.3 【Linux】PAM 模块设置语法

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后,这支程序调用 PAM 的流程是: 1. 使用者开始执行 /usr/bin/passwd 这支程序,并输入密码&#xf…

基于Java+SpringBoot+vue前后端分离在线商城系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

spring 存储对象 + 获取对象

前言 本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步! 文章目录 前言1.通过注释将类加入IoC…

【云计算小知识】云环境是什么意思?有什么优点?

随着云计算的快速发展,了解云计算相关知识也是运维人员必备的。那你知道云环境是什么意思?有什么优点?云环境安全威胁有哪些?如何保证云环境的运维安全?这里我们就来简单聊聊。 云环境是什么意思? 云环境是…

SpringBoot中配置文件的加载

springboot 启动会扫描一下位置的application.properties或者application.yml文件作为springboot的默认配置文件 file:./config/(项目根目录config文件夹下的配置文件) file:./(项目根目录下的配置文件) classpath:/config/(resources目录config文件下的配置文件) classpat…

如何在3ds max中创建可用于真人场景的巨型机器人:第 2 部分

推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建主体 步骤 1 打开 3ds Max。选择机器人头部后,二次单击鼠标并选择隐藏未选中。机器人的其他部分 除了头部之外,将被隐藏。 打开 3ds Max 步骤 2 在人脸选择模式下&#x…

C++类与对象 - 2(构造函数和析构函数)(超详细)

构造函数和析构函数 - 超详细讲解 1. 构造函数1.1 概念1.2特性 2. 析构函数2.1 概念2.2特性 1. 构造函数 1.1 概念 对于以下Date类&#xff1a; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout <&l…

C语言float类型学习

C语言的小数类型有两种&#xff0c;float和double&#xff1b; float 称为单精度浮点型&#xff0c;double 称为双精度浮点型&#xff1b; float 占用4个字节&#xff0c;double 占用8个字节&#xff1b; 下面看一下float&#xff1b; #include <stdio.h>int main() {…

电脑记事本在哪里?电脑桌面显示记事本要怎么设置?

绝大多数上班族在使用电脑办公时&#xff0c;都需要随手记录一些琐碎或重要的事情&#xff0c;例如工作注意事项、常用的文案、某项工作的具体要求、多个平台的账号和密码等。于是就有不少小伙伴想要使用电脑记事本软件来记录&#xff0c;那么电脑记事本在哪里呢&#xff1f;想…

JAVA基础-集合的工具类Collections

目录 引言 一&#xff0c;Collections工具类的操作方法方法 1&#xff0c;排序操作 2&#xff0c;替换 和 查找操作 二&#xff0c;Collections工具类的使用 2.1&#xff0c;排序操作 2.1.1&#xff0c;集合的逆序 2.1.2&#xff0c;集合的随机排序 2.1.3&#xff0c;集…

SkyWalking链路追踪中Trace概念以及Trace与span的关系

基本概念 在SkyWalking链路追踪中&#xff0c;Trace&#xff08;追踪&#xff09;是指一个请求或者一个操作从开始到结束的完整路径。它涵盖了分布式系统中所有相关组件的调用关系和性能信息。 具体来说&#xff0c;Trace包含了一系列的span&#xff08;跨度&#xff09;&…

【C#】.Net Framework框架使用JWT

2023年&#xff0c;第31周&#xff0c;第2篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 本篇文章主要简单讲讲&#xff0c;.Net Framework框架下使用JWT的代码例子&#xff0c;以及他们的基本概念。 2002年微软发布了.net framewo…

GFLv2 论文学习

1. 解决了什么问题&#xff1f; 预测定位质量对于目标检测很重要&#xff0c;在 NMS 时它能提供准确的得分排序&#xff0c;提高模型的表现。现有方法都是通过分类或回归的卷积特征来预测定位质量得分。 2. 提出了什么方法&#xff1f; 受到 GFLv1 的 general distribution …

前端开发实习总结参考范文(合集)

▼前端开发实习总结篇一 今天就简单聊聊上面的StrutsSpringHibernate吧。 Struts 代表&#xff1a;表示层;Spring代表&#xff1a;业务逻辑层;Hibernate则代表持久层。他们是目前在Java Web编程开发中用得最多的框架&#xff0c;其实这样区分是为了适应软件开发过程中各个分工…