【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)

2024-03-14 23:40

本文主要是介绍【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🍺三维数字地球系列相关文章如下🍺:
1【小沐学GIS】基于C++绘制三维数字地球Earth(456:OpenGL、glfw、glut)第一期
2【小沐学GIS】基于C++绘制三维数字地球Earth(456:OpenGL、glfw、glut)第二期
3【小沐学GIS】基于C++OpenSceneGraph(OSG)绘制三维数字地球Earth(7:OpenGL)
4【小沐学GIS】基于C++QT绘制三维数字地球Earth(8:OpenGL)
5【小沐学GIS】基于C++绘制太阳系SolarSystem(9:OpenGL、glfw、glut)
6【小沐学GIS】基于C#绘制三维数字地球Earth(10:OpenGL)
7【小沐学GIS】基于Python绘制三维数字地球Earth(11:OpenGL)
8【小沐学GIS】基于Android绘制三维数字地球Earth(12:OpenGL)
9【小沐学GIS】基于WebGL绘制三维数字地球Earth(13:OpenGL)

文章目录

  • 1、简介
    • 1.1 Qt简介
    • 1.2 Qt的pro文件的32位或64位
    • 1.3 OpenGL添加glu库
    • 1.4 OpenGL添加glut库
  • 2、在线地图访问地址
  • 5、代码测试(3d瓦片地图)
    • 5.3 opengl / qt5 / c++ / 影像地图 (3d,瓦片贴图)
  • 6、代码测试(2d瓦片地图)
    • 6.5 opengl / qt5 / glm / cpprest / c++ / 必应地图 (2d,瓦片贴图)
    • 6.6 qt5 / c++ / 谷歌地图 (2d,瓦片贴图)
  • 8、代码测试(整体地球)
    • 8.1 QtOpenGL / qt5 / c++ / 地球/飞线(3d)
    • 8.2 QtOpenGL / qt5 / c++ / 浮动小地球(3d)
    • 8.3 QtOpenGL / qt5 / c++ / imgui / 视角切换(3d)
    • 8.4 QOpenGLWidget / qt5 / c++ / QImage / 云层白天夜晚(3d)
    • 8.5 QOpenGLFunctions / qt5 / c++ / QImage(3d)
  • 结语

1、简介

1.1 Qt简介

https://www.qt.io/zh-cn/
Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C++ 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,当然也可以开发不带界面的命令行(Command User Interface,CUI)程序。
在这里插入图片描述

Qt 经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部;Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多其它功能,比如多线程、访问数据库、图像处理、音频视频处理、网络通信、文件操作等,这些 Qt 都已经内置了。
在这里插入图片描述

  • 在线安装地址:
    https://www.qt.io/download-open-source
    https://download.qt.io/official_releases/online_installers/
  1. 所有Qt版本下载地址:
    http://download.qt.io/archive/qt/

  2. 所有Qt Creator下载地址:
    http://download.qt.io/archive/qtcreator/

  3. 所有Qt VS开发插件下载地址:
    http://download.qt.io/archive/vsaddin/

  4. Qt相关下载大全
    http://download.qt.io/

在这里插入图片描述

1.2 Qt的pro文件的32位或64位

Qt的pro文件里如何判断系统是32位或64位。

  • 方法1
Since Qt5 you can use QT_ARCH  to detect whether your configuration is 32 or 64. When the target is 32-bit, that returns i386  and in case of a 64-bit target it has the value of x86_64. So it can be used like:contains(QT_ARCH, i386) {message("32-bit")} else {message("64-bit")}
  • 方法2
win32 {## Windows common build here!contains(QMAKE_HOST.arch, x86_64) {message("x86 build")## Windows x86 (32bit) specific build here} else {message("x86_64 build")## Windows x64 (64bit) specific build here}
}
  • 方法3
