1. 引言

坐标数据是空间数据文件的核心,空间数据的数据量往往是很大的。数据可视化是GIS的一个核心应用,绘制海量的坐标数据始终是一个考验设备性能的难题,使用GPU进行绘制可有效减少CPU的负载,提升绘制时的速度

shapefile是空间数据文件常用的格式,本文基于Python语言,使用pyshp库来读取shp文件,并使用基于PyOpenGL库来使用OpenGL绘制空间数据

2. 环境准备

PyOpenGL的安装可参考:PyOpenGL的安装与错误解决 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

窗体环境GLUT的使用与详解可参考:基于GLUT的PyOpenGL的使用 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

pyshp的简易入门可参考:python中shapefile学习(pyshp) - 简书 (jianshu.com)

​ pyshp官方文档为:GeospatialPython/pyshp: This library reads and writes ESRI Shapefiles in pure Python. (github.com)

本文使用的数据为云南的县界,数据信息如图所示:

注意:

  • 本文数据编码是UTF-8
  • 本文数据Geometry是Polygon
  • 本文数据坐标系是投影坐标系

3. 图形绘制

读取shp文件并进行图形绘制

代码整体流程可参考:基于GLUT的PyOpenGL的使用 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

glLoadIdentity功能是重置当前指定的矩阵为单位矩阵在语义上,其等同于用单位矩阵调用glLoadMatrix。加载glLoadIdentity(),等于是将之前矩阵变换导致变化过的栈顶矩阵重新归位,置为单位矩阵,等于是之前的矩阵变换带来的影响到此为止了

glColor3f()是设置颜色

glVertex3f()是设置顶点坐标

注意

Python代码:

# 引入GLUT、OpenGL库
from OpenGL.GLUT import *
from OpenGL.GL import *
import shapefile sf = shapefile.Reader("./shapefiles/云南县界/云南县界.shp")
shapes = sf.shapes() # 读取shape的geometry,输出为一个矩阵 glutInit()
'''
进行各种初始化
''' # 通过b前缀将字符串转换成 bytes
glutCreateWindow(b"Yunnan shapefile") def drawFunc():
glClearColor(1, 1, 1, 1)
glClear(GL_COLOR_BUFFER_BIT)
for i in range(shapes.__len__()):
ploygon = shapes[i]
points = ploygon.points glColor3f(.0, .0, .0)
glBegin(GL_LINE_STRIP)
for j in range(points.__len__()):
point = points[j]
glVertex3f(point[0], point[1], .0)
glEnd() # glColor3f(1.0, 1.0, 1.0)
# glBegin(GL_POLYGON)
# for j in range(points.__len__()):
# point = points[j]
# glVertex3f(point[0], point[1], -1.0)
# glEnd() glLoadIdentity()
glOrtho(sf.bbox[0], sf.bbox[2], sf.bbox[1], sf.bbox[3], -1, 1) glFlush(); # 注册绘制函数为显示的回调函数,将会不停调用来绘制
glutDisplayFunc(drawFunc)
drawFunc()
glutMainLoop()

运行程序:

4. 参考资料

[1]GLRenderSHP/GLRenderSHP.cpp at master · ttvertex/GLRenderSHP (github.com)

[2]opengl中对glOrtho()函数的理解 - onlycxue - 博客园 (cnblogs.com)

[3]OpenGL绘线方式 GL_LINES与GL_LINE_STRIP的区别_demystify的博客-CSDN博客

[4]PyOpenGL的安装与错误解决 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

[5]基于GLUT的PyOpenGL的使用 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com)

[6]python中shapefile学习(pyshp) - 简书 (jianshu.com)

[7]GeospatialPython/pyshp: This library reads and writes ESRI Shapefiles in pure Python. (github.com)

[8]glLoadIdentity_百度百科 (baidu.com)

[9]OpenGL渲染管线 - 小天_y - 博客园 (cnblogs.com)

