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

前言

  上一篇使用mingw32版本的gdal,過程曲折,爲更好的更方便搭建環境,在windows上msvc方式對於庫比較友好。

 

大地座標簡介

概述

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

 

關於編譯順序

   因爲首先選擇的是之前vs2019編譯成功的版本,但是本次vs2017x64無解了。
  gdal依賴proj,proj又依賴sqlite,所以本篇先sqlite,再proj,最後gdal。

 

編譯SQLite 3.34.1(windows msvc2017x64版本)

步驟一:下載解壓

步驟二:使用VS2017新建VC++空工程

  在這裏插入圖片描述

  在這裏插入圖片描述

步驟三:添加文件到工程

  在這裏插入圖片描述

  在這裏插入圖片描述

步驟四:添加宏命令

  在這裏插入圖片描述

_USRDLL
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_UNLOCK_NOTIFY

  在這裏插入圖片描述

步驟六:修改sqlite3.def

sqlite3_unlock_nofity

  在這裏插入圖片描述

步驟七:修改目標

  這裏release和debug都要改成配置類型“靜態庫(.lib)”:
  在這裏插入圖片描述

步驟八:編譯成功

  編譯:
  在這裏插入圖片描述

  在這裏插入圖片描述

  在這裏插入圖片描述

  在這裏插入圖片描述

 

編譯PROJ 6.2.0(windows msvc2017x64版本)

步驟一:下載解壓

步驟二:CMake配置,添加sqlite3

  在這裏插入圖片描述

  (注意:配置的時候選擇編譯器就要選擇x64的,不要去vs裏面再建,有些環境變量需要CMake帶進去)
  沒有添加SQLIte,則會報錯:
  在這裏插入圖片描述

  添加:
  在這裏插入圖片描述

  在這裏插入圖片描述

  安裝python到系統,自己下個python3.7.3版本,裝到系統,然後將python的可執行文件添加進系統變量:
  在這裏插入圖片描述

  然後重啓CMake,再繼續:
  在這裏插入圖片描述

  下個對應版本的sqlite3.exe:
  在這裏插入圖片描述
在這裏插入圖片描述

  繼續配置,配置通過:
  在這裏插入圖片描述

步驟三:CMake生成工程

  在這裏插入圖片描述

步驟四:打開編譯(使用vs2017打開)

  在這裏插入圖片描述

  (PS:若是這裏沒有x64,則是需要在CMakeGui的時候配置configure選擇x64,在這裏新建是會要報錯的)

步驟五:編譯成功

  在這裏插入圖片描述

  在這裏插入圖片描述

 

編譯GDAL(windows msvc2017x64版本)

步驟一:下載解壓

  之前做osgearth編譯過Qt5.15的2019x64版本,本次編譯qt5.9.3的2017x64版本。
  在這裏插入圖片描述

步驟二:修改源碼

  修改目錄下的nmake.opt文件,如下:
  第41行的代碼修改爲:
  在這裏插入圖片描述

!IFNDEF MSVC_VER
#MSVC_VER=1800 # VS2013
#MSVC_VER=1900 # VS2015
MSVC_VER=1910 # vs2017
#MSVC_VER=1921 # VS2019
!ENDIF
WIN64=1

步驟三:打開vs2017命令行編譯

  在這裏插入圖片描述

  在這裏插入圖片描述

  找到目錄,並輸入命令:

nmake /f makefile.vc MSVC_VER=1910 WIN64=1 DEBUG=1

  出現錯誤:
  在這裏插入圖片描述

  修改如下(前面鄙夷的時候,請注意proj的prefix_install路徑配置,來看install到哪個位置了):
  在這裏插入圖片描述

  入坑編譯過不去解決:
  在這裏插入圖片描述

  然後繼續編譯:

nmake /f makefile.vc MSVC_VER=1910 WIN64=1 DEBUG=1

步驟四:編譯

nmake /f makefile.vc MSVC_VER=1910 WIN64=1 DEBUG=1

  在這裏插入圖片描述

  這是前面配置proj的時候沒有去掉多shell32和ole32,然後繼續:
  在這裏插入圖片描述

  這是沒有引入sqlite,重新在gdal引入下;
  在這裏插入圖片描述

  然後繼續,終於編譯成功了,問題居多,歷時兩天了,:
  在這裏插入圖片描述

  在這裏插入圖片描述

步驟五:安裝提取

  (這裏debug就是代表調試模式)

nmake /f makefile.vc MSVC_VER=1910 WIN64=1 DEBUG=1 install

  在這裏插入圖片描述

  在這裏插入圖片描述

  還得進行一次devinstall:

nmake /f makefile.vc MSVC_VER=1910 WIN64=1 DEBUG=1 devinstall

  在這裏插入圖片描述

  在這裏插入圖片描述

  在這裏插入圖片描述

  頭文件終於出來了。

步驟六:走一遍非調試模式

  之前以爲DEBUG是編譯過程打印調試信息,現在看來就是生成的庫是不是調試模式了,我們需要release所以再來一遍:

nmake /f makefile.vc MSVC_VER=1910 WIN64=1 
nmake /f makefile.vc MSVC_VER=1910 WIN64=1 install
nmake /f makefile.vc MSVC_VER=1910 WIN64=1 devinstall

  在這裏插入圖片描述

步驟七:調整工程測試

  對pri文件進行windows庫的引入,如下圖:
  在這裏插入圖片描述

 

模塊化

  在這裏插入圖片描述

 

Demo源碼

GDALManager.pri

INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD

HEADERS += \
    $$PWD/GDALManager.h

SOURCES += \
    $$PWD/GDALManager.cpp


win32 {


    # windows Qt5.9.3 msvc2017x64 版本 gdal
    INCLUDEPATH += $$PWD/gdal-3.2.1_msvc2017x64/include
    LIBS += -L$$PWD/gdal-3.2.1_msvc2017x64/lib
    LIBS += -lgdal_i



    # 引入也失敗了,當前不深
#    # windows Qt5.9.3 mingw32 版本 sqlite3
#    INCLUDEPATH += $$PWD/gdal3.2.1_qt593_mingw32/sqlite3/include
#    LIBS += -L$$PWD/gdal3.2.1_qt593_mingw32/sqlite3/lib
#    LIBS += -lsqlite3

#    # windows Qt5.9.3 mingw32 版本 proj6.2.0
#    INCLUDEPATH += $$PWD/gdal3.2.1_qt593_mingw32/proj6.2.0/include
#    LIBS += -L$$PWD/gdal3.2.1_qt593_mingw32/proj6.2.0/lib
#    LIBS += -lproj

#    # windows Qt5.9.3 mingw32 版本 gdal3.2.1
#    INCLUDEPATH += $$PWD/gdal3.2.1_qt593_mingw32/gdal3.2.1/include
#    LIBS += -L$$PWD/gdal3.2.1_qt593_mingw32/gdal3.2.1/lib
#    LIBS += -lgdal
}else {

    DEFINES += LINUX

    # GDAL系統安裝的默認路徑位/usr/local
    # 系統庫,頭文件路徑和庫文件默認已包含
    LIBS += -lgdal
    # 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;
}
 

工程模板v1.1.0

  在這裏插入圖片描述

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