前言
麒麟系統上做全球北斗定位終端開發,調試工具要做一個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座標系爲參心大地座標系,大地上的一點可用經度L54、緯度M54和大地高H54定位,它是以克拉索夫斯基橢球爲基礎,經局部平差後產生的座標系。
- 長半軸a = 6378245m
- 短半軸b = 6356863.0188m
- 第一偏心率平方e2 = 0.006693421622
- 扁率α =1/298.3
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
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(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類。
- 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版本
(這裏首先使用時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
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
這裏爲了讓庫生成到指定目錄下設置了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的。
(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
(PS:這裏工程基於麒麟系統v1.0.0,升級爲v1.1.0,融合windows平臺Qt5.9.3的mingw32版本)
之前安裝的都是安裝到系統路徑去了,所以此處先引入系統路徑的庫。
至此,成功。
下載地址:https://proj.org
選擇版本6.2.0
下載後拷貝至MSYS2:
cd /home/21497/compile
mkdir proj
cd proj
tar xfv proj-6.2.0.tar.gz
這裏爲了讓庫生成到指定目錄下設置了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 -j4
開始編譯:
這裏,找不到頭文件:
添加頭文件路徑還是報錯,直接強制,然後繼續:
添加了庫路徑也還是報錯,直接強制,然後繼續:
終於編譯過去:
回到“gdal”庫。
要使用管理員權限,不然安裝失敗,無法系統目錄創建:
sudo make install
測試,不需要ldconfig也可以依賴了,至此proj6庫編譯完成。
tar xvf sqlite-autoconf-3420000.tar.gz
這裏爲了讓庫生成到指定目錄下設置了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
然後繼續配置:
配置成功:
這裏編譯會libtool出錯,無解,於是嘗試將sqlite往後退一個版本,就通過了,重新來步驟:
cd sqlite-snapshot-202101271915
./configure --prefix=/home/21497/compile/sqlite3/install
mingw32-make.exe -j4
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)成功了:
下載地址:https://www.freedesktop.org/wiki/Software/pkg-config/
tar xvf pkgconfig-0.6.0.tar.gz
cd pkgconfig-0.6.0/
./configure
換0.29版本:
修改下配置:
./configure –with-internal-glib
出現各種錯誤,無解,後來換mingw32-make配置proj6就沒此錯誤了。
本篇解決問題嘗試較多,最終編譯過去就沒有再去引入模塊了,因爲解決過程耗時長達約三天,試錯msys各種環境,各種開源庫版本,路徑源碼調整,最終才本篇才完成。
如果讀者不強制要求mingw32,建議不要使用mingw32版本的dgal。