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. Docker常用命令、Docker Compose、DockerFile实践

    〇.简介 https://hub.docker.com/ 1.架构 2.目录 镜像操作 容器操作 容器运行 Docker示例-MySQL Docker示例-Redis Docker示例-Nacos 使 ...

  2. 【每日一题】【List与Array互转】【工具类的使用】2021年12月10日-56. 合并区间

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] .请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入 ...

  3. 单一接口优化过程全记录(主要涉及Redis)

    接口优化过程记录 问题背景 某个接口耗时长(247ms),但里面逻辑不算复杂,只进行了简单的对象引用以及操作了多次Redis 步骤1:链路追踪,确定业务耗时点 接口里通过链路追踪以及日志查询发现主要是 ...

  4. excel甘特图制作

    1.插入图表   1 1.选中数据区域(3列,如图所示)--点击插入--推荐的图表--堆积条形图 END 2.甘特图制作   1 2.点击图表工具--设计--选择数据. 轴标签区域改为--确定项目.. ...

  5. nuxt之vuex的使用

    先来了解一下官网:https://www.nuxtjs.cn/guide/vuex-store 一.首先在 store 文件下新建一个index.js文件 const state = () => ...

  6. MongoDB - 副本集简介

    简介 在 MongoDB 中,副本集指的是一组 MongoDB 服务器实例掌管同一个数据集,实例可以在不同的机器上. 其中一个用于处理写操作的是主节点(Primary),还有多个用于保存主节点的数据副 ...

  7. 深入理解 dbt 增量模型

    想要实现数据增量写入数据库,可以选择 dbt 增量模型.通过 dbt 增量模型,我们只用专注于写日增 SQL,不用去关注于如何安全的实现增量写入. dbt 增量模型解决了什么问题 原子性写入:任何情况 ...

  8. CVE-2022-26923 Windows域提权漏洞

    前言 Active Directory 域服务,是一种目录服务,提供了存储目录数据信息以及用户相关的一些密码,电话号码等等一些数据信息,且可让用户和管理员使用这些数据,有利于域管理员对用户的数据信息进 ...

  9. [深度学习] ncnn安装和调用基础教程

    目录 1 介绍 2 Ubuntu 18下ncnn安装和使用 2.1 Ubuntu 18下ncnn编译安装 2.2 Ubuntu 18下ncnn使用 3 Windows 10下ncnn安装和使用 3.1 ...

  10. CVE-2016-4437

    漏洞名称 Apache shiro 1.2.4反序列化漏洞(CVE-2016-4437) 利用条件 Apache Shiro <= 1.2.4 漏洞原理 Shiro提供了记住我(Remember ...