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. vulnhub靶场渗透实战12-driftingblues2

    ​vbox导入,网络桥接. 靶机下载地址:https://download.vulnhub.com/driftingblues/driftingblues2.ova 一:信息收集 1:主机发现. 2: ...

  2. 前端内容(HTML CSS javaScript)

    前端内容 前端基础之HTML 前端基础之HTML HTML标签使用 HTML之form表单 前端基础之CSS 前端基础之CSS CSS字体颜色 背景 盒子模型 CSS浮动 溢出 头像框 CSS定位 i ...

  3. STM32用PWM波控制呼吸灯代码

    pwm.c #include "pwm.h" //TIM3-CH3 //PB0 void PWM_Config(void) { GPIO_InitTypeDef GPIO_Init ...

  4. RocketMQ Connect 构建流式数据处理平台

    本文作者:孙晓健,Apache RocketMQ Committer 01 RocketMQ Connect RocketMQ Connect 是一款可扩展的在 RocketMQ 与其他系统之间做流式 ...

  5. 如何在SpringBoot中优雅地重试调用第三方API?

    前言 作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端.但你不能保证所有的事情一直都很顺利.像有些第三方API,偶尔会出现超时.此时,我们要重试几次,这取决于你的 ...

  6. 基于U-Net网络的图像分割的MindStudio实践

    摘要:本实践是基于Windows版MindStudio 5.0.RC3,远程连接ECS服务器使用,ECS是基于官方分享的CANN6.0.RC1_MindX_Vision3.0.RC3镜像创建的. 本文 ...

  7. 【世界杯黑技术专题】「原理探索专题」一文解读一下“卡塔尔世界杯”的先进技术之半自动越位技术SAOT+比赛用球Al Rihla

    盘点卡塔尔世界杯的先进黑科技 归纳总结一下目前世界杯的先进的黑科技有哪些?大致可以划分为以下几点. 半自动化越位技术 比赛用球Al Rihla 球场智能空调 可持续利用的体育场 便利的数字设施和App ...

  8. P8618 [蓝桥杯 2014 国 B] Log 大侠

    简要题意 给你一个长度为 \(n\) 的正整数序列 \(a\),有 \(m\) 个询问,每一个询问给出一个区间 \([l,r]\).定义函数 \(f(x)=\lfloor\log_{2}(x)+1\r ...

  9. 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境

    目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 以下介绍PY32F0系列在 ...

  10. 图文并茂strapi 4.5.5自定义搭建指南以及数据库字段名接口返回mapping分析

    strapi是什么? 基于Nodejs的开源免费CMS框架 为什么选择它? 基于nodejs,100%JavaScript,上手迅速 可轻松创建功能强大且可自定义的API 可以使用任何喜欢的数据库 先 ...