15.3. 探索数据格式与字段

15.3.1. 栅格数据

GIS栅格数据是离散像元矩阵,表示地球表面上、上方或下方的要素/现象。栅格网格中的每个像元具有相同的尺寸,并且像元通常是矩形 (在QGIS中,它们总是矩形)。典型的栅格数据集包括遥感数据,如航空摄影,或卫星影像和建模数据,如高程或温度。

与矢量数据不同,栅格数据通常没有每个像元的关联数据库记录。它们是通过像素分辨率和栅格图层的角像素的X/Y坐标进行地理编码的。这允许QGIS在地图画布正确定位数据。

地理包格式便于在使用QGIS时存储栅格数据。流行且功能强大的GeoTiff格式是不错的选择。

QGIS利用栅格图层 (例如GeoTiff) 或相关 坐标信息文件 中的地理配准信息来正确显示数据。

15.3.2. 矢量数据

QGIS中可用的许多功能和工具的工作方式相同,而不用考虑矢量数据源。但是,由于格式规范 (地理包、ESRI形状文件、MapInfo和MicroStation文件格式、AutoCAD DXF、PostGIS、SpatiaLite、Oracle Spatial、MS SQL Server、SAP HANA Spatial 数据库等) 的差异,QGIS可能会以不同的方式处理其某些属性。 GDAL矢量驱动程序 提供了相关支持,该章节将进行详细介绍。

备注

QGIS支持点 (集)、线 (集)、多边形 (集)、圆弧、复合曲线、曲线多边形、曲线集、表面集要素类型,所有这些都可以选择Z和/或M值。

您还应该注意,某些驱动程序不支持其中一些要素类型,如圆弧、复合曲线、曲线多边形、曲线集、表面集要素类型。QGIS将对其进行转换。

15.3.2.1. 地理包

地理包 (GPKG) 格式与平台无关,作为SQLite数据库容器的工具,可用于储存矢量和栅格数据。该格式由开放地理空间联盟 (OGC) 定义,并于2014年发布。

地理包可用于在SQLite数据库中储存以下内容:

  • 矢量 要素

  • 影像瓦片矩阵集栅格 地图

  • 属性 (非空间数据)

  • 扩展

自 QGIS 3.8 版开始,地理包还可以储存QGIS工程。地理包图层可以含有JSON字段。

地理包是QGIS中矢量数据的默认格式。

15.3.2.2. ESRI形状文件格式

ESRI形状文件格式仍然是最常用的矢量文件格式之一,与地理包和SpatiaLite相比有一些限制。

ESRI形状文件格式数据集由多个文件组成,但以下三个是必需文件:

  1. .shp 文件包含要素几何图形

  2. .dbf 文件包含dBase格式的属性

  3. .shx 索引文件

ESRI形状文件格式数据集还可以包括后缀名为 .prj 的文件,该文件包含投影信息。虽然拥有投影文件非常有用,但不是必需的。除此之外,形状文件格式的数据集可以包含其他文件。有关更多详细信息,请参阅ESRI 技术规范

GDAL支持读写压缩的ESRI形状文件格式 (shzshp.zip) 。

改进ESRI形状文件格式数据集的性能

要改进ESRI形状文件格式数据集的绘图性能,可以创建空间索引。空间索引将提高缩放和平移的速度。QGIS的空间索使用 .qix 扩展名。

使用以下步骤创建索引:

  1. 加载ESRI形状文件格式数据集 (请参阅 浏览器面板)

  2. 打开 图层属性 对话框,方法是双击图例中的图层名,或右键单击并从上下文菜单选择 属性...

  3. 选项卡,单击 创建空间索引 按钮

加载 .prj 文件时的问题

如果使用 .prj 文件加载ESRI形状文件格式数据集,并且QGIS无法从该文件读取坐标参照系,则需要在图层的 图层属性 ► 源 选项卡通过单击 setProjection 选择CRS 按钮,手动定义正确的投影。这是因为 .prj 文件通常不提供在QGIS中使用的完整投影参数,并在 CRS 对话框中列出。

出于同样的原因,如果使用QGIS新建ESRI形状文件格式数据集,则会创建两个不同的投影文件:一个是具有有限投影参数的 .prj 文件,与ESRI软件兼容;另一个是提供CRS所有参数的 .qpj 文件。每当QGIS找到 .qpj 文件时,就会使用其代替 .prj

