麒麟系統開發筆記(十二):在國產麒麟系統上編譯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: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

  在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章