PyQGIS开发--基于网格的数据可视化脚本

1、前言

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

2、问题描述

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

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

3、使用工具

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

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 R 语言中的各种数据库来进行食道癌数据的分析和可。以下是一些常用的库和技术,可以帮助你实现这个目标: 1. ggplot2:这是一个非常流行的数据库,它提供了丰富的绘图函数和灵活的图层系统,可以生成各种类型的图表,如散点图、折线图、柱状图等。 2. plotly:这是一个交互式数据库,可以创建漂亮且交互式的图表,支持绘制散点图、箱线图、热力图等。 3. lattice:这个库提供了一种基于网格布局的多变量数据方法,可以创建并列的多面板图(trellis plots),非常适合探索多个变量之间的关系。 4. ggvis:这个库是基于 ggplot2 的扩展,支持交互式探索性数据,可以动态地改变图表属性和参数。 5. shiny:这是一个 R 语言的 Web 应用框架,可以帮助你将数据结果以交互式应用的形式展示出来,让用户可以自由地探索数据。 在开始之前,你需要确保已经安装了相应的库。如果还没有安装,可以使用以下命令进行安装: ```R install.packages("ggplot2") install.packages("plotly") install.packages("lattice") install.packages("ggvis") install.packages("shiny") ``` 一旦你有了数据和所需的库,就可以开始进行数据分析。你可以根据你的具体需求选择适合的图表类型,并使用相应的库来生成可结果。例如,如果你想绘制食道癌发病率和年龄之间的关系,可以使用 ggplot2 库来创建一个散点图: ```R library(ggplot2) # 假设你的数据框名称为 df,其中包含食道癌发病率(rate)和年龄(age)两列数据 ggplot(data = df, aes(x = age, y = rate)) + geom_point() ``` 这只是一个简单的例子,你可以根据你的数据和需求进行更复杂的分析和可。希望这对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾城一少

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值