15.3.2.3. 分隔文本文件

分隔文本文件非常常见并被广泛使用,是因为它们的简单性和可读性 -- 数据可以在纯文本编辑器中查看和编辑。分隔文本文件是表列数据,其列由定义的字符分隔,行由换行符分隔。首行通常包含列名。一种常见的分隔文本文件类型是CSV (逗号分隔值),列之间用逗号分隔。分隔文本文件还可以包含位置信息 (请参阅 将几何图形信息存储在分隔文本文件中) 。

QGIS允许将分隔文本文件加载为图层或普通表 (请参阅 浏览器面板导入分隔文本文件) 。首先检查文件是否满足以下要求:

  1. 文件必须具有字段名分隔的标题行。这必须是数据的第一行 (最好是文本文件中的第一行)。

  2. 如果启用几何图形,文件必须包含定义几何图形的字段。这些字段的名称随意定义。

  3. X和Y坐标字段 (如果几何图形由坐标定义) 必须指定为数字。坐标系并不重要。

  4. 如果您有个非字符串列的CSV文件,可以附带CSVT文件 (请参阅章节 使用CSVT文件控制字段格式) 。

QGIS示例数据集中的高程点数据文件 elevp.csv (请参阅章节 下载示例数据) 是有效文本文件的示例:

X;Y;ELEV
-300120;7689960;13
-654360;7562040;52
1640;7512840;3
[...]

关于文本文件需要注意的一些事项:

  1. 示例文本文件使用 ; (分号) 作为分隔符 (任何字符都可以用于分隔字段)。

  2. 首行是标题行,包含字段 X, YELEV

  3. 无引号 (") 用于分隔文本字段

  4. X坐标包含在 X 字段中

  5. Y坐标包含在 Y 字段中

将几何图形信息存储在分隔文本文件中

分隔文本文件可以包含两种主要形式的几何图形信息:

  • 作为单独列中的坐标 (例如 Xcol, Ycol 等), 用于点几何图形数据;

  • 作为单列中的几何图形使用熟知文本 (WKT) 表示,用于几何图形类型。

支持具有曲线几何图形的要素 (圆弧、曲线多边形和复合曲线)。以下是分隔文本文件中几何图形类型的一些示例,其中几何图形编码为WKT:

Label;WKT_geom
LineString;LINESTRING(10.0 20.0, 11.0 21.0, 13.0 25.5)
CircularString;CIRCULARSTRING(268 415,227 505,227 406)
CurvePolygon;CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))
CompoundCurve;COMPOUNDCURVE((5 3, 5 13), CIRCULARSTRING(5 13, 7 15,
  9 13), (9 13, 9 3), CIRCULARSTRING(9 3, 7 1, 5 3))

分隔文本文件还支持几何图形的Z和M坐标:

LINESTRINGZ(10.0 20.0 30.0, 11.0 21.0 31.0, 11.0 22.0 30.0)

使用CSVT文件控制字段格式

加载CSV文件时,GDAL驱动程序假定所有字段都是字符串 (即文本),除非另有说明。您可以创建一个CSVT文件来告知GDAL (和QGIS) 不同列的数据类型:

类型

名称

示例

整数

整型

4

布尔

整型(布尔)

小数

实数

3.456

日期

日期 (YYYY-MM-DD)

2016-07-28

时间

时间 (HH:MM:SS+nn)

18:33:12+00

日期 & 时间

日期时间 (YYYY-MM-DD HH:MM:SS+nn)

2016-07-28 18:33:12+00

坐标X

坐标X

8.8249

坐标Y

坐标Y

47.2274

点(X)

点(X)

8.8249

点(Y)

点(Y)

47.2274

WKT

WKT

POINT(15 20)

CSVT文件是 一行 纯文本文件,数据类型用引号括起来,并用逗号分隔,例如:

"Integer","Real","String"

甚至可以指定每列的宽度和精度,例如:

"Integer(6)","Real(5.5)","String(22)"

此文件与 .csv 文件保存在同一文件夹,名称相同,但扩展名是 .csvt

您可以找到更多信息在 GDAL CSV 驱动程序

小技巧

检测字段类型

QGIS提供了自动检测字段类型和更改假定字段类型的可能性,而不是使用CSVT文件告知数据类型。

