2021/3/20 修:

(补充源代码链接)

程序源代码链接:https://pan.baidu.com/s/1q-XDhEQK-apGgXOofayhIQ 提取码:ddjx

编译环境:Qt5.9

编译器:MSVC

IDE:QtCreator

注意修改读取osm文件的路径,我记得在不同的cpp里要修改两处。 另外,这份代码还有一个在osm模型下,基于QLearning的最优路径探索,一辆通过WASD可移动的小车,代码挺乱的,没功夫改了,凑合看吧


最近做了一个有趣的程序,将2D的地图数据进行了3D上的重建,类似于百度地图与谷歌地图的三维地图。地图数据来自于OpenStreetMap,这是一个地图开源网站,可以XML文件格式导出很精确的地图数据,再基于这些数据使用Qt下的OpenGL进行三维重建工作,

(这次程序就不上传了,上传了也没人看,看也看不懂,简单了解下思想就可以了,有缘看到这篇博客的同学就自己写吧,理解起来也不难。如真需要程序,请私信我,我实在懒得整理了,手动笑哭?)

如下图所示:

   图1 OpenStreetMap网站 

图2 三维重建效果

图3 三维重建矢量图

一.OpenStreetMap

从OpenStreetMap导出的文件以.osm为文件后缀,具有较精确的全球地图数据,由全球志愿者共同维护。OSM定义了三种数据类型,“node”,“way”,”relation”,他们之间的关系与拓扑结构类似。

“node”:表示某个特征点的信息,主要是id编号与经纬度坐标“lat”与“lon”。

“way”: 一系列“node”的集合,表示一条不封闭的道路,如高速公路,乡间小径;或者一个封闭的区域,如建筑物,湖泊等。主要存储一系列“node”的ID编号与tag标签信息,这些tag标注了这些“way”是“highway”还是“building”;

“relation”: 一系列“way”的集合,这些路与封闭区域的集合表示一个行政区域,或者自然保护区等等。

该文件数据格式为XML,以文本方式打开,如下面两图所示:

  图4 OSM---"node"

图5 OSM---"way"

根据这些信息,可以通过正则表达式的思想一行一行的读取osm文件,一边读一边对这个文件中的“node”与“way”数据进行存储(这里暂不考虑relation),并使用Qt里的画笔进行绘制。  

   图6 Qt绘制OSM数据  

二.三维重建

前文已经提过,“way”是“node”的关系集合,表示某条不封闭的道路,或者是某封闭的建筑区域。

2.1道路重建

简单来说,三维重建是针对一条线表示的不封闭道路进行点的扩充,下图所示红线为“way”的连线,以“node”N1为例,计算相邻两个“node”的矢量V0与V1,与垂直于xy平面的矢量(0, 0, 1)叉乘,算出在xy平面上分别与矢量V0与V1垂直的矢量V2与V3,V2与V3相加得矢量V4,则V4矢量的方向即为N1的扩充“node”N1‘所在的方向,反方向则为另一个扩充“node”N1’‘所在的方向。

    则相邻的四个扩充节点N0’,N0’’,N1‘,N1’‘可以作为一个单元,抬高一定高度,形成新的四个扩充节点,则这八个节点可以作为一个方格作为三维重建的几何造型,如下图所示。

2.2 封闭区域

封闭区域的重建更为简单,借鉴道路重建的思想,将组成封闭区域的所有node连线组成面,经这个面抬起一定高度形成新的面,两个面结合互相连线即是一个几何造型。当然这个面可能是不规则凹边形,不为OpenGL所识别,需要提前对这个面进行三角剖分。另外,OSM文件中并没有提供确切的高度信息,所以我们根据生活经验给出一些简单的高度信息,再用纯色块加一些简单的光照进行渲染。构成三维重建模型。

下图为西安某区域的地图重建信息。

