PyQGIS开发--基于网格的数据可视化脚本
创始人
2024-06-03 09:13:39
0

1、前言

使用QGIS可视化基于网格的数据的简单方法。您是否尝试过在地图上可视化基于网格的数据? QGIS 是处理地图和可视化的绝佳选择! 有时,当您处理大量数据和图层时,使用 GUI(图形用户界面)是一项挑战。 在这里,PyQGIS 介入了! 它是将功能强大且语法简单的编程语言 Python 与 QGIS 功能相结合的软件。 在这个博客中,将逐步解释为可视化基于网格的数据绘制彩色矩形的脚本。

2、问题描述

让我们定义我们的问题。 当您处理基于网格的数据时,可视化有时非常重要。 在这个博客中,我们将展示如何可视化此类数据并根据某些值对其进行着色。 我们的示例将包括使用 QGIS 和 PyQGIS 在 OSM(开放街道地图)上创建网格,其中矩形的颜色将指示车辆的平均速度(绿色-高速;黄色-中速;红色-低速)。

可视化基于网格的数据的其他示例可以是某些地区的 COVID-19 病例数、单元格中的人口密度、城市污染以及各种热图的可视化。

3、使用工具

  • QGIS — 免费和开源地理信息系统软件。 可以在官方页面https://qgis.org/en/site/下载。 Medium 上有一些关于如何安装 QGIS 的教程。

  • PyQGIS — 结合了 Python 和 QGIS 功能的软件。 它用于自动执行重复性任务,例如创建和编辑大量图层。 可以在这里找到官方文档 https://docs.qgis.org/3.10/en/docs/index.html

  • Python 控制台 — QGIS 有 Python 安装和控制台,所以我们不必从官方页面安装 Python。

4、实现步骤

(1)首先,在 QGIS 应用程序中打开新项目并添加 OSM 地图层。

(2)打开Python console.

(3)单击“显示编辑器”按钮以打开用于编辑 Python 代码的窗口。

(4)复制下面的代码复制并粘贴到 Python 代码编辑器。 然后按下绿色的播放按钮。

