高级功能与扩展

第十八章 高级功能与扩展

18.1 3D可视化

18.1.1 创建3D视图

视图 > 新建3D地图视图

18.1.2 3D视图配置

from qgis.core import Qgs3DMapSettings
from qgis._3d import QgsCameraController

# 获取3D视图设置
settings = Qgs3DMapSettings()
settings.setCrs(QgsCoordinateReferenceSystem("EPSG:4326"))
settings.setOrigin(QgsVector3D(116.4, 39.9, 0))
settings.setTerrainVerticalScale(1.0)

18.1.3 地形设置

地形类型

  • 平面地形
  • DEM地形
  • 网格地形
  • 在线地形(Cesium地形服务)
# 设置DEM地形
from qgis._3d import QgsDemTerrainGenerator

terrain = QgsDemTerrainGenerator()
terrain.setCrs(dem_layer.crs())
terrain.setLayer(dem_layer)
settings.setTerrainGenerator(terrain)

18.1.4 3D符号

点3D符号

  • 模型(.obj, .gltf)
  • 几何形状(球、立方体、圆柱)
  • 广告牌

面3D符号

  • 挤出多边形
  • 材质贴图
from qgis._3d import (
    QgsPoint3DSymbol,
    QgsPolygon3DSymbol,
    QgsPhongMaterialSettings
)

# 点符号
point_symbol = QgsPoint3DSymbol()
point_symbol.setShape(QgsPoint3DSymbol.Sphere)
material = QgsPhongMaterialSettings()
material.setDiffuse(QColor(255, 0, 0))
point_symbol.setMaterial(material)

# 面挤出
polygon_symbol = QgsPolygon3DSymbol()
polygon_symbol.setHeight(0)
polygon_symbol.setExtrusionHeight(100)  # 挤出高度
polygon_symbol.setMaterial(material)

18.2 时态功能

18.2.1 时态控制器

视图 > 面板 > 时态控制器

18.2.2 配置时态图层

图层属性 > 时态 > 
- 启用动态时态控制
- 配置时间字段
- 设置时间范围

18.2.3 PyQGIS时态配置

from qgis.core import (
    QgsVectorLayerTemporalProperties,
    QgsDateTimeRange
)

# 获取时态属性
temporal = layer.temporalProperties()
temporal.setIsActive(True)
temporal.setMode(QgsVectorLayerTemporalProperties.ModeFeatureDateTimeStartAndEndFromFields)
temporal.setStartField('start_time')
temporal.setEndField('end_time')

# 设置时态范围
time_range = QgsDateTimeRange(
    QDateTime(2023, 1, 1, 0, 0, 0),
    QDateTime(2023, 12, 31, 23, 59, 59)
)

18.2.4 时间动画导出

from qgis.core import QgsTemporalNavigationObject

# 导出时间序列图像
temporal_controller = iface.mapCanvas().temporalController()
temporal_controller.setFrameDuration(QgsInterval(1, QgsUnitTypes.TemporalDays))

# 遍历时间帧导出

18.3 Mesh数据

18.3.1 加载Mesh数据

from qgis.core import QgsMeshLayer

# 加载NetCDF
layer = QgsMeshLayer("/path/to/data.nc", "Mesh", "mdal")

# 加载GRIB
layer = QgsMeshLayer("/path/to/data.grib", "GRIB", "mdal")

18.3.2 Mesh可视化

数据集类型

  • 标量(如温度、水深)
  • 矢量(如流速、风向)
# 获取数据集组
for i in range(layer.datasetGroupCount()):
    group = layer.datasetGroupMetadata(i)
    print(f"数据集: {group.name()}")

18.3.3 Mesh计算器

网格 > 网格计算器

18.4 点云数据

18.4.1 加载点云

from qgis.core import QgsPointCloudLayer

# 加载LAS/LAZ
layer = QgsPointCloudLayer("/path/to/pointcloud.las", "Point Cloud", "pdal")

18.4.2 点云渲染

渲染类型

  • 属性渲染(颜色按属性)
  • RGB渲染(使用内置颜色)
  • 分类渲染
from qgis.core import QgsPointCloudAttributeByRampRenderer

renderer = QgsPointCloudAttributeByRampRenderer()
renderer.setAttribute('Z')
layer.setRenderer(renderer)

18.4.3 点云处理

# 使用PDAL工具
result = processing.run("pdal:filter", {
    'INPUT': layer,
    'FILTER': 'Z > 100',
    'OUTPUT': '/output.las'
})

18.5 GPS追踪