Qt allows you to pass arbitrary config parameters which you can use to separate the targets.By having a conditional config in your project file:
CONFIG(myX64, myX64|myX32) {LIBPATH += C:\Coding\MSSDK60A\Lib\x64
} else {LIBPATH += C:\Coding\MSSDK60A\Lib
}
and passing that custom config to qmake with
qmake CONFIG+=myX64
  • 方法4
The following code works on Windows (at least with all the recent MSVC compilers - didn't test MinGW), Mac OS X (clang) and Linux (GCC). Feel free to omit the first clause and refer to QT_ARCH  directly if you don't need Qt 4 support.#Firstly,Set TARGET_ARCH variable.
greaterThan(QT_MAJOR_VERSION, 4) {TARGET_ARCH=$${QT_ARCH}
} else {TARGET_ARCH=$${QMAKE_HOST.arch}
}
#Secondly, use TARGET_ARCH to check.
contains(TARGET_ARCH, x86_64) {ARCHITECTURE = x64
} else {ARCHITECTURE = x86
}

1.3 OpenGL添加glu库

QT creator中使用openGL的步骤:
windows中都已经自带了openGL库文件以及glu的库文件,可以直接使用。

opengl32.lib和opengl32.dll是微软为了使openGL能在windows上运行所做的动态库,glu是个扩展库。有openGL库的地方,基本上就同时存在glu库。
为了在QT中使用openGL库,需要在.pro文件中添加这个库:

LIBS += -lopengl32 -lglu32

在程序中添加:

#include <GL/gl.h>
#include <GL/glu.h>

1.4 OpenGL添加glut库

在pro 文件中添加:

QT += opengl
  • MSVC版本
#第一种就是直接加据对路径
LIBS += D:/Qt/Qt5.12.6/5.12.6/msvc2017_64/lib/freeglut.lib D:/Windows/Kits/10/Lib/10.0.17763.0/um/x64/OpenGL32.Lib#第二种就是直接加库文件,这个的前提是你的库文件必须在系统目录或者工程编译生成目录build-untitled-Desktop_Qt_5_12_6_MSVC2017_64bit-Debug下
LIBS += freeglut.lib OpenGL32.Lib#第三种就是多个库在同一个文件夹下的时候,连接使用
LIBS += -LD:/Qt/Qt5.12.6/5.12.6/msvc2017_64/lib -lfreeglut -lOpenGL32#第四种就是相对路径./表示生成目录build-untitled-Desktop_Qt_5_12_6_MSVC2017_64bit-Debug
LIBS += -L./ -lfreeglut -lOpenGL32
  • MinGW版本
LIBS += -LD:/Qt/Qt5.12.6/5.12.6/mingw73_32/lib -llibfreeglut -lopengl32
  • LIBS模板:
#$$OUT_PWD表示编译生成的那个目录,$$PWD表示.pro文件的那个目录
#win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../../../projects/mylib/release/ -lmylib
#else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../../../projects/mylib/debug/ -lmylib
#else:unix: LIBS += -L$$OUT_PWD/../../../projects/mylib/ -lmylib

最后在cpp文件中加入#include <GL/glut.h>,这样就可以使用glut中的函数了。

2、在线地图访问地址

以下url中:
Z-瓦片层级,一般支持0-18级,越大代表越清晰;
X-瓦片列号,从西向东(0->360),依次0,1,2,……;
Y-瓦片行号,从北向南(有些也可能是从南向北),依次0,1,2,……;

//Cesium访问
new Cesium.UrlTemplateImageryProvider({//调用影像服务 url: "https://mt1.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}"})new Cesium.BingMapsImageryProvider({url: 'https://dev.virtualearth.net',key: bingmapToken,mapStyle: Cesium.BingMapsStyle.AERIAL})//leaflet访问
L.tileLayer('https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}', {maxZoom: 18,attribution: 'ArcGIS Map',id: 'arcgis.streets'}).addTo(map);//openlayers3访问new ol.layer.Tile({source: new ol.source.XYZ({url: 'https://mt2.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}'})})//openlayers2访问new OpenLayers.Layer.XYZ("layername", ["https://mt1.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}","https://mt2.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}","https://mt3.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}"], {attribution: "XYZ Imagery",transitionEffect: "resize"})
1、arcgis
街道图:
https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}
灰色图:
https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetGray/MapServer/tile/{z}/{y}/{x}
深蓝夜色:
https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}2、googlemap
lys参数可选值包括:h(街道图)、m(街道图)、p(街道图)、r(街道图)、s(影像无注记)、y(影像含注记)、t(地形图)
街道图:
https://www.google.cn/maps/vt?lyrs=m@189&gl=cn&x={x}&y={y}&z={z}
卫星图:
https://www.google.cn/maps/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}(或者http://mt1.google.cn/vt/lyrs=s&x={x}&y={y}&z={z}3、Amap(高德地图)
街道:(z>=3才有数据)
https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}
影像图:
https://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}4、OSM
街道图(国外服务器,访问较慢):
https://c.tile.openstreetmap.org/{z}/{x}/{y}.png
https://tile-b.openstreetmap.fr/hot/{z}/{x}/{y}.png5、Mapbox
建筑图:(国内数据略陈旧)
https://b.tiles.mapbox.com/v3/osmbuildings.kbpalbpk/{z}/{x}/{y}.png
黑色底图:
https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png6、Mapbox
卫星图:
https://a.tiles.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.png?access_token={your key}
街道图:
https://a.tiles.mapbox.com/v4/mapbox.streets/{z}/{x}/{y}.png?access_token={your key}
带区划黑底:
https://a.tiles.mapbox.com/v4/mapbox.dark/{z}/{x}/{y}.png?access_token={your key}7、天地图(http://lbs.tianditu.gov.cn/server/MapService.html)
影像图:(z>=1)
https://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={your key}
矢量底图:(z>=1)
https://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={your key}
注记:(z>=1)
https://t2.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&tk={your key}8、BingMap
https://ecn.t0.tiles.virtualearth.net/tiles/a1.jpeg?g=7234
https://ecn.t0.tiles.virtualearth.net/tiles/a13.jpeg?g=7234
https://ecn.t0.tiles.virtualearth.net/tiles/a130.jpeg?g=7234
从Level1开始,g=7234/100/-10……为任意正负整数