def drawRectangles(points, c_value, name):"""Draws a rectangle as a layer on a Qgis map.:param points: Four points of a rectangle [lower left, lower right, upper right, upper left].:param c_value: Value for defining a color of a given rectangle.:return:"""# Create layer.layer = QgsVectorLayer('Polygon', name, "memory")pr = layer.dataProvider()poly = QgsFeature()poly.setGeometry(QgsGeometry.fromPolygonXY([points]))pr.addFeatures([poly])# Add "Speed" attribute to layer attribute table.pr.addAttributes([QgsField("c_value", QVariant.Double)])attr_value = {0: int(c_value)}pr.changeAttributeValues({1: attr_value})layer.updateFields()layer.updateExtents()QgsProject.instance().addMapLayers([layer])# Define ranges for rectangles color.# ('name',lower_bound, upper_bound, rgb_color)values = (('Low speed', 0, 30, (255, 0, 0, 100)),('Medium speed', 31, 60, (255, 255, 0, 100)),('High speed', 61, 200, (0, 255, 0, 100)))# Create a category for each item in values.ranges = []for label, lower, upper, color in values:symbol = QgsSymbol.defaultSymbol(layer.geometryType())symbol.setColor(QColor(color[0], color[1], color[2], alpha=color[3]))symbol.symbolLayer(0).setStrokeColor(QColor(0, 0, 0, alpha=0))  # Border colorranges.append(QgsRendererRange(lower, upper, symbol, label))renderer = QgsGraduatedSymbolRenderer('c_value', ranges)layer.setRenderer(renderer)def create_coordinate_matrix(sp, xn, yn, lons, lats):"""Creates xn times yn matrix of GNSS points.:param sp: Starting GNSS point.:param xn: Number of rectangles (columns).:param yn: Number of rectangles (rows).:param lons: Longitude step.:param lats: Latitude step.:return: Matrix of GNSS points for rectangle drawing. Every cell consists of a tuple with four points (lon1, lat1, lon2, lat2, lon3, lat3, lon4, lat4)"""coordinate_matrix = []column_values = []for i in range(1, yn + 1):for j in range(1, xn + 1):lon1 = sp[0] + ((j - 1) * lons)lat1 = sp[1] - ((i - 1) * lats)lon2 = sp[0] + (j * lons)lat2 = sp[1] - (i * lats)lon3 = lon1 + lonslat3 = lat1lon4 = lon2 - lonslat4 = lat2column_values.append((lon1, lat1, lon2, lat2, lon3, lat3, lon4, lat4))coordinate_matrix.append(column_values)column_values = []return coordinate_matrixdef draw_coordinate_matrix(coordinate_matrix, c_values):"""Draws all rectangles defined by the coordinate matrix.:param coordinate_matrix: Matrix of GNSS points.:param c_values: Matrix of color values for every rectangle.:return:"""for i in range(0, len(coordinate_matrix)):for j in range(0, len(coordinate_matrix[0])):point = coordinate_matrix[i][j]p1 = QgsPointXY(point[0], point[1])p3 = QgsPointXY(point[2], point[3])p2 = QgsPointXY(point[4], point[5])p4 = QgsPointXY(point[6], point[7])name = str(i) + '-' + str(j)drawRectangles([p1, p2, p3, p4], c_values[i][j], name)#################################################################
# Define starting GNSS point and size of a rectangles to draw.
#################################################################
lon_step = 0.006545  # ~500[m]
lat_step = 0.004579  # ~500[m]x_num = 5   # Number of rectangles (columns).
y_num = 5   # Number of rectangles (rows).lon_start = 15.779056
lat_start = 45.834558
start_point = (lon_start, lat_start)    # Starting GNSS point.#################################################################
# Create a coordinate matrix.
#################################################################
cm = create_coordinate_matrix(sp=start_point,xn=x_num,yn=y_num,lons=lon_step,lats=lat_step)# Example of the speed matrix.
# Every cell represent the speed for corresponding rectangle.
# The color of a rectangle corresponds to its speed value.
# Small speed - red; Medium speed - yellow; High speed - green
sm = [[0, 20, 50, 0, 3],[30, 50, 60, 80, 2],[80, 50, 30, 20, 1],[0, 0, 0, 0, 5],[80, 50, 30, 20, 1]]#################################################################
# Draw rectangles on the map.
#################################################################
draw_coordinate_matrix(coordinate_matrix=cm,c_values=sm)

(5)按下绿色播放按钮后,将创建一些新图层。 要查看结果,请右键单击其中一个图层并选择“缩放到图层”选项。

此示例显示 5x5 矩形网格。 颜色表示在矩形区域中行驶的车辆的速度。

5、自定义网格可视化

只需更改很少的参数即可创建自定义网格可视化。

(1)矩形的形状和大小

lon_step = 0.006545  # ~500[m]
lat_step = 0.004579  # ~500[m]x_num = 5   # Number of rectangles (columns).
y_num = 5   # Number of rectangles (rows).lon_start = 15.779056
lat_start = 45.834558
start_point = (lon_start, lat_start)    # Starting GNSS point.

变量 lon_start 和 lat_start 将定义地图上的起始 GNSS 点。 lon_step 和 lat_step 是用于增加对应于距离度量的某个定义数字的经度和纬度的系数。 让我们更详细地解释一下。 在此示例中,我们要创建 500x500 米的矩形。 这意味着我们必须增加/减少 0.006545 的经度和 0.004579 的纬度才能在地图上移动 500 米。 变量 x_num 和 y_num 将定义要绘制的矩形的行数和列数。 所有变量如下图所示。

(2)矩形颜色

