1、前言
使用QGIS可视化基于网格的数据的简单方法。您是否尝试过在地图上可视化基于网格的数据? QGIS 是处理地图和可视化的绝佳选择! 有时,当您处理大量数据和图层时,使用 GUI(图形用户界面)是一项挑战。 在这里,PyQGIS 介入了! 它是将功能强大且语法简单的编程语言 Python 与 QGIS 功能相结合的软件。 在这个博客中,将逐步解释为可视化基于网格的数据绘制彩色矩形的脚本。
2、问题描述
让我们定义我们的问题。 当您处理基于网格的数据时,可视化有时非常重要。 在这个博客中,我们将展示如何可视化此类数据并根据某些值对其进行着色。 我们的示例将包括使用 QGIS 和 PyQGIS 在 OSM(开放街道地图)上创建网格,其中矩形的颜色将指示车辆的平均速度(绿色-高速;黄色-中速;红色-低速)。
可视化基于网格的数据的其他示例可以是某些地区的 COVID-19 病例数、单元格中的人口密度、城市污染以及各种热图的可视化。
![](https://img-blog.csdnimg.cn/img_convert/718c569ee988afd9da09c6073dd9dc99.png)
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 地图层。
![](https://img-blog.csdnimg.cn/img_convert/531987d348e0be9d64439c1dd2017d5b.png)
(2)打开Python console.
![](https://img-blog.csdnimg.cn/img_convert/450a6f4d76b1a28283ec128f541fdf8d.png)
(3)单击“显示编辑器”按钮以打开用于编辑 Python 代码的窗口。
![](https://img-blog.csdnimg.cn/img_convert/0d89bf3c239193656ff9989277e1daab.png)
(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 color
ranges.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 + lons
lat3 = lat1
lon4 = lon2 - lons
lat4 = lat2
column_values.append((lon1, lat1, lon2, lat2, lon3, lat3, lon4, lat4))
coordinate_matrix.append(column_values)
column_values = []
return coordinate_matrix
def 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)
![](https://img-blog.csdnimg.cn/img_convert/73133643b9e22e4edbfa390999437417.png)
(5)按下绿色播放按钮后,将创建一些新图层。 要查看结果,请右键单击其中一个图层并选择“缩放到图层”选项。
![](https://img-blog.csdnimg.cn/img_convert/e0d1695295b287e70d50da986b8f4308.png)
此示例显示 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 将定义要绘制的矩形的行数和列数。 所有变量如下图所示。
![](https://img-blog.csdnimg.cn/img_convert/8a689b147a9ffa5d705101ffa0f892ff.png)
(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))