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

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

image-20220707002503270

注意:

  • 本文数据编码是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()


运行程序:

image-20220707003909788

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)

posted @ 2022-07-06 23:56  当时明月在曾照彩云归  阅读(227)  评论(0编辑  收藏  举报