数据源管理与加载

第五章 数据源管理与加载

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 通过数据源管理器加载

步骤

  1. 打开数据源管理器
  2. 选择"矢量"选项卡
  3. 选择源类型:文件、目录、数据库、协议
  4. 浏览或输入数据源路径
  5. 配置编码和选项
  6. 点击"添加"

源类型说明

类型 说明
文件 单个矢量文件
目录 包含多个文件的文件夹
数据库 数据库连接
协议 HTTP/FTP/云存储

5.3.2 通过浏览器面板加载

最简便的方法

  1. 打开浏览器面板
  2. 导航到数据文件
  3. 双击文件或拖拽到地图画布

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 通过数据源管理器加载

步骤

  1. 打开数据源管理器
  2. 选择"栅格"选项卡
  3. 选择源类型
  4. 浏览栅格文件
  5. 点击"添加"

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创建连接

  1. 打开数据源管理器 > PostgreSQL
  2. 点击"新建"
  3. 配置连接参数:
    • 名称:连接标识
    • 主机:数据库服务器地址
    • 端口:默认5432
    • 数据库:数据库名称
    • 认证:用户名/密码
  4. 点击"测试连接"
  5. 保存连接

连接参数示例

名称: 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连接

创建连接

  1. 数据源管理器 > SpatiaLite
  2. 点击"新建"
  3. 浏览.sqlite或.db文件
  4. 选择要加载的表

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图层

  1. 数据源管理器 > WMS/WMTS
  2. 新建连接
  3. 输入服务URL
  4. 点击连接获取图层列表
  5. 选择图层
  6. 配置图像格式和CRS
  7. 添加到地图

常用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图层

  1. 数据源管理器 > WFS/OGC API - Features
  2. 新建连接
  3. 输入服务URL
  4. 连接获取图层列表
  5. 选择图层
  6. 配置过滤条件(可选)
  7. 添加

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图层

  1. 数据源管理器 > WCS
  2. 新建连接
  3. 连接并选择覆盖范围
  4. 配置输出格式
  5. 添加

5.6.4 XYZ瓦片

添加XYZ瓦片

  1. 数据源管理器 > XYZ
  2. 新建
  3. 输入URL模板:https://example.com/tiles/{z}/{x}/{y}.png
  4. 配置缩放级别范围

常用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服务

  1. 数据源管理器 > ArcGIS REST Server
  2. 新建连接
  3. 输入服务URL
  4. 选择图层

服务类型

  • 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 矢量瓦片

添加矢量瓦片

  1. 数据源管理器 > 矢量瓦片
  2. 新建连接
  3. 输入URL或MBTiles文件路径
  4. 配置样式

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点数据

  1. 数据源管理器 > 分隔文本
  2. 选择文件
  3. 配置:
    • 文件格式(CSV/自定义分隔符)
    • 几何定义(点坐标/WKT)
    • X字段、Y字段
    • 坐标系
  4. 添加

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设备

  1. 数据源管理器 > GPS
  2. 配置设备连接
  3. 下载数据

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

  1. 数据源管理器 > 虚拟图层
  2. 导入现有图层
  3. 编写SQL查询
  4. 添加

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

在属性对话框中

  1. 图层属性 > 源
  2. 数据源编码:选择正确编码
  3. 应用

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中数据源管理和加载的各种方法:

关键要点

  1. QGIS支持多种数据类型和格式
  2. 数据源管理器是统一的数据加载入口
  3. 浏览器面板提供便捷的数据浏览
  4. 掌握常用数据格式的特点和加载方法
  5. 正确配置数据库和Web服务连接
  6. 处理好数据编码问题

熟练掌握数据加载是QGIS工作的基础。


上一章第04章 用户界面详解

下一章第06章 矢量数据处理

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