基于OpenGL绘制shp文件
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()是设置顶点坐标
注意:
- 这是一种OpenGL的固定功能管线,事实上已经逐渐被废弃,但是其代码量少,易于快速实现
- 更详细的OpenGL的固定功能管线解释可参考:OpenGL渲染管线 - 小天_y - 博客园 (cnblogs.com)
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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」