18.5.1 GPS面板

视图 > 面板 > GPS信息

18.5.2 GPS连接

支持的设备类型

  • NMEA设备
  • GPSD
  • 内部GPS(移动设备)

18.5.3 实时追踪

from qgis.core import QgsGpsConnection

# 连接GPS
connection = QgsGpsConnection(port)
connection.connect()

# 监听位置更新
connection.stateChanged.connect(on_gps_state_changed)

18.6 QField集成

18.6.1 QFieldSync插件

插件 > 管理和安装插件 > QFieldSync

18.6.2 项目打包

QFieldSync > 打包为QField项目

18.6.3 数据同步

QFieldSync > 同步来自QField的更改

18.7 数据验证

18.7.1 几何验证

result = processing.run("native:checkvalidity", {
    'INPUT_LAYER': layer,
    'METHOD': 2,
    'VALID_OUTPUT': 'memory:',
    'INVALID_OUTPUT': 'memory:',
    'ERROR_OUTPUT': 'memory:'
})

18.7.2 拓扑检查

矢量 > 几何工具 > 检查几何有效性

18.7.3 数据质量规则

# 设置属性约束
field_index = layer.fields().indexOf('status')
layer.setFieldConstraint(
    field_index,
    QgsFieldConstraints.ConstraintNotNull
)

# 设置表达式约束
layer.setConstraintExpression(
    field_index,
    '"status" IN (\'active\', \'inactive\')'
)

18.8 任务管理

18.8.1 QgsTask

from qgis.core import QgsTask, QgsApplication

class MyTask(QgsTask):
    def __init__(self, description):
        super().__init__(description, QgsTask.CanCancel)
        self.result = None
    
    def run(self):
        """后台执行"""
        total = 100
        for i in range(total):
            if self.isCanceled():
                return False
            # 执行操作
            self.setProgress(i / total * 100)
        return True
    
    def finished(self, result):
        """完成回调"""
        if result:
            print("任务完成")
        else:
            print("任务取消或失败")

# 运行任务
task = MyTask("我的任务")
QgsApplication.taskManager().addTask(task)

18.8.2 并行处理

from concurrent.futures import ThreadPoolExecutor

def process_feature(feature):
    # 处理单个要素
    return result

# 并行处理
with ThreadPoolExecutor(max_workers=4) as executor:
    results = list(executor.map(process_feature, features))

18.9 表单与属性编辑器

18.9.1 自定义表单

图层属性 > 属性表单
选择"拖放设计器"

18.9.2 小部件类型

小部件 用途
文本编辑 文本输入
范围 数值范围
值映射 下拉选择
值关系 关联表选择
日期/时间 日期选择
复选框 布尔值
附件 文件上传
颜色 颜色选择

18.9.3 表单Python逻辑

from qgis.PyQt.QtWidgets import QMessageBox

def form_open(dialog, layer, feature):
    """表单打开时调用"""
    # 自定义表单行为
    pass

def form_validate(dialog, layer, feature):
    """保存前验证"""
    if not feature['name']:
        QMessageBox.warning(dialog, "错误", "名称不能为空")
        return False
    return True

18.10 动作

18.10.1 创建动作

图层属性 > 动作 > 添加

18.10.2 动作类型

类型 说明
通用 系统命令
Python Python代码
打开URL 网页链接
打开文件 本地文件

18.10.3 动作示例

# Python动作示例
# 在动作中使用 [% "field" %] 引用字段值

# 打开网页
# 类型: 打开URL
# URL: https://www.google.com/search?q=[% "name" %]

# 运行脚本
# 类型: Python
from qgis.utils import iface
iface.messageBar().pushMessage("信息", f"选中: [% $id %]")

18.11 辅助存储

18.11.1 辅助存储概念

辅助存储允许在不修改源数据的情况下存储:

  • 标注位置调整
  • 符号旋转
  • 自定义属性

18.11.2 使用辅助存储

图层属性 > 辅助存储
或
右键标注 > 存储辅助数据

18.12 小结

本章介绍了QGIS的高级功能:

关键要点

  1. 掌握3D可视化配置
  2. 了解时态数据处理
  3. 熟悉Mesh和点云数据
  4. 了解GPS集成和移动应用
  5. 掌握数据验证方法
  6. 理解任务管理和并行处理

这些高级功能扩展了QGIS的应用范围。


上一章第17章 Web服务与OGC标准

下一章第19章 性能优化与最佳实践

posted @ 2026-01-08 14:04  我才是银古  阅读(25)  评论(0)    收藏  举报