麒麟系統(tǒng)開發(fā)筆記(十二):在國(guó)產(chǎn)麒麟系統(tǒng)上編譯GDAL庫(kù)、搭建基礎(chǔ)開發(fā)環(huán)境和基礎(chǔ)Dem
前言
??麒麟系統(tǒng)上做全球北斗定位終端開發(fā),北斗GPS發(fā)過來的是大地坐標(biāo),應(yīng)用需要的是經(jīng)緯度坐標(biāo),所以需要轉(zhuǎn)換,可以使用公式轉(zhuǎn)換,但是之前涉及到了山He智能一個(gè)項(xiàng)目使用WG。
大地坐標(biāo)簡(jiǎn)介
概述
??大地坐標(biāo)(Geodetic coordinate)是大地測(cè)量中以參考橢球面為基準(zhǔn)面的坐標(biāo),地面點(diǎn)P的位置用大地經(jīng)度L、大地緯度B和大地高H表示。
原理
??當(dāng)點(diǎn)在參考橢球面上時(shí),僅用大地經(jīng)度和大地緯度表示。大地經(jīng)度是通過該點(diǎn)的大地子午面與起始大地子午面(通過格林尼治天文臺(tái)的子午面)之間的夾角。規(guī)定以起始子午面起算,向東由0°至180°稱為東經(jīng);向西由0°至180°稱為西經(jīng)。大地緯度是通過該點(diǎn)的法線與赤道面的夾角,規(guī)定由赤道面起算,由赤道面向北從0°至90°稱為北緯;向南從0°到90°稱為南緯。大地高是地面點(diǎn)沿法線到參考橢球面的距離。
北京54坐標(biāo)系:BJZ54
??北京54坐標(biāo)系(BJZ54)是指北京54坐標(biāo)系為參心大地坐標(biāo)系,大地上的一點(diǎn)可用經(jīng)度L54、緯度M54和大地高H54定位,它是以克拉索夫斯基橢球?yàn)榛A(chǔ),經(jīng)局部平差后產(chǎn)生的坐標(biāo)系。
長(zhǎng)半軸a = 6378245m
短半軸b = 6356863.0188m
第一偏心率平方e2 = 0.006693421622
扁率α =1/298.3
世界大地坐標(biāo)系統(tǒng):WGS-84
??WGS-84坐標(biāo)系是世界大地坐標(biāo)系統(tǒng),其坐標(biāo)原點(diǎn)在地心,采用WGS-84橢球(1984世界大地坐標(biāo)系)。
??WGS-84坐標(biāo)系是美國(guó)國(guó)防部研制確定的大地坐標(biāo)系,是一種協(xié)議地球坐標(biāo)系。
??WGS-84坐標(biāo)系的定義是:原點(diǎn)是地球的質(zhì)心,空間直角坐標(biāo)系的Z軸指向BIH(1984.0)定義的地極(CTP)方向,即國(guó)際協(xié)議原點(diǎn)CIO,它由IAU和IUGG共同推薦。X軸指向BIH定義的零度子午面和CTP赤道的交點(diǎn),Y軸和Z,X軸構(gòu)成右手坐標(biāo)系。
??WGS-84橢球采用國(guó)際大地測(cè)量與地球物理聯(lián)合會(huì)第17屆大會(huì)測(cè)量常數(shù)推薦值,采用的兩個(gè)常用基本幾何參數(shù):
長(zhǎng)半軸a = 6378137m
短半軸b = 6356752.3142m
第一偏心率平方e2 = 0.00669437999013
扁率 α= 1/298.257223563
國(guó)家大地坐標(biāo)系:CGCS2000
??2000國(guó)家大地坐標(biāo)系,是我國(guó)當(dāng)前最新的國(guó)家大地坐標(biāo)系,英文名稱為China Geodetic Coordinate System 2000,英文縮寫為CGCS2000。
??2000國(guó)家大地坐標(biāo)系的原點(diǎn)為包括海洋和大氣的整個(gè)地球的質(zhì)量中心;2000國(guó)家大地坐標(biāo)系的Z軸由原點(diǎn)指向歷元2000.0的地球參考極的方向,該歷元的指向由國(guó)際時(shí)間局給定的歷元為1984.0的初始指向推算,定向的時(shí)間演化保證相對(duì)于地殼不產(chǎn)生殘余的全球旋轉(zhuǎn),X軸由原點(diǎn)指向格林尼治參考子午線與地球赤道面(歷元2000.0)的交點(diǎn),Y軸與Z軸、X軸構(gòu)成右手正交坐標(biāo)系。采用廣義相對(duì)論意義下的尺度。
長(zhǎng)半軸a = 6378137m
短半軸b = 6356752.314m
第一偏心率平方e2 = 0.00669438002290
扁率α = 1/298.257222101
GDAL庫(kù)
概述
??GDAL(Geospatial Data Abstraction Library)是一個(gè)在X/MIT許可協(xié)議下的開源柵格空間數(shù)據(jù)轉(zhuǎn)換庫(kù)。它利用抽象數(shù)據(jù)模型來表達(dá)所支持的各種文件格式。它還有一系列命令行工具來進(jìn)行數(shù)據(jù)轉(zhuǎn)換和處理。 OGR是GDAL項(xiàng)目的一個(gè)分支,提供對(duì)矢量數(shù)據(jù)的支持。 有很多著名的GIS類產(chǎn)品都使用了GDAL/OGR庫(kù),包括ESRI的ARCGIS 9.3,Google Earth和跨平臺(tái)的GRASS GIS系統(tǒng)。利用GDAL/OGR庫(kù),可以使基于Linux的地理空間數(shù)據(jù)管理系統(tǒng)提供對(duì)矢量和柵格文件數(shù)據(jù)的支持。
功能特征
GDAL提供對(duì)多種柵格數(shù)據(jù)的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 等格式。
GDAL使用抽象數(shù)據(jù)模型(abstract data model)來解析它所支持的數(shù)據(jù)格式,抽象數(shù)據(jù)模型包括數(shù)據(jù)集(dataset),坐標(biāo)系統(tǒng),仿射地理坐標(biāo)轉(zhuǎn)換(Affine Geo Transform),大地控制點(diǎn)(GCPs),元數(shù)據(jù)(Metadata),柵格波段(Raster Band),顏色表(Color Table),子數(shù)據(jù)集域(Subdatasets Domain),圖像結(jié)構(gòu)域(Image_Structure Domain),XML域(XML:Domains)。
GDALMajorObject類:帶有元數(shù)據(jù)的對(duì)象。
GDALDdataset類:通常是從一個(gè)柵格文件中提取的相關(guān)聯(lián)的柵格波段集合和這些波段的元數(shù)據(jù);
GDALDdataset也負(fù)責(zé)所有柵格波段的地理坐標(biāo)轉(zhuǎn)換(georeferencing transform)和坐標(biāo)系定義。
GDALDriver類:文件格式驅(qū)動(dòng)類,GDAL會(huì)為每一個(gè)所支持的文件格式創(chuàng)建一個(gè)該類的實(shí)體,來管理該文件格式。
GDALDriverManager類:文件格式驅(qū)動(dòng)管理類,用來管理GDALDriver類。
OGR體系結(jié)構(gòu)
Geometry類:Geometry (包括OGRGeometry等類)封裝了OpenGIS的矢量數(shù)據(jù)模型,并提供了一些幾何操作,WKB(Well Knows Binary)和WKT(Well Known Text)格式之間的相互轉(zhuǎn)換,以及空間參考系統(tǒng)(投影)。
Spatial Reference類:OGRSpatialReference封裝了投影和基準(zhǔn)面的定義。
Feature類:OGRFeature封裝了一個(gè)完整feature的定義,一個(gè)完整的feature包括一個(gè)geometry和geometry的一系列屬性。
Feature Definition類:OGRFeatureDefn里面封裝了feature的屬性,類型、名稱及其默認(rèn)的空間參考系統(tǒng)等。一個(gè)OGRFeatureDefn對(duì)象通常與一個(gè)層(layer)對(duì)應(yīng)。
Layer類:OGRLayer是一個(gè)抽象基類,表示數(shù)據(jù)源類OGRDataSource里面的一層要素(feature)。
Data Source類:OGRDataSource是一個(gè)抽象基類,表示含有OGRLayer對(duì)象的一個(gè)文件或一個(gè)數(shù)據(jù)庫(kù)。
Drivers類:OGRSFDriver對(duì)應(yīng)于每一個(gè)所支持的矢量文件格式。類OGRSFDriver由類OGRSFDriverRegistrar來注冊(cè)和管理。
下載地址
??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
??錯(cuò)誤“configure:error: PROJ 6 symbols not found”,需要編譯PROJ6:
??

