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形状文件格式数据集由多个文件组成,但以下三个是必需文件:
.shp
文件包含要素几何图形.dbf
文件包含dBase格式的属性.shx
索引文件
ESRI形状文件格式数据集还可以包括后缀名为 .prj
的文件,该文件包含投影信息。虽然拥有投影文件非常有用,但不是必需的。除此之外,形状文件格式的数据集可以包含其他文件。有关更多详细信息,请参阅ESRI 技术规范 。
GDAL支持读写压缩的ESRI形状文件格式 (shz
和 shp.zip
) 。
改进ESRI形状文件格式数据集的性能
要改进ESRI形状文件格式数据集的绘图性能,可以创建空间索引。空间索引将提高缩放和平移的速度。QGIS的空间索使用 .qix
扩展名。
使用以下步骤创建索引:
加载ESRI形状文件格式数据集 (请参阅 浏览器面板)
打开 图层属性 对话框,方法是双击图例中的图层名,或右键单击并从上下文菜单选择
在 源 选项卡,单击 创建空间索引 按钮
加载 .prj 文件时的问题
如果使用 .prj
文件加载ESRI形状文件格式数据集,并且QGIS无法从该文件读取坐标参照系,则需要在图层的 选项卡通过单击 选择CRS 按钮,手动定义正确的投影。这是因为 .prj
文件通常不提供在QGIS中使用的完整投影参数,并在 CRS 对话框中列出。
出于同样的原因,如果使用QGIS新建ESRI形状文件格式数据集,则会创建两个不同的投影文件:一个是具有有限投影参数的 .prj
文件,与ESRI软件兼容;另一个是提供CRS所有参数的 .qpj
文件。每当QGIS找到 .qpj
文件时,就会使用其代替 .prj
。
15.3.2.3. 分隔文本文件
分隔文本文件非常常见并被广泛使用,是因为它们的简单性和可读性 -- 数据可以在纯文本编辑器中查看和编辑。分隔文本文件是表列数据,其列由定义的字符分隔,行由换行符分隔。首行通常包含列名。一种常见的分隔文本文件类型是CSV (逗号分隔值),列之间用逗号分隔。分隔文本文件还可以包含位置信息 (请参阅 将几何图形信息存储在分隔文本文件中) 。
QGIS允许将分隔文本文件加载为图层或普通表 (请参阅 浏览器面板 或 导入分隔文本文件) 。首先检查文件是否满足以下要求:
文件必须具有字段名分隔的标题行。这必须是数据的第一行 (最好是文本文件中的第一行)。
如果启用几何图形,文件必须包含定义几何图形的字段。这些字段的名称随意定义。
X和Y坐标字段 (如果几何图形由坐标定义) 必须指定为数字。坐标系并不重要。
如果您有个非字符串列的CSV文件,可以附带CSVT文件 (请参阅章节 使用CSVT文件控制字段格式) 。
QGIS示例数据集中的高程点数据文件 elevp.csv
(请参阅章节 下载示例数据) 是有效文本文件的示例:
X;Y;ELEV
-300120;7689960;13
-654360;7562040;52
1640;7512840;3
[...]
关于文本文件需要注意的一些事项:
示例文本文件使用
;
(分号) 作为分隔符 (任何字符都可以用于分隔字段)。首行是标题行,包含字段
X
,Y
和ELEV
。无引号 (
"
) 用于分隔文本字段X坐标包含在
X
字段中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_dump
和 pg_restore
命令备份PostGIS数据库,而QGIS保存的默认图层样式之后无法还原,则需要在使用还原命令之前将XML选项设置为 DOCUMENT
:
对
layer_style
表进行PLAIN备份在文本编辑器打开文件
将行
SET xmloption = content;
更改为SET XML OPTION DOCUMENT;
保存文件
使用 psql 在新数据库还原表
过滤数据库端
QGIS允许过滤服务器端已有的要素,为此请勾选 。仅支持的表达式才会发送到数据库,使用不受支持的运算符或函数的表达式将回退到本地执行。
PostgreSQL支持的数据类型
PostgreSQL提供程序支持的数据类型包括:integer、float、boolean、binary object、varchar、geometry、timestamp、array、hstore 和 json。
15.3.2.5. 将数据导入PostgreSQL
可以使用多种工具将数据导入PostgreSQL/PostGIS,包括数据库管理器插件和命令行工具 shp2pgsql 与 ogr2ogr 。
数据库管理器
QGIS自带了一个名为 数据库管理器 的核心插件。可用于加载数据,以及对架构的支持。请参阅 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。您可以键入如下内容进行检验 (在 ):
ogrinfo --formats | grep -i post
如果您更喜欢使用PostgreSQL的 COPY 命令而不是默认的 INSERT INTO 方法,则可以导出以下环境变量 (至少在 和 中可用):
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提供一个或多个用于识别要素的列。可以通过使用 给定列,然后选择 要素ID 列中的列。为了获得最佳性能, 要素ID 值应该是单 整数
列。
15.3.3. 图层横渡 180° 经度
许多GIS软件包不使用横渡180度经度线的地理参照系 (lat/lon) 围绕图层。因此,如果在QGIS打开这样的图层,可以看到彼此位置相距甚远,它们应该相互靠近。在 图 15.27 中,地图画布最左侧的小点 (查塔姆群岛) 应该在新西兰主要岛屿右侧的网格内。
15.3.3.1. PostGIS中求解
解决方法是使用PostGIS和 ST_ShiftLongitude 函数转换经度值。该函数读取几何图形中每个要素的每个组件中的每个点/顶点,并将其经度坐标从 -180..0° 移到 180..360° ,反之亦然 (如果在此范围之间)。该函数是对称的,因此结果是 -180..180° 数据表示 0..360° 及 0..360° 数据表示 -180..180° 。
使用例如数据库管理器插件将数据导入PostGIS (将数据导入PostgreSQL) 。
使用PostGIS命令行界面发布以下命令:
-- In this example, "TABLE" is the actual name of your PostGIS table update TABLE set geom=ST_ShiftLongitude(geom);
如果一切顺利,应该会收到更新要素数量的确认窗口。然后,您将可以加载地图并查看差异 (Figure_vector_crossing_map) 。