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

相关内容

热门资讯

婚礼开场白主持词 婚礼开场白主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。随着社会一步步向前发展...
会主持人开场白台词 会主持人开场白台词2013年会主持人开场白台词    甲:新年的钟声即将敲响,时光的车轮又留下了一道...
领导主持词 领导主持词三篇  主持词已成为各种演出活动和集会中不可或缺的一部分。在现今人们越来越重视活动氛围的社...
升学宴致辞 升学宴致辞(精选15篇)  在现实生活或工作学习中,大家一定都接触过致辞吧,致辞具有“礼仪性”或“仪...
农村白事的主持词开场白 农村白事的主持词开场白(精选10篇)  在发展不断提速的社会中,越来越多的人会用到开场白,好的开场白...
生日主持词的开场白   生日主持词开场白(一)  各位同事和寿星们,各人晚顶好!在这天高气爽、丹桂飘喷鼻的夸姣季候,咱们...
旅游文化节主持词 旅游文化节主持词  主持词的写作需要将主题贯穿于所有节目之中。现今社会在不断向前发展,主持人参与的事...
主持人串词 主持人串词  一、串词的语言特征  (串词的语言,可以说是用尽了所有的修辞手法,我们不可能去全讲,因...
浪漫婚礼司仪主持词 浪漫婚礼司仪主持词  主持词是主持人在台上表演的灵魂之所在。在现在的社会生活中,很多场合都需要主持人...
公司迎春晚会的主持词 公司迎春晚会的主持词  主持词的写作需要将主题贯穿于所有节目之中。在当今不断发展的世界,主持人在活动...
少儿节目主持词 精选少儿节目主持词4篇  主持词已成为各种演出活动和集会中不可或缺的一部分。随着社会一步步向前发展,...
王家卫电影经典台词 王家卫电影经典台词(精选50句)  我们爱看王家卫的电影,不止爱他所创造的那个光影世界,更爱他电影中...
演唱会主持台词 演唱会主持台词  (甲)尊敬的各位领导,  (乙)各位来宾,  (甲)敬爱的老师,  (乙)亲爱的同...
《你的名字》经典台词 《你的名字》经典台词  你的名字,是谁的心事,还记得你的名字里面的经典台词吗?以下是小编为你精心整理...
教研活动主持词 教研活动主持词  主持人在台上表演的灵魂就表现在主持词中。在当下的中国社会,主持成为很多活动不可或缺...
艺术节主持词开场白 艺术节主持词开场白  什么是艺术节  艺术节是文艺工作者及艺术家、艺术爱好者之间学术交流与学习的重要...
老板在公司年会致辞 老板在公司年会致辞15篇  在平平淡淡的学习、工作、生活中,大家最不陌生的就是致辞了吧,致辞具有针对...
央视春晚主持词台词 央视春晚主持词台词  主持词是主持人在节目进行过程中用于串联节目的串联词。在各种集会、活动不断增多的...
教师节朗诵晚会串词 教师节朗诵晚会串词  主持词需要富有情感,充满热情,才能有效地吸引到观众。在当今不断发展的世界,越来...
趣味运动会主持稿 趣味运动会主持稿(通用7篇)  在充满活力,日益开放的今天,很多地方都会使用到主持稿,主持稿是主持人...