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

前言

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

 

大地坐标简介

概述

  大地坐标(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🇲🇲ss:zzz")

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

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

 

Demo 工程模板 v1.0.0

  在这里插入图片描述