15.3.2.4. PostGIS图层

PostGIS图层存储在PostgreSQL数据库。PostGIS的优势在于空间索引、过滤和查询功能。使用PostGIS,矢量函数 (如选择和识别) 比QGIS中的GDAL图层可以更精准运行。

小技巧

PostGIS图层

通常,PostGIS图层由 geometry_columns 表中的条目标识。QGIS可以加载 geometry_columns 表中没有条目的图层,这包括表和视图。有关创建视图的信息,请参阅PostgreSQL手册。

本节包含一些有关QGIS如何访问PostgreSQL图层的详细信息。多数情况,QGIS应该可以简单地为您提供加载数据库表的列表,并会根据请求将其加载。但是,如果您在将PostgreSQL表加载到QGIS时遇到问题,下面的资料可能会帮助您理解QGIS信息,并为您提供修改PostgreSQL表或视图定义以允许QGIS将其加载。

备注

PostgreSQL数据库也可以储存QGIS工程。

主键

QGIS要求PostgreSQL图层包含一个可用作图层唯一键的列。对于表,通常意味着需要一个主键或一个具有唯一约束的列。在QGIS中,此列的类型需要为int4 (大小为4字节的整数)。或者,ctid列可以用作主键。如果表缺少这些项,将使用oid列代替。如果对列进行索引 (请注意,主键在PostgreSQL中是自动索引的),性能将得到提升。

QGIS提供了一个复选框 按ID选择 ,默认处于激活状态。此选项获取不带属性的ID,这在大多数情况下速度会更快。

视图

如果PostgreSQL图层是视图,那么存在同样的要求,但视图并不总是具有主键或唯一约束的列。您必须在QGIS对话框中定义一个主键字段 (必须是整数),然后才能加载视图。如果视图中不存在匹配的列,QGIS将不会加载该图层。如果出现这种情况,解决方案是修改视图,使其包含匹配的列 (整数类型、主键或具有唯一约束,最好具有索引)。

对于表,默认会激活复选框 按ID选择 (有关复选框的含义,请参阅上文)。当您使用高价值视图时,禁用此选项是明智的。

备注

PostgreSQL外部表

PostgreSQL提供程序未明确支持PostgreSQL外部表,将像视图一样处理。

QGIS layer_style 表和数据库备份

如果要使用 pg_dumppg_restore 命令备份PostGIS数据库,而QGIS保存的默认图层样式之后无法还原,则需要在使用还原命令之前将XML选项设置为 DOCUMENT:

  1. layer_style 表进行PLAIN备份

  2. 在文本编辑器打开文件

  3. 将行 SET xmloption = content; 更改为 SET XML OPTION DOCUMENT;

  4. 保存文件

  5. 使用 psql 在新数据库还原表

过滤数据库端

QGIS允许过滤服务器端已有的要素,为此请勾选 设置 ► 选项 ► 数据源 ► checkbox 如果允许,在服务器端执行表达式 。仅支持的表达式才会发送到数据库,使用不受支持的运算符或函数的表达式将回退到本地执行。

PostgreSQL支持的数据类型

PostgreSQL提供程序支持的数据类型包括:integer、float、boolean、binary object、varchar、geometry、timestamp、array、hstore 和 json。

15.3.2.5. 将数据导入PostgreSQL

可以使用多种工具将数据导入PostgreSQL/PostGIS,包括数据库管理器插件和命令行工具 shp2pgsql 与 ogr2ogr 。

数据库管理器

QGIS自带了一个名为 dbManager 数据库管理器 的核心插件。可用于加载数据,以及对架构的支持。请参阅 DB Manager Plugin 章节了解更多信息。

shp2pgsql

PostGIS包含一个名为 shp2pgsql 的实用程序,可用于将形状文件格式的数据集导入激活的PostGIS数据库。例如,要将名为 lakes.shp 的形状文件格式数据集导入到名为 gis_data 的PostgreSQL数据库,请使用以下命令:

shp2pgsql -s 2964 lakes.shp lakes_new | psql gis_data

这将在 gis_data 数据库创建一个名为 lakes_new 的新图层。新建图层具有2964的空间参照系标识符 (SRID)。有关空间参照系和投影的更多信息,请参阅 使用投影 章节。

小技巧

