当前位置: 首页 > news >正文

第16章 - 与 QGIS 集成

第16章:与 QGIS 集成

16.1 概述

QGIS 是功能强大的开源桌面 GIS 软件,与 PostGIS 有着深度集成,支持直接编辑和分析 PostGIS 数据。

16.2 连接 PostGIS

16.2.1 创建连接

1. 打开 QGIS
2. 浏览器面板 → PostgreSQL → 右键 → 新建连接
3. 填写连接信息:- 名称: PostGIS_Local- 主机: localhost- 端口: 5432- 数据库: gis_db- 用户名: postgres- 密码: ******
4. 测试连接 → 确定

16.2.2 加载数据

1. 展开 PostgreSQL 连接
2. 展开数据库和模式
3. 双击表名或拖拽到地图画布
4. 或使用 图层 → 添加图层 → 添加 PostGIS 图层

16.2.3 使用 DB Manager

1. 数据库 → DB 管理器
2. 选择 PostGIS 连接
3. 功能:- 浏览表结构- 执行 SQL 查询- 导入导出数据- 创建空间索引- 查看表统计信息

16.3 数据编辑

16.3.1 启用编辑

1. 选择 PostGIS 图层
2. 图层 → 切换编辑 或 点击编辑按钮
3. 使用数字化工具编辑要素
4. 保存编辑 → 自动同步到数据库

16.3.2 编辑工具

  • 添加要素:点、线、面
  • 移动要素
  • 节点编辑
  • 分割要素
  • 合并要素
  • 删除要素
  • 属性编辑

16.3.3 事务支持

1. 设置 → 选项 → 数据源
2. 启用 "对 PostgreSQL 使用单次事务编辑"
3. 多个编辑操作在一个事务中完成

16.4 空间查询

16.4.1 使用 DB Manager 执行 SQL

-- 在 DB Manager 中执行 PostGIS 查询
SELECT name, ST_Area(geom::geography) AS area_m2
FROM districts
WHERE ST_Intersects(geom, ST_MakeEnvelope(116, 39, 117, 40, 4326));-- 将结果加载为图层
-- 勾选 "将结果加载为新图层"
-- 设置几何列和主键

16.4.2 创建虚拟图层

-- 使用虚拟图层执行 PostGIS 函数
SELECT p.id,p.name,d.name AS district,p.geometry
FROM poi AS p
JOIN districts AS d ON ST_Contains(d.geometry, p.geometry)

16.5 处理工具

16.5.1 调用 PostGIS 函数

QGIS 处理工具箱中集成了 PostGIS 函数:

处理 → 工具箱 → Database → - 执行 SQL- 导入到 PostGIS- 从 PostGIS 导出- PostGIS 缓冲区- PostGIS 溶解

16.5.2 批处理

# 使用 Python 控制台批量处理
from qgis.core import QgsDataSourceUri, QgsVectorLayeruri = QgsDataSourceUri()
uri.setConnection("localhost", "5432", "gis_db", "postgres", "password")
uri.setDataSource("public", "poi", "geom", "", "id")layer = QgsVectorLayer(uri.uri(), "poi", "postgres")

16.6 样式和符号

16.6.1 保存样式到数据库

1. 设置图层样式
2. 图层 → 属性 → 样式 → 样式 → 保存样式
3. 选择 "保存到数据库"
4. 设置样式名称和描述

16.6.2 加载数据库样式

1. 图层 → 属性 → 样式 → 样式 → 加载样式
2. 选择 "从数据库加载"
3. 选择样式

16.7 数据导入导出

16.7.1 导入到 PostGIS

1. 使用 DB Manager- 表 → 导入图层/文件- 选择源图层- 设置目标表名- 配置选项(SRID、主键、索引)2. 使用处理工具- 处理 → 工具箱 → Database → 导入到 PostGIS3. 使用拖放- 将图层拖到 DB Manager 中的模式

16.7.2 从 PostGIS 导出

1. 右键图层 → 导出 → 保存要素为
2. 选择格式(Shapefile、GeoJSON、GeoPackage 等)
3. 设置导出选项

16.8 性能优化

16.8.1 图层优化

1. 使用空间过滤- 图层属性 → 源 → 要素子集- 输入 PostGIS 过滤表达式2. 简化几何显示- 图层属性 → 渲染 → 在渲染时简化几何图形3. 使用预计算视图- 为复杂查询创建物化视图

