Qt+GDAL開發筆記(一):在windows系統mingw32編譯GDAL庫、搭建開發環境和基礎Demo

前言

  麒麟系統上做全球北斗定位終端開發,調試工具要做一個windows版本方便校對,北斗GPS發過來的是大地座標,應用需要的是經緯度座標,所以需要轉換,可以使用公式轉換,但是之前涉及到了另一個shang市公司項目使用WG,最終選擇了GDAL庫進行轉換。

注意

  如果讀者不強制要求mingw32,建議不要使用mingw32版本的dgal。編譯過程非常曲折。

 

大地座標簡介

概述

  大地座標(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

步驟一:下載解壓

  在這裏插入圖片描述

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。

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