从PostGIS导出数据集

还有一个用于将PostGIS数据集导出为形状文件格式的工具: pgsql2shp ,这在您的PostGIS发行版中提供。

ogr2ogr

除了 shp2pgsql数据库管理器 ,PostGIS还有另一个用于输送地理数据的工具: ogr2ogr 。它是GDAL安装程序的一部分。

要将形状文件格式数据集导入PostGIS,请执行以下操作:

ogr2ogr -f "PostgreSQL" PG:"dbname=postgis host=myhost.de user=postgres
password=topsecret" alaska.shp

这将使用主机服务器 myhost.de 上的密码 topsecret 和用户名 postgres 将形状文件格式数据集 alaska.shp 导入到名为 postgis 的PostGIS数据库。

请注意,GDAL必须与PostgreSQL一起构建才能支持PostGIS。您可以键入如下内容进行检验 (在 nix):

ogrinfo --formats | grep -i post

如果您更喜欢使用PostgreSQL的 COPY 命令而不是默认的 INSERT INTO 方法,则可以导出以下环境变量 (至少在 nixosx 中可用):

export PG_USE_COPY=YES

ogr2ogr 不能像 shp2pgsl 那样创建空间索引,作为附加操作 (如下一节 提高性能 所述),您需要使用常规的SQL命令 CREATE INDEX 手动创建。

提高性能