??請(qǐng)查看后面的章節(jié)“編譯PROJ6”,編譯完成后,回到此處繼續(xù)配置:
cd gdal-3.2.1
./configure
??配置通過:
??

??Proj6也是yes的。
步驟三:編譯make
make -j4
??開始編譯:
??

??這個(gè)gdal庫(kù)編譯,花費(fèi)了一些時(shí)間。
??

??編譯完成后,繼續(xù)一次make不帶j的,確保都正確編譯通過了。
步驟四:安裝make install
??需要管理員權(quán)限安裝
sudo make install
??

步驟五:新建工程引入基礎(chǔ)
??之前安裝的都是安裝到系統(tǒng)路徑去了,所以此處先引入系統(tǒng)路徑的庫(kù)。
??

??這里會(huì)有個(gè)錯(cuò)誤:
??

??是需要sudo ldconfig的,重新將庫(kù)引入系統(tǒng),再次編譯運(yùn)行如下:
??

??成功打印出版本,這里因?yàn)槭莑inux,還有一些依賴庫(kù),這v1.0.0版本的就是依賴系統(tǒng)include和lib的了(PS:后續(xù)會(huì)再次將庫(kù)封入模塊,但本次不做)。
編譯PROJ6
步驟一:下載解壓
??下載地址:https://proj.org
??選擇版本6.2.0
??下載后拷貝至虛擬機(jī):
cd ~/workl/srctar xfv proj-6.2.0.tar.gz
??