基于OpenStreetMap与OpenGL的矢量地图三维重建相关推荐

  1. 基于三维GIS技术的矢量地图动态LOD渲染方法研究现状

    "地图是人类文化的杰作,它融科学.艺术于一体,作为描述.研究人类生存环境的一种信息载体是人类生产与生活中不可缺少的一种工具."这是陈述彭院士为<中国地图学年鉴>作序的开 ...

  2. ae渲染存在偏移_基于三维GIS技术的矢量地图动态LOD渲染方法

    本文从地图操作和要素可见性入手分析地图简化的影响因素,并基于分析的结果设计相应的缓存结构以加速地图的渲染.研究GPU环境下梯形格网的高效LOD方法,探讨简化前后节点的重组和显存中EBO数据的更新方法, ...

  3. Mapbox、GeoServer离线部署矢量地图

    Mapbox.GeoServer离线部署矢量地图 关键词:Mapbox.GeoServer.Tomcat.PostgreSQL.PostGis 一.地图数据获取 使用OpenStreetMap获取中国 ...

  4. 基于OpenStreetMap地图数据的离线路径规划

    距离上次写博客已经好久了,这段时间断断续续也有弄一下关于OpenStreetMap的东西,这次把离线路径规划的实现记录一下. 在OpenStreetMap提供的开源项目中,osmbonuspack提供 ...

  5. Tesla AI Day视觉自动驾驶技术解读:感知+规划+矢量地图+自动标注+仿真

    作者 | 赵行  编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/570824078 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干 ...

  6. Autoware实车测试记录(一)--前期准备以及使用Autoware Maptool插件进行矢量地图的绘制

    一.前言 前段时间一直在学习Lio-sam的程序,在学习完源码后继续学习开源的自动驾驶软件Autoware,这个软件可以看作是很多功能包的集合,在一个人机交互界面对各个模块功能进行参数设置.启动和关闭 ...

  7. 矢量地图包——让移动端地图飞起来

    众所周知,由于移动设备自身的限制,对移动端地图数据的要求一般比桌面端更高,而矢量地图包性能高.显示好.体积小.更新快.易传输等特点,恰恰满足了移动端的需求.正因如此,二者成为完美搭档,擦出了美妙的火花 ...

  8. 特斯拉自动驾驶算法和模型解读(感知/规划/矢量地图/自动标注等)

    编辑 | 焉知汽车 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[全栈算法]技术交流群 特斯拉是一个典型的AI公司,过去一年训练了7 ...

  9. 计算机视觉算法——基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet)

    计算机视觉算法--基于深度学习的高精地图算法(HDMapNet / VectorMapNet / MapTR / VectorNet) 计算机视觉算法--基于深度学习的高精地图算法(HDMapNet ...

最新文章

  1. 深度学习到底有多难?这篇文章带你入门!
  2. Nginx 最全操作总结
  3. TCP/UDP 套接字总结
  4. sqlserver2014内存数据库特性介绍
  5. 11、web端主要应用在哪些领域?
  6. ★LeetCode(942)——增减字符串匹配(JavaScript)
  7. 小tips:JS之浅拷贝与深拷贝
  8. editor修改样式 vue_vue修改富文本中的元素样式
  9. 【pytorch目标检测】FPN网络结构
  10. 一个简单的轮播图代码
  11. JAVA如何封装省市区_基于element ui封装的省市区三级联动
  12. 腾讯云cdn设置 php,腾讯云免费CDN开通及接入教程
  13. FutureTask.get(timeOut)执行原理浅析
  14. Cubieboard2折腾手记(一)
  15. IDEA集成Gerrit插件
  16. Android手机卡顿原因
  17. SAP中在FS00中显示组科目表(集团科目表)
  18. 自己制作ssl证书:自己签发免费ssl证书,为nginx生成自签名ssl证书
  19. 数字化医院PACS影像系统 三维影像后处理技术应用
  20. 反向比例运算电路微分关系_电气必备20个经典模拟电路

热门文章

  1. SAP FI 财务模块 关键用户 考试练习 问卷
  2. infrasys-cloud
  3. Java豆瓣电影TOP250爬虫
  4. Tom和Jerry来了,Tom和Jerry走了——北漂18年(38)
  5. 刺激战场全网最全年夜饭位置:吃完年夜饭还有高级物资拿?
  6. python 代码忽略警告信息
  7. Sql表结构及数据对比工具
  8. FFmpeg学习笔记之ffplay流程分析
  9. 在哪里设置自动锁定计算机,win10如何设置自动锁定屏幕_win10设置自动锁屏的步骤...
  10. 联想电脑触摸板突然失灵,提示电脑触摸板预览暂不可用