从PostgreSQL数据库检索要素可能非常耗时,尤其是网络。您可以通过确保数据库中的每个图层都存在PostGIS空间索引来提高PostgreSQL图层的绘图性能。PostGIS支持创建GiST (广义搜索树) 索引,以加快空间搜索 (GiST索引信息来自PostGIS文档,可在 https://postgis.net 网站查阅)。

小技巧

可以使用数据库管理器为图层创建索引。您应该首先选择图层,然后单击 表 ► 编辑表, 并转到 索引 选项卡,之后单击 添加空间索引

创建GiST索引的语法为:

CREATE INDEX [indexname] ON [tablename]
  USING GIST ( [geometryfield] GIST_GEOMETRY_OPS );

请注意,对于较大的表,创建索引可能需要很长时间。创建索引后,应该执行 优化分析(Vacuum) 。更多信息请参阅PostGIS文档 (文献和网络参考 中的POSTGIS-PROJECT)。

以下示例为创建GiST索引:

gsherman@madison:~/current$ psql gis_data
Welcome to psql 8.3.0, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

gis_data=# CREATE INDEX sidx_alaska_lakes ON alaska_lakes
gis_data-# USING GIST (the_geom GIST_GEOMETRY_OPS);
CREATE INDEX
gis_data=# VACUUM ANALYZE alaska_lakes;
VACUUM
gis_data=# \q
gsherman@madison:~/current$

15.3.2.6. SpatiaLite图层

如果要使用SpatiaLite格式保存矢量图层,可以参照 从现有图层创建新图层 操作指南。选择 SpatiaLite 作为 格式 类型,然后输入 文件名图层名

此外,您可以选择 SQLite 格式,然后在 自定义选项 ► 数据源 添加 SPATIALITE=YES 字段。这个命令告知GDAL创建一个SpatiaLite数据库。另请参阅 https://gdal.org/drivers/vector/sqlite.html

QGIS还支持SpatiaLite中的可编辑视图。对于SpatiaLite数据管理,可以使用核心插件 数据库管理器

如果要新建SpatiaLite图层,请参阅 新建SpatiaLite图层 章节。

15.3.2.7. GeoJSON特定参数

导出图层 到GeoJSON时,有一些特定的 图层选项 可用。这些选项来自负责写入文件的GDAL:

  • COORDINATE_PRECISION 写入坐标的小数分隔符之后的最大位数。默认值为 15 (注意:对于 Lat Lon 坐标是 6 就足够了)。其余将截断以移除尾随零。

  • RFC7946 默认使用 GeoJSON 2008。如果设置为YES,将使用更新的 RFC 7946 标准。默认值为NO (因此是 GeoJSON 2008)。有关主要区别,请参阅 https://gdal.org/drivers/vector/geojson.html#rfc-7946-write-support 。简而言之只允许使用:EPSG:4326,其他CRS将被转换,多边形被写为遵循右手定则的方向, "bbox" 数组的值是 [west, south, east, north], 而不是 [minx, miny, maxx, maxy]。某些扩展名禁止在要素集、要素和几何图形对象中使用,默认坐标精度为 7 的小数位数。

  • WRITE_BBOX 设置为YES,可以包括要素和要素集层级的几何图形的边界框。

除了GeoJSON,还有个导出到 "GeoJSON - 换行符分隔" (请参阅 https://gdal.org/drivers/vector/geojsonseq.html) 的选项。您可以流式继而使用换行分隔的一种类型 (可能仅包含要素),而不是要素的要素集。

GeoJSON - 换行符分隔也有一些特定的图层选项可用:

  • COORDINATE_PRECISION 请参阅上文 (与GeoJSON相同)

  • RS 是否以 RS=0x1E 字符开始记录。区别在于要素的分隔方式:只通过换行 (LF) 字符 (换行分隔的JSON, geojsons),或通过准备记录分隔 (RS) 字符 (给定GeoJSON文本序列, geojsons)。默认是NO。如果未提供扩展名,则为文件提供 .json 扩展名。

15.3.2.8. SAP HANA 空间图层

本节包含一些有关QGIS如何访问 SAP HANA 图层的详细信息。多数情况,QGIS应该可以简单地为您提供加载数据库表和视图的列表,并会根据请求将其加载。但是,如果您在将 SAP HANA 表或视图加载到QGIS中时遇到问题,以下信息有助于您了解根本原因并帮助解决。

要素识别

如果您想使用所有QGIS的要素编辑功能,QGIS必须能够明确识别图层中的每个要素。在内部,QGIS使用64位符号整数识别要素,而负范围则保留用于特殊用途。

因此,SAP HANA 提供程序需要可以映射到正64位整数的唯一密钥,以完全支持QGIS的要素编辑功能。如果无法创建此类映射,您仍然可以查看要素,但可能无法进行编辑操作。

添加表

将表添加为图层时,SAP HANA 提供程序使用表的主键将其映射到唯一要素的ID。因此,要获得完整要素编辑支持,您需要具有表定义的主键。

SAP HANA 提供程序支持多列主键,但如果想获得最佳性能,主键应为 整数 类型的单列。

添加视图

将视图添加为图层时,SAP HANA 提供程序无法自动识别明确识别要素的列。此外,有些视图是只读的,无法编辑。

要获得完整要素编辑支持,视图必须是可更新的 (请检查问题视图 SYS.VIEWS 在系统视图中的列 IS_READ_ONLY ),并且必须手动为QGIS提供一个或多个用于识别要素的列。可以通过使用 图层 ► 添加图层 ► 添加 SAP HANA 空间图层 给定列,然后选择 要素ID 列中的列。为了获得最佳性能, 要素ID 值应该是单 整数 列。

15.3.3. 图层横渡 180° 经度

许多GIS软件包不使用横渡180度经度线的地理参照系 (lat/lon) 围绕图层。因此,如果在QGIS打开这样的图层,可以看到彼此位置相距甚远,它们应该相互靠近。在 图 15.27 中,地图画布最左侧的小点 (查塔姆群岛) 应该在新西兰主要岛屿右侧的网格内。

../../../_images/vectorNotWrapping.png

图 15.27 经纬度地图横渡 180° 经度线

15.3.3.1. PostGIS中求解

解决方法是使用PostGIS和 ST_ShiftLongitude 函数转换经度值。该函数读取几何图形中每个要素的每个组件中的每个点/顶点,并将其经度坐标从 -180..0° 移到 180..360° ,反之亦然 (如果在此范围之间)。该函数是对称的,因此结果是 -180..180° 数据表示 0..360° 及 0..360° 数据表示 -180..180° 。

../../../_images/vectorWrapping.png

图 15.28 应用 ST_ShiftLongitude 函数横渡 180° 经度

  1. 使用例如数据库管理器插件将数据导入PostGIS (将数据导入PostgreSQL) 。

  2. 使用PostGIS命令行界面发布以下命令:

    -- In this example, "TABLE" is the actual name of your PostGIS table
    update TABLE set geom=ST_ShiftLongitude(geom);
    
  3. 如果一切顺利,应该会收到更新要素数量的确认窗口。然后,您将可以加载地图并查看差异 (Figure_vector_crossing_map) 。