高级功能与扩展
第十八章 高级功能与扩展
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的高级功能:
关键要点:
- 掌握3D可视化配置
- 了解时态数据处理
- 熟悉Mesh和点云数据
- 了解GPS集成和移动应用
- 掌握数据验证方法
- 理解任务管理和并行处理
这些高级功能扩展了QGIS的应用范围。
上一章:第17章 Web服务与OGC标准
下一章:第19章 性能优化与最佳实践

浙公网安备 33010602011771号