步驟二:配置configure
cd proj-6.2.0/
./configure
??

??配置成功:
??

步驟三:編譯make
make -j4
??開始編譯:
??

??

??編譯完成后,繼續(xù)一次make不帶j的,確保都正確編譯通過了。
步驟四:安裝make install
??要使用管理員權(quán)限,不然安裝失敗,無法系統(tǒng)目錄創(chuàng)建:
sudo make install
??

??測(cè)試,不需要ldconfig也可以依賴了,至此proj6庫(kù)編譯完成。
Demo模塊化
??

Demo源碼
GDALManager.pri
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
HEADERS += \
? ?$$PWD/GDALManager.h
SOURCES += \
? ?$$PWD/GDALManager.cpp
win32 {}else {
? ?DEFINES += LINUX ? ?# GDAL系統(tǒng)安裝的默認(rèn)路徑位/usr/local
? ?# 系統(tǒng)庫(kù),頭文件路徑和庫(kù)文件默認(rèn)已包含
? ?LIBS += -lgdal}win32 {}else {
? ?DEFINES += LINUX ? ?# PROJ系統(tǒng)安裝的默認(rèn)路徑位/usr/local
? ?# 系統(tǒng)庫(kù),頭文件路徑和庫(kù)文件默認(rèn)已包含
? ?LIBS += -lproj}
GDALManager.h
#ifndef GDALMANAGER_H#define GDALMANAGER_H#include <QObject>class GDALManager : public QObject{
? ?Q_OBJECTpublic:
? ?explicit GDALManager(QObject *parent = 0);signals:public:
? ?static void testEnv(); ? ? ? ? ? ? ? ? ? ? // v1.0.0 測(cè)試環(huán)境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){
? ?// 注冊(cè)所有驅(qū)動(dòng)
? ?GDALAllRegister();}void GDALManager::testEnv(){
? ?QString version = QString(GDALVersionInfo("RELEASE_NAME"));
? ?LOG << version;}
Demo工程模板v1.0.0
??
