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

2023-07-19 12:02:17

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

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

国产麒麟系统相关开发

上一篇:《麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
下一篇:敬请期待…


前言

  麒麟系统上做全球北斗定位终端开发,北斗GPS发过来的是大地坐标,应用需要的是经纬度坐标,所以需要转换,可以使用公式转换,但是之前涉及到了山He智能一个项目使用WG。


相关博客

  《麒麟系统开发笔记(十二):在国产麒麟系统上编译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版本


编译GDAL

步骤一:下载解压

cd ~/work/src/
tar xvf gdal-3.2.1.tar.gz

  在这里插入图片描述

步骤二:配置configure

cd gdal-3.2.1
./configure

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

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

cd gdal-3.2.1
./configure

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

  Proj6也是yes的。

步骤三:编译make

make -j4

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

  这个gdal库编译,花费了一些时间。
  在这里插入图片描述

  编译完成后,继续一次make不带j的,确保都正确编译通过了。

步骤四:安装make install

  需要管理员权限安装

sudo make install

  在这里插入图片描述

步骤五:新建工程引入基础

  之前安装的都是安装到系统路径去了,所以此处先引入系统路径的库。
  在这里插入图片描述

  这里会有个错误:
  在这里插入图片描述

  是需要sudo ldconfig的,重新将库引入系统,再次编译运行如下:
  在这里插入图片描述

  成功打印出版本,这里因为是linux,还有一些依赖库,这v1.0.0版本的就是依赖系统include和lib的了(PS:后续会再次将库封入模块,但本次不做)。


编译PROJ6

步骤一:下载解压

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

cd ~/workl/src
tar xfv proj-6.2.0.tar.gz

  在这里插入图片描述

步骤二:配置configure

cd proj-6.2.0/
./configure

  在这里插入图片描述

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

步骤三:编译make

make -j4

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

  在这里插入图片描述

  编译完成后,继续一次make不带j的,确保都正确编译通过了。

步骤四:安装make install

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

sudo make install

  在这里插入图片描述

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


Demo模块化

  在这里插入图片描述


Demo源码

GDALManager.pri

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += \
    $$PWD/GDALManager.h

SOURCES += \
    $$PWD/GDALManager.cpp


win32 {

}else {
    DEFINES += LINUX
    # GDAL系统安装的默认路径位/usr/local
    # 系统库,头文件路径和库文件默认已包含
    LIBS += -lgdal
}

win32 {

}else {
    DEFINES += LINUX
    # PROJ系统安装的默认路径位/usr/local
    # 系统库,头文件路径和库文件默认已包含
    LIBS += -lproj
}

GDALManager.h

#ifndef GDALMANAGER_H
#define GDALMANAGER_H

#include <QObject>

class GDALManager : public QObject
{
    Q_OBJECT
public:
    explicit GDALManager(QObject *parent = 0);

signals:

public:
    static void testEnv();                     // v1.0.0 测试环境

private:
};

#endif // GDALMANAGER_H

GDALManager.cpp

#include "GDALManager.h"

#include "gdal.h"

#include <QDebug>
#include <QDateTime>
//#define LOG qDebug()<<__FILE__<<__LINE__
//#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__
//#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()
//#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")
#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")

GDALManager::GDALManager(QObject *parent)
    : QObject(parent)
{
    // 注册所有驱动
    GDALAllRegister();
}

void GDALManager::testEnv()
{
    QString version = QString(GDALVersionInfo("RELEASE_NAME"));
    LOG << version;
}

Demo工程模板v1.0.0

  在这里插入图片描述


上一篇:《麒麟系统开发笔记(十一):在国产麒麟系统上使用gdb定位崩溃异常方法流程进阶定位代码行数及专项测试Demo
下一篇:敬请期待…


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

更多推荐

Docker下如何实现Docker Compose?

Docker下如何实现DockerCompose?背景介绍DockerComposeDockerCompose的实现细节docker-compose.ymlDockerCompose的操作和命令DockerCompose在应用开发中的应用背景介绍在云原生时代,容器化技术成为现代应用开发和部署的主流选择。Docker作为

