基于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)