16.8.2 渲染优化

1. 设置比例尺可见性
2. 使用缓存
3. 启用并行渲染
4. 使用瓦片图层

16.9 Python 脚本

16.9.1 PyQGIS 连接 PostGIS

from qgis.core import QgsDataSourceUri, QgsVectorLayer, QgsProject# 创建连接
uri = QgsDataSourceUri()
uri.setConnection("localhost", "5432", "gis_db", "postgres", "password")
uri.setDataSource("public", "poi", "geom", "category='餐饮'", "id")# 创建图层
layer = QgsVectorLayer(uri.uri(), "餐饮POI", "postgres")# 添加到项目
QgsProject.instance().addMapLayer(layer)# 执行 PostGIS 查询
uri.setDataSource("public", "", "geom", "", "id")
uri.setParam('sql', """SELECT id, name, ST_Buffer(geom::geography, 500)::geometry AS geomFROM poi WHERE category = '医院'
""")
buffer_layer = QgsVectorLayer(uri.uri(), "医院服务区", "postgres")

16.9.2 批量处理

import processing
from qgis.core import QgsVectorLayer# 使用处理算法
result = processing.run("native:buffer", {'INPUT': 'postgres://host=localhost dbname=gis_db user=postgres password=password table="public"."poi" (geom)','DISTANCE': 100,'OUTPUT': 'memory:'
})# 导入到 PostGIS
processing.run("qgis:importintopostgis", {'INPUT': result['OUTPUT'],'DATABASE': 'gis_db','SCHEMA': 'public','TABLENAME': 'poi_buffer','PRIMARY_KEY': 'id','GEOMETRY_COLUMN': 'geom'
})

16.10 本章小结

本章详细介绍了 QGIS 与 PostGIS 的集成:

  1. 连接配置:创建数据库连接
  2. 数据编辑:直接编辑 PostGIS 数据
  3. 空间查询:DB Manager 和虚拟图层
  4. 处理工具:调用 PostGIS 函数
  5. 样式管理:数据库样式存储
  6. 数据交换:导入导出
  7. Python 脚本:自动化处理

16.11 下一步

在下一章中,我们将学习编程语言集成,包括:

  • Python 连接 PostGIS
  • Java 连接 PostGIS
  • .NET 连接 PostGIS

相关资源

  • QGIS 文档
  • PyQGIS 开发者手册

← 上一章目录下一章 →
http://www.jsqmd.com/news/327339/

相关文章:

  • “信息安全”与“网络安全”区别
  • 《文明6》Leaders.xml 文件标签解析指南
  • 文明六MOD入门:从零开始制作一个巫师文明
  • 实用指南:虚拟现实与增强现实:改变我们的数字体验
  • Skills精选
  • 第16章:性能优化与最佳实践
  • 开题报告_基于知识图谱的个性化学习微信小程序设计与开发
  • 第17章:实战案例与综合应用
  • 文明6 MOD制作入门:解密官方阿兹特克配置文件
  • 《文明6》XML建筑文件全标签解析:从代码到游戏的完整指南
  • 第03章 - 核心架构与组件设计
  • 药店药品管理系统的设计与实现开题报告
  • 文明6 Mod制作核心组件关系解密:从XML到游戏的奇幻漂流
  • 《Foundation 开关:深度解析其原理与应用》
  • 药膳食堂点餐系统的设计与实现 开题报告
  • 开题报告+基于Python的家庭安防监控系统设计与实现
  • 选择(Selectable)
  • Java语言提供了八种基本类型。六种数字类型【函数不可123】
  • 开题报告_基于SSM的校园报修管理系统的设计与实现
  • 开题报告_基于Vue框架的影院购票APP的设计与实现
  • 产品经理案例分析(二):电商产品立项:从 0 到 1 启动前,这 5 件事必须想透
  • 开题报告+ 基于Android的运动会管理APP设计与实现)
  • 【易经系列】六五:黄裳,元吉。
  • 【易经系列】上六:龙战于野,其血玄黄。
  • [LCD Monitor] 液晶显示器超频设置方法
  • [特殊字符]_可扩展性架构设计:从单体到微服务的性能演进[20260131140509]
  • foobar2000 v2.25.6 汉化版
  • 算法:二叉树最大路径和
  • 社会网络仿真软件:NodeXL_(14).社会网络理论在NodeXL中的实现
  • 百亿美元赌注变数,AI军备竞赛迎来转折点?