前言

  上一篇使用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

  

Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo的更多相关文章

  1. SDL开发笔记(二):音频基础介绍、使用SDL播放音频

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. Django开发笔记二

    Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...

  3. 在Windows系统中安装集成的PHP开发环境

    原文:在Windows系统中安装集成的PHP开发环境 刚想学php的,又不会配置复杂php的环境,可以使用集成的,目前网上提供常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XA ...

  4. 20155236 《信息安全概论》实验二(Windows系统口令破解)实验报告

    20155236 <信息安全概论>实验二(Windows系统口令破解)实验报告 北京电子科技学院(BESTI) 实验报告 课程:信息安全概论 班级:1552 姓名:范晨歌 学号:20155 ...

  5. Windows系统 为 Visual Studio软件 搭建 OpenCV2 开发环境

    Windows系统 为 Visual Studio软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Visual Studio 软件:Visual Studio 20 ...

  6. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  7. Python3.x(windows系统)安装matplotlib库

    Python3.x(windows系统)安装matplotlib库 cmd命令: pip install matplotlib 执行结果:

  8. Python3.x(windows系统)安装requests库

    Python3.x(windows系统)安装requests库 cmd命令: pip install requests 执行结果:

  9. Python3.x(windows系统)安装libxml2库

    Python3.x(windows系统)安装libxml2库 cmd安装命令: pip install lxml 执行结果: 再执行命令: pip install virtualenv 执行结果:

  10. Windows下USB磁盘开发系列二:枚举系统中所有USB设备

    上篇 <Windows下USB磁盘开发系列一:枚举系统中U盘的盘符>介绍了很简单的获取系统U盘盘符的办法,现在介绍下如何枚举系统中所有USB设备(不光是U盘). 主要调用的API如下: 1 ...

随机推荐

  1. 【必知必会的MySQL知识】③DML语言

    目录 前言 准备 插入数据 语法格式 插入完整行数据 插入多行数据 将检索出来的数据插入表 更新数据 准备两张表 语法 实践操作 删除数据 语法 实践操作 小结 前言 前面的两篇文章中,我们已经对My ...

  2. C++ Primer 5th Edition, Chapter 2, Solutions

    Exercise 2.1 Questions What are the differences between int, long, long long, and short? Between an ...

  3. 用Python语言进行时间序列ARIMA模型分析

    应用时间序列 时间序列分析是一种重要的数据分析方法,应用广泛.以下列举了几个时间序列分析的应用场景: 1.经济预测:时间序列分析可以用来分析经济数据,预测未来经济趋势和走向.例如,利用历史股市数据和经 ...

  4. Java web文件服务器的简单实现

    先分享一个好用的聚合搜索引擎,https://www.tomfind.com/ ,支持谷歌.百度.搜狗.bing.360一键切换,支持网页.音乐.购物.视频搜索.支持抖音.快手.哔哩哔哩.微信.头条. ...

  5. Vue2积分商城项目

    一.清空项目非必要文件和用户片段,路径提示的配置 views 下面的文件只保留 Home.vue ,其余删除,删除 components/HelloWorld.vue,并且 Home.vue 中不再引 ...

  6. 2022-08-14:k8s安装PostgreSQL,yaml如何写?

    2022-08-14:k8s安装PostgreSQL,yaml如何写? 答案2022-08-14: yaml如下: apiVersion: apps/v1 kind: Deployment metad ...

  7. 2021-03-18:给定一个字符串str,只由‘X’和‘.’两种字符构成。‘X’表示墙,不能放灯,也不需要点亮,‘.’表示居民点,可以放灯,需要点亮。如果灯放在i位置,可以让i-1,i和i+1三个位置被点亮。返回如果点亮str中所有需要点亮的位置,至少需要几盏灯。

    2021-03-18:给定一个字符串str,只由'X'和'.'两种字符构成.'X'表示墙,不能放灯,也不需要点亮,'.'表示居民点,可以放灯,需要点亮.如果灯放在i位置,可以让i-1,i和i+1三个位 ...

  8. 批处理bat and 汇编小技巧

    来自远古时期的汇编软件MASM是没有像现在一样的exe程序的(汇编萌新的认知),所以为了快捷,写一些bat来方便操作.([表情包]奇怪的知识增加了)哈哈哈 我现在是MASM的路径是D:\Masm64\ ...

  9. IntelliJ IDEA一站式配置【全】(提高开发效率)

    IDEA常用设置(提高开发效率) 本人也是IDEA编译器的忠实用户了,但是有时出于各种原因,比如更换设备等等,IDEA总是需要重新安装配置.这就让我比较苦恼,因为总是记不全自己之前都修改了哪些地方(原 ...

  10. GitLib详细使用手册(windows系统)

    Git是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. 对gitlab的常见的使用有建立仓库.提交代码.更新代码.回滚代码.显示/修改日志.拉取分支.解决冲突.设置比 ...