速度矩阵必须具有与矩形相同的尺寸(行和颜色)。 换句话说,每个矩形必须有一个对应的速度值。 矩形的颜色基于某个数值。 在此示例中,它是平均速度,如以下代码所示。

您可以使用任何其他值(密度、污染等),只要尺寸与矩形的数量匹配即可。

sm = [[0, 20, 50, 0, 3],[30, 50, 60, 80, 2],[80, 50, 30, 20, 1],[0, 0, 0, 0, 5],[80, 50, 30, 20, 1]]

(3)颜色范围

如果您需要不同的颜色范围,您必须编辑函数 def drawRectangles(points, c_value, name)。 找到下面列出的部分代码并添加或更改括号内的定义值。

(name_of_class, lower_bound, upper_bound, (red, green, blue, alpha))

相关内容

热门资讯

春天的小作文 关于春天的小作文  在学习、工作或生活中,大家都尝试过写作文吧,作文是人们把记忆中所存储的有关知识、...
写事的作文300字 关于写事的作文300字(通用27篇)  在平平淡淡的学习、工作、生活中,大家总少不了接触作文吧,作文...
我不只属于我优秀作文600字 我不只属于我优秀作文600字(通用31篇)  在平平淡淡的日常中,大家总少不了接触作文吧,作文根据写...
谢谢你作文700字 谢谢你作文700字(通用20篇)  在日常生活或是工作学习中,大家都接触过作文吧,写作文可以锻炼我们...
一盏灯作文500字 一盏灯作文500字(精选28篇)  在日常学习、工作或生活中,大家都经常看到作文的身影吧,作文根据写...
新年的作文600字 【必备】新年的作文600字(通用27篇)  在现实生活或工作学习中,许多人都有过写作文的经历,对作文...
窗外850字作文 窗外850字作文  窗外是满目的金黄,盛放在清早透明的晨光中。  每个秋冬之际,那几棵秀拔的银杏便会...
触摸勇气作文 触摸勇气作文  无论在学习、工作或是生活中,大家都不可避免地要接触到作文吧,作文是一种言语活动,具有...
照妖镜作文 照妖镜作文  在日常学习、工作抑或是生活中,大家一定都接触过作文吧,借助作文人们可以实现文化交流的目...
描写清晨的作文 描写清晨的作文五篇  描写清晨的作文一  今天,我来的特别早,只见校园沉浸在一片白茫茫的大雾中,给人...
童话作文 童话作文200字三篇  导语:童话,一个熟悉而又神秘的世界,是我们童年的回忆。下面小编整理了童话作文...
名人例子经典励志故事 名人例子经典励志故事  如果可以时常之后按以下名人例子经典励志故事来看看也是挺好的,那么名人例子经典...
信心比黄金更重要哲理故事 信心比黄金更重要哲理故事  故事一般都和原始人类的生产生活有密切关系,他们迫切地希望认识自然,于是便...
山水 山水今天,爸爸公司组织去旅游,我们去了莱芜金泰山的九龙大峡谷。传说“金泰山”这一名字是泰山奶奶取得,...
养小狗的作文600字 养小狗的作文范文600字(通用7篇)  无论是在学校还是在社会中,说到作文,大家肯定都不陌生吧,根据...
描写阴天的作文 描写阴天的作文(精选70篇)  在生活、工作和学习中,大家都有写作文的经历,对作文很是熟悉吧,作文根...
向日葵作文托物言志 向日葵作文托物言志(通用57篇)  在现实生活或工作学习中,大家最不陌生的就是作文了吧,作文是人们以...
感动的作文500字 感动的作文500字感动的作文500字无声的感动在我的脑海里,有许多感人的事情发生在我的身边,在时光的...
找春天400字作文 找春天400字作文  在日常学习、工作和生活中,许多人都有过写作文的经历,对作文都不陌生吧,借助作文...
对手作文400字 关于对手作文400字(精选8篇)  在日常生活或是工作学习中,大家最不陌生的就是作文了吧,通过作文可...