使用QGIS可视化基于网格的数据的简单方法。您是否尝试过在地图上可视化基于网格的数据? QGIS 是处理地图和可视化的绝佳选择! 有时,当您处理大量数据和图层时,使用 GUI(图形用户界面)是一项挑战。 在这里,PyQGIS 介入了! 它是将功能强大且语法简单的编程语言 Python 与 QGIS 功能相结合的软件。 在这个博客中,将逐步解释为可视化基于网格的数据绘制彩色矩形的脚本。
让我们定义我们的问题。 当您处理基于网格的数据时,可视化有时非常重要。 在这个博客中,我们将展示如何可视化此类数据并根据某些值对其进行着色。 我们的示例将包括使用 QGIS 和 PyQGIS 在 OSM(开放街道地图)上创建网格,其中矩形的颜色将指示车辆的平均速度(绿色-高速;黄色-中速;红色-低速)。
可视化基于网格的数据的其他示例可以是某些地区的 COVID-19 病例数、单元格中的人口密度、城市污染以及各种热图的可视化。
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。
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)
此示例显示 5x5 矩形网格。 颜色表示在矩形区域中行驶的车辆的速度。
只需更改很少的参数即可创建自定义网格可视化。
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 将定义要绘制的矩形的行数和列数。 所有变量如下图所示。
速度矩阵必须具有与矩形相同的尺寸(行和颜色)。 换句话说,每个矩形必须有一个对应的速度值。 矩形的颜色基于某个数值。 在此示例中,它是平均速度,如以下代码所示。
您可以使用任何其他值(密度、污染等),只要尺寸与矩形的数量匹配即可。
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]]
如果您需要不同的颜色范围,您必须编辑函数 def drawRectangles(points, c_value, name)。 找到下面列出的部分代码并添加或更改括号内的定义值。
(name_of_class, lower_bound, upper_bound, (red, green, blue, alpha))
上一篇:js知识点学习笔记