【腾讯云 Cloud Studio 实战训练营】通过云IDE构建Web3项目

文章目录背景一、前言二、CloudStudio主要功能三、CloudStudio实验前期准备3.1.注册平台四、构建Web3项目项目中技术栈五、其他功能演示六、常见问题及注意事项七、总结八、相关链接​CloudStudio是基于浏览器的集成式开发环境(IDE),为开发者提供了一个永不间断的云端工作站。用户在使用Clou

CISSP一次通过指南(文末附福利)

CISSP相关资料(考试机构的复习题、中英文教材,思维导图),点击文章末尾卡片,扫描二维码加我耗油免费领取资料哦,👇CISSP英文全称:“CertifiedInformationSystemsSecurityProfessional”,中文全称:“(ISC)²注册信息系统安全专家”,由(ISC)²组织和管理,是目前全

鉴源实验室 | 系统逻辑漏洞挖掘实践

作者|林海文上海控安可信软件创新研究院汽车网络安全组来源|鉴源实验室社群|添加微信号“TICPShanghai”加入“上海控安51fusa安全社区”01前言当谈及安全测试时,逻辑漏洞挖掘一直是一个备受关注的话题,它与传统的安全漏洞(如SQL注入、XSS、CSRF)不同,无法通过WAF、杀软等安全系统的简单扫描来检测和解

ECMAScript 6 入门 - 字符串的新增方法

1.String.fromCodePoint()ES5提供String.fromCharCode()方法,用于从Unicode码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符。String.fromCharCode(0x20BB7)//"ஷ"上面代码中,String.fromCharCode()不能识别

什么是虚拟DOM(Virtual DOM)?它在前端框架中的作用是什么?

聚沙成塔·每天进步一点点⭐专栏简介⭐什么是虚拟DOM(VirtualDOM)?⭐虚拟DOM在前端框架中的作用⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的

【C语言】指针的进阶(三)—— 模拟实现qsort函数以及指针和数组的笔试题解析

目录1、模拟实现qsort函数1.1、qsort函数的回顾1.2、模拟实现qsort函数2、指针和数组笔试题解析2.1、一维数组2.2、字符数组1、模拟实现qsort函数1.1、qsort函数的回顾要模拟实现qsort函数,就要了解清楚qsort函数的参数以及使用方式。我们先回顾一下qsort函数:qsort是一个库函

Go 基础语法 轻松上手 goland~

一个GO代码,hello,world说到学习语言,那必然少不了我们的helloworld了,先来看个简单的helloworld代码packagemainimport"fmt"funcmain(){fmt.Println("hello,world")}第一行代码packagemain定义了包名。你必须在源文件中非注释的第

《定位》杂志专访丨中南大学杨泽发:InSAR是大范围矿山边坡监测利器

杨泽发中南大学地球科学与信息物理学院教授近日,为有效防范遏制矿山重特大事故发生,国家矿山安全监察局发布了《关于开展露天矿山边坡监测系统建设及联网工作的通知》,对矿山边坡监测建设作了“硬性规定”(点击蓝字详细了解),其中明确指出推荐使用InSAR技术对矿山边坡进行监测。那么,InSAR技术是什么?有何优势?未来趋势是什么

【Linux】文件缓冲区

目录一、dup2二、引入三、C语言FILE中的缓冲区3.1缓冲区的作用3.2缓冲区的刷新机制3.3对引入代码现象的解释3.4模拟实现C语言中的FILE四、文件系统中的缓冲区4.1fsync在本期内容正式开始之前,我们先介绍一个上期遗漏的知识点:一、dup2我们如果要想用代码实现重定向,先要关闭对应的标准流文件,再使用o

碎片笔记 | 大模型攻防简报

前言:与传统的AI攻防(后门攻击、对抗样本、投毒攻击等)不同,如今的大模型攻防涉及以下多个方面的内容:目录一、大模型的可信问题1.1虚假内容生成1.2隐私泄露二、大模型的安全问题2.1模型窃取攻击2.2数据窃取攻击2.3Prompt提示词攻击2.4对抗样本攻击2.5后门攻击2.6数据投毒三、基于大模型的隐蔽通信四、大模

热文推荐