基于OpenGL绘制shp文件的更多相关文章

  1. 使用OpenGL绘制 shapefile文件 完成最基本的gis操作

    主要内容概述 (视频教程已经发布:http://edu.csdn.net/course/detail/3422) (http://edu.csdn.net/course/detail/3420) 1. ...

  2. 基于OpenGL编写一个简易的2D渲染框架-05 渲染文本

    阅读文章前需要了解的知识:文本渲染 https://learnopengl-cn.github.io/06%20In%20Practice/02%20Text%20Rendering/ 简要步骤: 获 ...

  3. 基于OpenGL的三维曲面动态显示实现

    在使用Visual C++的MFC AppWizard建立应用程序框架后,生成了多个类,与OpenGL编程相关的类是视图类,主要的显示任务都在其中完成. 1.基于OpenGL绘图的基本设置 1.1 设 ...

  4. [Modern OpenGL系列(三)]用OpenGL绘制一个三角形

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...

  5. 在matlab中将处理结果输出为shp文件

    在matlab中读入shp文件很简单,一个函数shaperead就可以了,但输出为shp文件就稍微麻烦一些了.shp文件实际上就是一个struct,因此得到处理结果后,要先将数据变成struct结构, ...

  6. ArcGIS学习记录—KMZ KML与SHP文件互相转换

      1.在google earth中绘制边界  工具栏中选择"Add Polygon".随意绘制一个多边形.  右击添加的图层名(左侧)保存位置为,选择保存为kmz或kml文件.  ...

  7. OpenGL绘制自由落体小球

    OpenGL绘制自由落体小球 一.    程序运行的软硬件环境 本次设计在window10系统下进行,运用C++进行编写,在CodeBlocks环境下使用OpenGL进行设计. 所需环境配置分为2部分 ...

  8. C#、C++用GDAL读shp文件(转载)

    C#.C++用GDAL读shp文件 C#用GDAL读shp文件 (2012-08-14 17:09:45) 标签: 杂谈 分类: c#方面的总结 1.目前使用开发环境为VS2008+GDAL1.81 ...

  9. ArcGIS Earth(原谷歌地球)如何获取高精度矢量地图数据?(shp文件/要素类/kml)

    大家好,这次来分享干货.做地理分析的同学,或者需要使用地图却不知道哪里有矢量数据的时候,怎么办呢? 这次,我就告诉大家哪里能自己手工制作矢量点线面数据!注意哦,是自己绘制的. 使用到的软件: ArcG ...

  10. ArcGIS 网络分析[1.1] 创建用于网络分析用的线类型shp文件[这个太基础了吧!]

    具体的准备,在上一篇就说过了,不再赘述. 阅读本篇前,需要的预备知识是:ArcGIS创建各种矢量数据的方法,了解地理坐标与投影坐标 本篇只创建单一的线数据,至于点数据,以后进行复杂的网络分析时再添加进 ...

随机推荐

  1. 锂电池3.7V转3V,1.5V的稳压和降压芯片

    3.7V是常规我们知道的锂电池多,一般锂电池的放电电压是3V-4.2V之间,再降压转3V,1.5V的话,不需要担心升降压等其他问题,不像输出3.3V时,可能要考虑到升降压芯片的问题了,升降压芯片可考虑 ...

  2. 【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系

    NIO与内存映射文件 Java类库中的NIO包相对于IO包来说有一个新功能就是 [内存映射文件],在业务层面的日常开发过程中并不是经常会使用,但是一旦在处理大文件时是比较理想的提高效率的手段,之前已经 ...

  3. uniapp 微信小程序 实现左侧菜单右侧列表,双向联动的效果

    <template> <view class="u-wrap"> <view class="u-search-box"> & ...

  4. 万字长文解析Scaled YOLOv4模型(YOLO变体模型)

    一,Scaled YOLOv4 摘要 1,介绍 2,相关工作 2.1,模型缩放 3,模型缩放原则 3.1,模型缩放的常规原则 3.2,为低端设备缩放的tiny模型 3.3,为高端设备缩放的Large模 ...

  5. 线性方程组的直接解法——Gauss消去法

    考虑线性方程组 \[\mathrm{A}x=\mathrm{b} \] 其中,\(\mathrm{A}=(a_{ij})_{n\times n}\),\(\mathrm{b}=[b_1,b_2,\cd ...

  6. [编程基础] Python列表解析总结

    在本教程中,我们将学习使用Python列表解析(list comprehensions)相关知识 1 使用介绍 列表解析是一种基于现有列表创建列表的句法结构.列表解析提供了创建列表的简洁方法.通常需要 ...

  7. [生命科学] snapgene 构建载体方法分享

    snapgene 构建载体方法分享 文章目录 snapgene 构建载体方法分享 1. Snapgene 构建载体-酶切位点法 2. 载体构建--同源重组法 3. 总结 1. Snapgene 构建载 ...

  8. Ventoy制作启动盘和使用VMware测试启动盘(论文版)

    - 1 Ventoy 1.1  Ventoy是什么 Ventoy是可用于制作启动U盘的开源工具,在占用少量引导分区容量后,其他空间依旧可以正常当一般的U盘读写文件.它的最大特点是只要将iso.win. ...

  9. DVWA靶场实战(二)——Command Injection

    DVWA靶场实战(二) 二.Command Injection: 1.漏洞介绍: Command Injection,中文叫做命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令 ...

  10. 四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】

    四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和. 如果把 0 包括进去,就正好可以表示为 4 个数的平方和. 比如: \(5=0^2+0^2+1^2+2 ...