重要
翻译是一项社区工作:ref:你可以加入<translation_guidelines>。此页面目前翻译进度为 96.79%。
11.4. 探索数据格式与字段
11.4.1. 栅格数据
GIS栅格数据是离散像元矩阵,表示地球表面上、上方或下方的要素/现象。栅格网格中的每个像元具有相同的尺寸,并且像元通常是矩形 (在QGIS中,它们总是矩形)。典型的栅格数据集包括遥感数据,如航空摄影,或卫星影像和建模数据,如高程或温度。
与矢量数据不同,栅格数据通常没有每个像元的关联数据库记录。它们是通过像素分辨率和栅格图层的角像素的X/Y坐标进行地理编码的。这允许QGIS在地图画布正确定位数据。
地理包格式便于在使用QGIS时存储栅格数据。流行且功能强大的GeoTiff格式是不错的选择。
QGIS利用栅格图层 (例如GeoTiff) 或相关 坐标信息文件 中的地理配准信息来正确显示数据。
11.4.2. 矢量数据
Many of the features and tools available in QGIS work the same, regardless the vector data source. However, because of the differences in format specifications (GeoPackage, ESRI Shapefile, MapInfo and MicroStation file formats, AutoCAD DXF, PostGIS, SpatiaLite, Oracle Spatial, MS SQL Server, SAP HANA Spatial databases and many more), QGIS may handle some of their properties differently. Support is provided by the GDAL vector drivers. This section describes how to work with these specifics.
备注
QGIS支持点 (集)、线 (集)、多边形 (集)、圆弧、复合曲线、曲线多边形、曲线集、表面集要素类型,所有这些都可以选择Z和/或M值。
您还应该注意,某些驱动程序不支持其中一些要素类型,如圆弧、复合曲线、曲线多边形、曲线集、表面集要素类型。QGIS将对其进行转换。
11.4.2.1. GeoPackage
地理包 (GPKG) 格式与平台无关,作为SQLite数据库容器的工具,可用于储存矢量和栅格数据。该格式由开放地理空间联盟 (OGC) 定义,并于2014年发布。
地理包可用于在SQLite数据库中储存以下内容:
矢量 要素
影像瓦片矩阵集 和 栅格 地图
属性 (非空间数据)
扩展
自 QGIS 3.8 版开始,地理包还可以储存QGIS工程。地理包图层可以含有JSON字段。
地理包是QGIS中矢量数据的默认格式。
11.4.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
。
11.4.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
。
You can find more information at GDAL CSV Driver.
小技巧
检测字段类型
QGIS提供了自动检测字段类型和更改假定字段类型的可能性,而不是使用CSVT文件告知数据类型。
11.4.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。
11.4.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 (geom GIST_GEOMETRY_OPS);
CREATE INDEX
gis_data=# VACUUM ANALYZE alaska_lakes;
VACUUM
gis_data=# \q
gsherman@madison:~/current$
11.4.2.6. SpatiaLite图层
如果要使用SpatiaLite格式保存矢量图层,可以参照 从现有图层创建新图层 操作指南。选择 SpatiaLite
作为 格式 类型,然后输入 文件名 和 图层名 。
Also, you can select SQLite
as format and then add
SPATIALITE=YES
in the
field.
This tells GDAL to create a SpatiaLite database.
See also https://gdal.org/en/latest/drivers/vector/sqlite.html.
QGIS还支持SpatiaLite中的可编辑视图。对于SpatiaLite数据管理,可以使用核心插件 数据库管理器 。
如果要新建SpatiaLite图层,请参阅 新建SpatiaLite图层 章节。
11.4.2.7. GeoJSON特定参数
导出图层 到GeoJSON时,有一些特定的 图层选项 可用。这些选项来自负责写入文件的GDAL:
COORDINATE_PRECISION 写入坐标的小数分隔符之后的最大位数。默认值为 15 (注意:对于 Lat Lon 坐标是 6 就足够了)。其余将截断以移除尾随零。
RFC7946 by default GeoJSON 2008 will be used. If set to YES, the updated RFC 7946 standard will be used. Default is NO (thus GeoJSON 2008). See https://gdal.org/en/latest/drivers/vector/geojson.html#rfc-7946-write-support for the main differences, in short: only EPSG:4326 is allowed, other crs's will be transformed, polygons will be written such as to follow the right-hand rule for orientation, values of a "bbox" array are [west, south, east, north], not [minx, miny, maxx, maxy]. Some extension member names are forbidden in FeatureCollection, Feature and Geometry objects, the default coordinate precision is 7 decimal digits
WRITE_BBOX 设置为YES,可以包括要素和要素集层级的几何图形的边界框。
Besides GeoJSON there is also an option to export to "GeoJSON - Newline Delimited" (see https://gdal.org/en/latest/drivers/vector/geojsonseq.html). Instead of a FeatureCollection with Features, you can stream one type (probably only Features) sequentially separated with newlines.
GeoJSON - 换行符分隔也有一些特定的图层选项可用:
COORDINATE_PRECISION 请参阅上文 (与GeoJSON相同)
RS 是否以 RS=0x1E 字符开始记录。区别在于要素的分隔方式:只通过换行 (LF) 字符 (换行分隔的JSON, geojsons),或通过准备记录分隔 (RS) 字符 (给定GeoJSON文本序列, geojsons)。默认是NO。如果未提供扩展名,则为文件提供
.json
扩展名。
11.4.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 值应该是单 整数
列。
11.4.3. 图层横渡 180° 经度
许多GIS软件包不使用横渡180度经度线的地理参照系 (lat/lon) 围绕图层。因此,如果在QGIS打开这样的图层,可以看到彼此位置相距甚远,它们应该相互靠近。在 图 11.38 中,地图画布最左侧的小点 (查塔姆群岛) 应该在新西兰主要岛屿右侧的网格内。

图 11.38 经纬度地图横渡 180° 经度线
11.4.3.1. PostGIS中求解
A work-around is to transform the longitude values using PostGIS and the ST_ShiftLongitude function. This function reads every point/vertex in every component of every feature in a geometry, and shifts its longitude coordinate from -180..0° to 180..360° and vice versa if between these ranges. This function is symmetrical so the result is a 0..360° representation of a -180..180° data and a -180..180° representation of a 0..360° data.

图 11.39 应用 ST_ShiftLongitude 函数横渡 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) 。