5、代码测试(3d瓦片地图)

5.3 opengl / qt5 / c++ / 影像地图 (3d,瓦片贴图)

相关介绍见网址:
【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut)第二期

6、代码测试(2d瓦片地图)

6.5 opengl / qt5 / glm / cpprest / c++ / 必应地图 (2d,瓦片贴图)

相关介绍见网址:
【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut)第二期

6.6 qt5 / c++ / 谷歌地图 (2d,瓦片贴图)

相关介绍见网址:
【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut)第二期

8、代码测试(整体地球)

8.1 QtOpenGL / qt5 / c++ / 地球/飞线(3d)

在这里插入图片描述
在这里插入图片描述

8.2 QtOpenGL / qt5 / c++ / 浮动小地球(3d)

在这里插入图片描述

8.3 QtOpenGL / qt5 / c++ / imgui / 视角切换(3d)

在这里插入图片描述
在这里插入图片描述

8.4 QOpenGLWidget / qt5 / c++ / QImage / 云层白天夜晚(3d)

在这里插入图片描述
在这里插入图片描述

8.5 QOpenGLFunctions / qt5 / c++ / QImage(3d)

在这里插入图片描述
在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

这篇关于【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/810102

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python绘制土地利用和土地覆盖类型图示例详解

《Python绘制土地利用和土地覆盖类型图示例详解》本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matp... 目录一、所需库的安装二、数据准备三、绘制土地利用和土地覆盖类型图四、代码解释五、其他可视化形式1.

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节