数据源管理与加载
第五章 数据源管理与加载
5.1 数据源概述
5.1.1 QGIS支持的数据类型
QGIS支持广泛的空间数据类型和格式:
| 数据类型 | 说明 | 常见格式 |
|---|---|---|
| 矢量数据 | 点、线、面几何 | Shapefile, GeoJSON, GeoPackage |
| 栅格数据 | 像素/格网数据 | GeoTIFF, JPEG, PNG |
| 网格数据 | 结构化/非结构化网格 | NetCDF, GRIB |
| 点云数据 | 三维点集 | LAS, LAZ |
| 矢量瓦片 | 预切片矢量数据 | MVT, PBF |
| 虚拟图层 | SQL查询结果 | - |
5.1.2 数据源类型
本地文件
- 文件系统中的数据文件
- 最常见的数据源类型
数据库
- PostgreSQL/PostGIS
- SpatiaLite
- Oracle Spatial
- MS SQL Server
网络服务
- WMS/WMTS(栅格瓦片)
- WFS(矢量要素)
- WCS(栅格覆盖)
- ArcGIS REST服务
其他来源
- GPS设备
- 内存图层
- 表格数据(CSV、Excel)
5.2 数据源管理器
5.2.1 打开数据源管理器
方法一:菜单
图层 > 数据源管理器
方法二:快捷键
Ctrl + L
方法三:工具栏
点击"打开数据源管理器"按钮
5.2.2 数据源管理器界面
┌─────────────────────────────────────────────────────────────┐
│ 数据源管理器 │
├───────────────┬─────────────────────────────────────────────┤
│ │ │
│ ○ 浏览器 │ │
│ ○ 矢量 │ 详细配置区域 │
│ ○ 栅格 │ │
│ ○ 网格 │ │
│ ○ 分隔文本 │ │
│ ○ GPS │ │
│ ○ SpatiaLite│ │
│ ○ PostgreSQL│ │
│ ○ MSSQL │ │
│ ○ Oracle │ │
│ ○ SAP HANA │ │
│ ○ WMS/WMTS │ │
│ ○ WFS │ │
│ ○ WCS │ │
│ ○ XYZ │ │
│ ○ 矢量瓦片 │ │
│ ○ ArcGIS REST│ │
│ ○ 虚拟图层 │ │
│ │ │
└───────────────┴─────────────────────────────────────────────┘
5.3 矢量数据加载
5.3.1 通过数据源管理器加载
步骤:
- 打开数据源管理器
- 选择"矢量"选项卡
- 选择源类型:文件、目录、数据库、协议
- 浏览或输入数据源路径
- 配置编码和选项
- 点击"添加"
源类型说明:
| 类型 | 说明 |
|---|---|
| 文件 | 单个矢量文件 |
| 目录 | 包含多个文件的文件夹 |
| 数据库 | 数据库连接 |
| 协议 | HTTP/FTP/云存储 |
5.3.2 通过浏览器面板加载
最简便的方法:
- 打开浏览器面板
- 导航到数据文件
- 双击文件或拖拽到地图画布
5.3.3 通过拖放加载
直接从文件管理器拖拽文件到QGIS:
- 支持拖拽单个文件
- 支持拖拽多个文件
- 支持拖拽文件夹
5.3.4 使用PyQGIS加载
from qgis.core import QgsVectorLayer, QgsProject
# 从Shapefile加载
layer = QgsVectorLayer("/path/to/file.shp", "layer_name", "ogr")
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
else:
print("图层加载失败")
# 从GeoJSON加载
layer = QgsVectorLayer("/path/to/file.geojson", "geojson_layer", "ogr")
# 从GeoPackage加载
uri = "/path/to/file.gpkg|layername=table_name"
layer = QgsVectorLayer(uri, "gpkg_layer", "ogr")
# 从PostGIS加载
uri = "dbname='database' host=localhost port=5432 user='user' password='pass' sslmode=disable key='id' srid=4326 type=MULTIPOLYGON table=\"schema\".\"table\" (geom)"
layer = QgsVectorLayer(uri, "postgis_layer", "postgres")
5.3.5 常见矢量格式
Shapefile (.shp)
特点:
- 最广泛支持的格式
- 包含多个文件(.shp, .shx, .dbf, .prj等)
- 字段名限制10字符
- 单一几何类型
加载示例:
layer = QgsVectorLayer("data.shp", "shapefile", "ogr")
GeoPackage (.gpkg)
特点:
- OGC标准格式
- SQLite数据库
- 支持多图层
- 无字段名限制
- 推荐的现代格式
加载示例:
layer = QgsVectorLayer("data.gpkg|layername=layer1", "gpkg", "ogr")
GeoJSON (.geojson, .json)
特点:
- 基于JSON的文本格式
- 易于Web使用
- 人类可读
- 默认WGS84坐标系
加载示例:
layer = QgsVectorLayer("data.geojson", "geojson", "ogr")
KML/KMZ
特点:
- Google Earth格式
- 支持样式信息
- 适合共享
加载示例:
layer = QgsVectorLayer("data.kml", "kml", "ogr")
CSV/文本文件
特点:
- 简单表格格式
- 需要坐标列
- 支持WKT几何
加载示例(通过分隔文本):
uri = "file:///path/data.csv?delimiter=,&xField=lon&yField=lat&crs=EPSG:4326"
layer = QgsVectorLayer(uri, "csv_layer", "delimitedtext")
5.4 栅格数据加载
5.4.1 通过数据源管理器加载
步骤:
- 打开数据源管理器
- 选择"栅格"选项卡
- 选择源类型
- 浏览栅格文件
- 点击"添加"
5.4.2 常见栅格格式
GeoTIFF (.tif, .tiff)
特点:
- 最常用的栅格格式
- 支持地理参考
- 支持多波段
- 支持压缩
加载示例:
layer = QgsRasterLayer("/path/to/raster.tif", "raster_name")
JPEG/PNG
特点:
- 需要世界文件(.jgw/.pgw)或元数据
- 压缩图像
加载示例:
layer = QgsRasterLayer("/path/to/image.jpg", "image")
ERDAS IMAGINE (.img)
加载示例:
layer = QgsRasterLayer("/path/to/image.img", "erdas")
ASCII Grid (.asc)
特点:
- 文本格式
- 适合DEM数据
加载示例:
layer = QgsRasterLayer("/path/to/grid.asc", "ascii_grid")
NetCDF (.nc)
特点:
- 科学数据格式
- 支持多维数据
- 常用于气象数据
加载示例:
uri = "NETCDF:\"/path/to/file.nc\":variable_name"
layer = QgsRasterLayer(uri, "netcdf")
5.4.3 使用PyQGIS加载
from qgis.core import QgsRasterLayer, QgsProject
# 加载GeoTIFF
layer = QgsRasterLayer("/path/to/raster.tif", "My Raster")
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
# 加载WMS
uri = "url=https://example.com/wms&layers=layer1&format=image/png&crs=EPSG:4326"
layer = QgsRasterLayer(uri, "WMS Layer", "wms")
# 获取栅格信息
print(f"波段数: {layer.bandCount()}")
print(f"宽度: {layer.width()}")
print(f"高度: {layer.height()}")
print(f"范围: {layer.extent()}")
5.5 数据库连接
5.5.1 PostGIS连接
通过GUI创建连接:
- 打开数据源管理器 > PostgreSQL
- 点击"新建"
- 配置连接参数:
- 名称:连接标识
- 主机:数据库服务器地址
- 端口:默认5432
- 数据库:数据库名称
- 认证:用户名/密码
- 点击"测试连接"
- 保存连接
连接参数示例:
名称: my_postgis
主机: localhost
端口: 5432
数据库: gisdb
SSL模式: 禁用
用户名: postgres
密码: ******
使用PyQGIS连接:
from qgis.core import QgsDataSourceUri, QgsVectorLayer
uri = QgsDataSourceUri()
uri.setConnection("localhost", "5432", "gisdb", "postgres", "password")
uri.setDataSource("public", "table_name", "geom", "", "gid")
layer = QgsVectorLayer(uri.uri(), "PostGIS Layer", "postgres")
5.5.2 SpatiaLite连接
创建连接:
- 数据源管理器 > SpatiaLite
- 点击"新建"
- 浏览.sqlite或.db文件
- 选择要加载的表
PyQGIS示例:
uri = "/path/to/database.sqlite|layername=table_name"
layer = QgsVectorLayer(uri, "SpatiaLite Layer", "ogr")
# 或使用SpatiaLite提供者
uri = QgsDataSourceUri()
uri.setDatabase("/path/to/database.sqlite")
uri.setDataSource("", "table_name", "geometry")
layer = QgsVectorLayer(uri.uri(), "Layer", "spatialite")
5.5.3 GeoPackage作为数据库
# 加载GeoPackage中的图层
gpkg_path = "/path/to/data.gpkg"
# 列出所有图层
from osgeo import ogr
ds = ogr.Open(gpkg_path)
for i in range(ds.GetLayerCount()):
print(ds.GetLayerByIndex(i).GetName())
# 加载特定图层
uri = f"{gpkg_path}|layername=my_table"
layer = QgsVectorLayer(uri, "GPKG Layer", "ogr")
5.5.4 Oracle Spatial
uri = QgsDataSourceUri()
uri.setConnection("hostname", "1521", "database", "user", "password")
uri.setDataSource("SCHEMA", "TABLE", "GEOMETRY", "")
layer = QgsVectorLayer(uri.uri(), "Oracle Layer", "oracle")
5.5.5 MS SQL Server
uri = "MSSQL:server=hostname;database=dbname;tables=schema.tablename;UID=user;PWD=password"
layer = QgsVectorLayer(uri, "MSSQL Layer", "mssql")
5.6 Web服务数据
5.6.1 WMS/WMTS
添加WMS图层:
- 数据源管理器 > WMS/WMTS
- 新建连接
- 输入服务URL
- 点击连接获取图层列表
- 选择图层
- 配置图像格式和CRS
- 添加到地图
常用WMS参数:
URL: https://example.com/wms
版本: 1.1.1 或 1.3.0
图像格式: image/png, image/jpeg
瓦片大小: 256x256
PyQGIS示例:
# WMS图层
uri = "url=https://example.com/wms&layers=layer1&format=image/png&crs=EPSG:4326&styles="
layer = QgsRasterLayer(uri, "WMS Layer", "wms")
# WMTS图层
uri = "url=https://example.com/wmts&layer=layer1&tilematrixset=GoogleMapsCompatible&format=image/png"
layer = QgsRasterLayer(uri, "WMTS Layer", "wms")
5.6.2 WFS
添加WFS图层:
- 数据源管理器 > WFS/OGC API - Features
- 新建连接
- 输入服务URL
- 连接获取图层列表
- 选择图层
- 配置过滤条件(可选)
- 添加
PyQGIS示例:
# WFS图层
uri = "https://example.com/wfs?service=WFS&version=2.0.0&request=GetFeature&typename=namespace:layer"
layer = QgsVectorLayer(uri, "WFS Layer", "WFS")
# 带过滤条件
uri = "https://example.com/wfs?service=WFS&version=2.0.0&request=GetFeature&typename=layer&filter=<Filter>...</Filter>"
layer = QgsVectorLayer(uri, "Filtered WFS", "WFS")
5.6.3 WCS
添加WCS图层:
- 数据源管理器 > WCS
- 新建连接
- 连接并选择覆盖范围
- 配置输出格式
- 添加
5.6.4 XYZ瓦片
添加XYZ瓦片:
- 数据源管理器 > XYZ
- 新建
- 输入URL模板:
https://example.com/tiles/{z}/{x}/{y}.png - 配置缩放级别范围
常用XYZ瓦片源:
OpenStreetMap:
https://tile.openstreetmap.org/{z}/{x}/{y}.png
Google卫星图:
https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}
Esri卫星图:
https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}
天地图(需要tk):
https://t0.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILECOL={x}&TILEROW={y}&TILEMATRIX={z}&tk=your_token
PyQGIS示例:
# XYZ瓦片
uri = "type=xyz&url=https://tile.openstreetmap.org/{z}/{x}/{y}.png"
layer = QgsRasterLayer(uri, "OpenStreetMap", "wms")
5.6.5 ArcGIS REST服务
添加ArcGIS服务:
- 数据源管理器 > ArcGIS REST Server
- 新建连接
- 输入服务URL
- 选择图层
服务类型:
- Feature Server(矢量)
- Map Server(瓦片/动态地图)
- Image Server(栅格)
PyQGIS示例:
# ArcGIS Feature Service
uri = "crs='EPSG:4326' url='https://services.arcgis.com/.../FeatureServer/0'"
layer = QgsVectorLayer(uri, "ArcGIS FS", "arcgisfeatureserver")
# ArcGIS Map Service
uri = "crs='EPSG:3857' format='PNG32' url='https://services.arcgis.com/.../MapServer'"
layer = QgsRasterLayer(uri, "ArcGIS MS", "arcgismapserver")
5.6.6 矢量瓦片
添加矢量瓦片:
- 数据源管理器 > 矢量瓦片
- 新建连接
- 输入URL或MBTiles文件路径
- 配置样式
PyQGIS示例:
# MVT服务
uri = "type=xyz&url=https://example.com/tiles/{z}/{x}/{y}.pbf"
layer = QgsVectorTileLayer(uri, "Vector Tiles")
5.7 特殊数据源
5.7.1 分隔文本(CSV)
加载CSV点数据:
- 数据源管理器 > 分隔文本
- 选择文件
- 配置:
- 文件格式(CSV/自定义分隔符)
- 几何定义(点坐标/WKT)
- X字段、Y字段
- 坐标系
- 添加
URI格式:
# 点坐标
uri = "file:///path/to/file.csv?delimiter=,&xField=longitude&yField=latitude&crs=EPSG:4326"
layer = QgsVectorLayer(uri, "CSV Points", "delimitedtext")
# WKT几何
uri = "file:///path/to/file.csv?delimiter=,&wktField=geometry&crs=EPSG:4326"
layer = QgsVectorLayer(uri, "CSV WKT", "delimitedtext")
# 无几何(表格)
uri = "file:///path/to/file.csv?delimiter=,&geomType=none"
layer = QgsVectorLayer(uri, "CSV Table", "delimitedtext")
5.7.2 Excel文件
加载Excel:
# 使用OGR加载
uri = "/path/to/file.xlsx|layername=Sheet1"
layer = QgsVectorLayer(uri, "Excel", "ogr")
需要GDAL编译时包含Excel支持。
5.7.3 GPS数据
加载GPX文件:
# 轨迹
layer = QgsVectorLayer("/path/to/track.gpx|layername=tracks", "GPS Track", "ogr")
# 路点
layer = QgsVectorLayer("/path/to/waypoints.gpx|layername=waypoints", "Waypoints", "ogr")
从GPS设备:
- 数据源管理器 > GPS
- 配置设备连接
- 下载数据
5.7.4 内存图层
创建内存图层:
from qgis.core import QgsVectorLayer, QgsFeature, QgsGeometry, QgsPointXY
# 创建点图层
layer = QgsVectorLayer("Point?crs=EPSG:4326", "memory_layer", "memory")
provider = layer.dataProvider()
# 添加字段
from qgis.core import QgsField
from qgis.PyQt.QtCore import QVariant
provider.addAttributes([
QgsField("name", QVariant.String),
QgsField("value", QVariant.Double)
])
layer.updateFields()
# 添加要素
feature = QgsFeature()
feature.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(116.0, 39.0)))
feature.setAttributes(["Point 1", 100.0])
provider.addFeature(feature)
layer.updateExtents()
QgsProject.instance().addMapLayer(layer)
5.7.5 虚拟图层
创建虚拟图层:
# 使用SQL查询创建虚拟图层
query = """
SELECT
a.id,
a.name,
b.population,
a.geometry
FROM cities a
JOIN stats b ON a.id = b.city_id
WHERE b.population > 1000000
"""
uri = f"?query={query}"
layer = QgsVectorLayer(uri, "Virtual Layer", "virtual")
通过GUI:
- 数据源管理器 > 虚拟图层
- 导入现有图层
- 编写SQL查询
- 添加
5.7.6 网格数据(Mesh)
加载Mesh数据:
from qgis.core import QgsMeshLayer
# NetCDF
layer = QgsMeshLayer("/path/to/data.nc", "Mesh", "mdal")
# GRIB
layer = QgsMeshLayer("/path/to/data.grib", "GRIB Mesh", "mdal")
5.7.7 点云数据
加载点云(QGIS 3.18+):
from qgis.core import QgsPointCloudLayer
layer = QgsPointCloudLayer("/path/to/pointcloud.las", "Point Cloud", "pdal")
if layer.isValid():
QgsProject.instance().addMapLayer(layer)
5.8 数据编码处理
5.8.1 字符编码问题
中文数据常见编码:
- UTF-8
- GBK/GB2312
- GB18030
加载时指定编码:
# 通过URI指定编码
uri = "/path/to/file.shp|encoding=GBK"
layer = QgsVectorLayer(uri, "Layer", "ogr")
# 或通过选项
options = QgsVectorLayer.LayerOptions()
options.encoding = "GBK"
layer = QgsVectorLayer("/path/to/file.shp", "Layer", "ogr", options)
全局设置默认编码:
设置 > 选项 > 数据源 > 属性表
默认属性表编码: UTF-8 / GBK
5.8.2 修复乱码
已加载图层修复:
# 更改图层编码
layer.setProviderEncoding("GBK")
layer.dataProvider().setEncoding("GBK")
在属性对话框中:
- 图层属性 > 源
- 数据源编码:选择正确编码
- 应用
5.9 图层管理
5.9.1 图层树操作
基本操作:
from qgis.core import QgsProject
project = QgsProject.instance()
# 获取所有图层
layers = project.mapLayers()
# 按名称获取图层
layer = project.mapLayersByName("layer_name")[0]
# 按ID获取图层
layer = project.mapLayer("layer_id_xxx")
# 移除图层
project.removeMapLayer(layer.id())
# 移除所有图层
project.removeAllMapLayers()
5.9.2 图层组管理
from qgis.core import QgsLayerTreeGroup, QgsProject
root = QgsProject.instance().layerTreeRoot()
# 创建组
group = root.addGroup("My Group")
# 添加图层到组
group.addLayer(layer)
# 嵌套组
subgroup = group.addGroup("Sub Group")
# 移动图层到组
node = root.findLayer(layer.id())
clone = node.clone()
group.insertChildNode(0, clone)
root.removeChildNode(node)
# 删除组
root.removeChildNode(group)
5.9.3 图层顺序
# 获取图层树
root = QgsProject.instance().layerTreeRoot()
# 移动图层到顶部
node = root.findLayer(layer.id())
clone = node.clone()
parent = node.parent()
parent.removeChildNode(node)
parent.insertChildNode(0, clone)
# 设置图层可见性
node.setItemVisibilityChecked(True)
node.setItemVisibilityCheckedRecursive(True)
5.9.4 图层缓存
# 启用图层缓存
layer.setCacheImage(None)
# 清除缓存
layer.triggerRepaint()
# 配置缓存设置
# 设置 > 选项 > 渲染 > 渲染缓存
5.10 数据源诊断
5.10.1 检查图层有效性
layer = QgsVectorLayer("/path/to/file.shp", "test", "ogr")
if not layer.isValid():
print("图层无效")
print(f"错误: {layer.error().message()}")
else:
print("图层加载成功")
print(f"要素数量: {layer.featureCount()}")
print(f"几何类型: {layer.geometryType()}")
print(f"CRS: {layer.crs().authid()}")
5.10.2 诊断数据提供者
provider = layer.dataProvider()
# 检查能力
caps = provider.capabilities()
print(f"支持添加要素: {bool(caps & QgsVectorDataProvider.AddFeatures)}")
print(f"支持删除要素: {bool(caps & QgsVectorDataProvider.DeleteFeatures)}")
print(f"支持修改属性: {bool(caps & QgsVectorDataProvider.ChangeAttributeValues)}")
print(f"支持修改几何: {bool(caps & QgsVectorDataProvider.ChangeGeometries)}")
# 获取错误信息
if provider.hasErrors():
for error in provider.errors():
print(error)
5.10.3 修复损坏数据
# 检查几何有效性
for feature in layer.getFeatures():
geom = feature.geometry()
if not geom.isGeosValid():
print(f"要素 {feature.id()} 几何无效")
# 尝试修复
fixed_geom = geom.makeValid()
if fixed_geom.isGeosValid():
print("修复成功")
5.11 小结
本章详细介绍了QGIS中数据源管理和加载的各种方法:
关键要点:
- QGIS支持多种数据类型和格式
- 数据源管理器是统一的数据加载入口
- 浏览器面板提供便捷的数据浏览
- 掌握常用数据格式的特点和加载方法
- 正确配置数据库和Web服务连接
- 处理好数据编码问题
熟练掌握数据加载是QGIS工作的基础。
上一章:第04章 用户界面详解
下一章:第06章 矢量数据处理

浙公网安备 33010602011771号