15.3. 浏览数据格式和字段
15.3.1. 栅格数据
地理信息系统栅格数据是由离散单元组成的矩阵,表示地球表面上、上方或下方的特征/现象。栅格中的每个单元都具有相同的大小,并且单元通常是矩形的(在QGIS中,它们始终是矩形)。典型的栅格数据集包括遥感数据(如航空摄影)或卫星图像以及建模数据(如海拔或温度)。
与矢量数据不同,栅格数据通常没有每个单元的关联数据库记录。它们由栅格层的像素分辨率和角像素的X/Y坐标进行地理编码。这使得QGIS能够在地图画布上正确地定位数据。
使用QGIS时,GeoPackage格式便于存储栅格数据。流行且功能强大的GeoTiff格式是一个很好的替代方案。
QGIS利用栅格层内的地理配准信息(例如, GeoTiff )或关联的 world file 以正确显示数据。
15.3.2. 矢量数据
无论矢量数据源是什么,QGIS中的许多可用功能和工具都是相同的。但是,由于格式规范(GeoPackage、ESRI Shapefile、MapInfo和MicroStation文件格式、AutoCAD DXF、PostGIS、SpatiaLite、Oracle Spatial、MS SQL Server、SAP HANA空间数据库等)的不同,QGIS可能会以不同的方式处理它们的某些特性。支持由 GDAL vector drivers 。本节介绍如何使用这些细节。
备注
QGIS支持(多)点、(多)线、(多)多边形、CircularString、CompoundCurve、CurvePolygon、MultiCurve、多曲面要素类型,所有这些要素类型都可以选择使用Z和/或M值。
您还应该注意到,一些驱动程序不支持其中一些要素类型,如CircularString、CompoundCurve、CurvePolygon、MultiCurve、多曲面要素类型。QGIS将对它们进行转换。
15.3.2.1. GeoPackage
这个 GeoPackage (GPKG)格式独立于平台,作为SQLite数据库容器实现,可用于存储矢量和栅格数据。该格式由开放地理空间联盟(OGC)定义,并于2014年发布。
GeoPackage可用于在SQLite数据库中存储以下内容:
vector 特征
tile matrix sets of imagery 和 raster 地图
属性(非空间数据)
扩展部分
从QGIS版本3.8开始,GeoPackage还可以存储QGIS项目。GeoPackage层可以具有JSON字段。
GeoPackage是QGIS中矢量数据的默认格式。
15.3.2.2. Esri shapefile格式
ESRI Shapefile格式仍然是最常用的矢量文件格式之一,即使与GeoPackage和SpatiaLite相比有一些限制。
ESRI Shapefile格式的数据集由多个文件组成。以下三项是必需的:
.shp
包含要素几何的文件.dbf
包含dBASE格式的属性的文件.shx
索引文件
ESRI shapefile格式数据集还可以包含具有 .prj
后缀,它包含投影信息。虽然有一个投影文件是非常有用的,但它不是强制性的。Shapefile格式的数据集可以包含其他文件。有关更多详细信息,请参阅ESRI technical specification 。
GDAL支持对压缩的ESRI shapefile格式进行读写 (shz
和 shp.zip
)。
Improving Performance for ESRI Shapefile format datasets
要提高ESRI Shapefile格式数据集的绘制性能,可以创建空间索引。空间索引将提高缩放和平移的速度。QGIS使用的空间索引具有 .qix
分机。
使用以下步骤创建索引:
加载ESRI shapefile格式的数据集(请参阅 浏览器面板 )
打开 Layer Properties 对话框,方法是双击图例中的图层名称或右键单击并选择 从上下文菜单中
在 Source 选项卡中,单击 Create Spatial Index 按钮
Problem loading a .prj file
如果加载ESRI shapefile格式的数据集时 .prj
文件,并且QGIS无法从该文件中读取坐标参考系,则需要在 通过单击层的 Select CRS 纽扣。这是由于这样一个事实
.prj
文件通常不提供在QGIS中使用并在中列出的完整投影参数 CRS 对话框中。
出于同样的原因,如果使用QGIS创建新的ESRI shapefile格式数据集,则会创建两个不同的投影文件: .prj
具有有限投影参数的文件,与ESRI软件兼容,并且 .qpj
文件,提供CRS的所有参数。无论何时QGIS发现 .qpj
文件,则将使用该文件而不是 .prj
。
15.3.2.3. 分隔的文本文件
带分隔符的文本文件非常常见和广泛使用,因为它们的简单性和可读性--可以在纯文本编辑器中查看和编辑数据。带分隔符的文本文件是表格数据,其中列由定义的字符分隔,行由换行符分隔。第一行通常包含列名。常见的分隔文本文件类型是CSV(逗号分隔值),各列之间用逗号分隔。分隔文本文件还可以包含位置信息(请参见 在带分隔符的文本文件中存储几何信息 )。
QGIS允许您将带分隔符的文本文件加载为图层或普通表(请参见 浏览器面板 或 导入带分隔符的文本文件 )。首先检查文件是否满足以下要求:
该文件必须具有带分隔符的字段名称标题行。这必须是数据的第一行(理想情况下是文本文件中的第一行)。
如果应启用几何体,则文件必须包含定义几何体的字段(S)。这些字段(S)可以有任何名称。
X和Y坐标字段(如果几何图形由坐标定义)必须指定为数字。坐标系并不重要。
如果您有一个包含非字符串列的CSV文件,则可以有一个附带的CSVT文件(请参见部分 使用CSVT文件控制字段格式 )。
高程点数据文件 elevp.csv
在QGIS示例数据集中(请参阅一节 下载样本数据 )是有效文本文件的一个示例:
X;Y;ELEV
-300120;7689960;13
-654360;7562040;52
1640;7512840;3
[...]
有关文本文件的一些注意事项:
示例文本文件使用
;
(分号)作为分隔符(可以使用任何字符来分隔字段)。第一行是标题行。它包含以下字段
X
,Y
和ELEV
。无引号 (
"
)用于分隔文本字段X坐标包含在
X
字段Y坐标包含在
Y
字段
在带分隔符的文本文件中存储几何信息
带分隔符的文本文件可以包含两种主要形式的几何信息:
作为单独列中的坐标(例如,
Xcol
,Ycol
...),用于点几何图形数据;作为任何几何类型的单列中的几何的公知文本(WKT)表示。
支持具有弯曲几何图形(CircularStrong、CurvePolygon和CompoundCurve)的要素。以下是包含编码为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 |
日期和时间 |
DATETIME(YYYY-MM-DD hh:mm:ss+nn) |
2016-07-28 18:33:12+00 |
CoordX |
CoordX |
8.8249 |
坐标Y |
坐标Y |
47.2274 |
点(X) |
点(X) |
8.8249 |
点(Y) |
点(Y) |
47.2274 |
WKT |
WKT |
分数(15 20) |
CSVT文件是 ONE line 数据类型用引号括起来并用逗号分隔的纯文本文件,例如::
"Integer","Real","String"
您甚至可以指定每列的宽度和精度,例如::
"Integer(6)","Real(5.5)","String(22)"
此文件保存在与 .csv
文件,但名称相同,但 .csvt
作为分机。
You can find more information at GDAL CSV Driver 。
小技巧
Detect Field Types
QGIS提供了自动检测字段类型和更改假定的字段类型的可能性,而不是使用CSVT文件来告知数据类型。
15.3.2.4. PostGIS图层
PostGIS图层存储在PostgreSQL数据库中。PostGIS的优势在于空间索引、过滤和查询能力。使用PostGIS,矢量函数(例如选择和识别)的工作比使用QGIS中的GDAL图层更准确。
小技巧
PostGIS Layers
通常,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提供了一个复选框 Select at id 默认情况下处于激活状态。此选项获取不带属性的ID,这在大多数情况下会更快。
观
如果PostgreSQL层是一个视图,则存在相同的要求,但视图并不总是具有唯一约束的主键或列。在加载视图之前,您必须在QGIS对话框中定义一个主键字段(必须是整数)。如果视图中不存在合适的列,则QGIS将不加载层。如果发生这种情况,解决方案是更改视图,使其包含合适的列(一种类型的整数和主键,或者具有唯一约束,最好是索引)。
对于表,有一个复选框 Select at id 默认情况下处于激活状态(有关该复选框的含义,请参阅上文)。当您使用昂贵的视图时,禁用此选项是有意义的。
备注
PostgreSQL foreign table
PostgreSQL提供程序并不明确地支持PostgreSQL外表,因此将像处理视图一样处理这些表。
QGIS LAYER_STYLE表和数据库备份
如果要使用来备份PostGIS数据库 pg_dump
和 pg_restore
命令以及由QGIS保存的默认图层样式之后无法恢复,您需要将XML选项设置为 DOCUMENT
在RESTORE命令之前:
创建一个简单的备份
layer_style
表格在文本编辑器中打开该文件
更改线路
SET xmloption = content;
vt.进入,进入SET XML OPTION DOCUMENT;
保存文件
使用psql恢复新数据库中的表
过滤数据库端
QGIS allows to filter features already on server side. Check
to do so.
Only supported expressions will be sent to the database.
Expressions using unsupported operators or functions will gracefully
fallback to local evaluation.
支持PostgreSQL数据类型
PostgreSQL提供程序支持的数据类型包括:整数、浮点、布尔、二进制对象、varchar、几何、时间戳、数组、hstore和json。
15.3.2.5. 将数据导入到PostgreSQL
可以使用几种工具将数据导入到PostgreSQL/PostGIS中,包括DB Manager插件和命令行工具shp2pgsql和ogr2ogr。
数据库管理器
QGIS附带了一个核心插件,名为 DB Manager 。它可用于加载数据,并包括对模式的支持。请参见部分 数据库管理器插件 以获取更多信息。
Shp2pgsql
PostGIS包括一个名为 shp2pgsql ,可用于将Shapefile格式的数据集导入到启用了PostGIS的数据库中。例如,要导入名为的shapefile格式数据集 lakes.shp
添加到名为的PostgreSQL数据库中 gis_data
,请使用以下命令:
shp2pgsql -s 2964 lakes.shp lakes_new | psql gis_data
这将创建一个名为的新图层 lakes_new
在 gis_data
数据库。新层的空间参考标识符(SRID)将为2964。请参见部分 使用投影 有关空间参考系和投影的更多信息。
小技巧
Exporting datasets from PostGIS
还有一个用于将PostGIS数据集导出为Shapefile格式的工具: pgsql2shp 。它在您的PostGIS发行版中提供。
Or2ogr
除了……之外 shp2pgsql 和 DB Manager ,在PostGIS中还有另一个用于馈送地理数据的工具: ogr2ogr 。它是GDAL安装的一部分。
要将Shapefile格式的数据集导入到PostGIS中,请执行以下操作:
ogr2ogr -f "PostgreSQL" PG:"dbname=postgis host=myhost.de user=postgres
password=topsecret" alaska.shp
这将导入shapefile格式的数据集 alaska.shp
添加到PostGIS数据库中 postgis 使用用户 postgres 使用密码 topsecret 在主机服务器上 myhost.de 。
请注意,GDAL必须使用PostgreSQL构建才能支持PostGIS。可以通过键入(In)来验证这一点 ):
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索引信息取自https://postgis.net).上的PostGIS文档
小技巧
您可以使用DBManager为您的层创建索引。您应该首先选择该层,然后单击 Add Spatial Index 。
,请访问 选项卡,然后单击创建GIST索引的语法为::
CREATE INDEX [indexname] ON [tablename]
USING GIST ( [geometryfield] GIST_GEOMETRY_OPS );
请注意,对于大型表,创建索引可能需要很长时间。创建索引后,应执行 VACUUM ANALYZE
。请参阅PostGIS文档(中的POSTGIS-项目 文献和网络参考文献 )了解更多信息。
以下示例创建一个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
AS Format 并同时输入两者 File name 和 Layer name 。
此外,您还可以选择 SQLite
作为格式,然后添加 SPATIALITE=YES
在 菲尔德。这将告诉GDAL创建一个SpatiaLite数据库。另请参阅https://gdal.org/drivers/vector/sqlite.html.
QGIS还支持SpatiaLite中的可编辑视图。对于SpatiaLite数据管理,您还可以使用核心插件 DB Manager 。
如果要创建新的SpatiaLite层,请参阅部分 创建新的SpatiaLite层 。
15.3.2.7. GeoJSON特定参数
什么时候 exporting layers 对于GeoJSON,有一些特定的 Layer Options 可用。这些选项来自负责写入文件的GDAL:
COORDINATE_PRECISION 要写入坐标的小数分隔符后的最大位数。默认为15(注意:对于纬度坐标6就足够了)。将进行截断以删除尾随零。
RFC7946 默认情况下,将使用GeoJSON 2008。如果设置为YES,将使用更新的RFC 7946标准。默认设置为no(因此是GeoJSON 2008)。主要区别见https://gdal.org/drivers/vector/geojson.html#rfc-7946-write-support,简而言之:只允许EPSG4326,其他CRS将被转换,多边形的编写将遵循方向的右侧规则,“bbox”数组的值为 [west, south, east, north] ,不是 [minx, miny, maxx, maxy] 。某些扩展模块成员名称在要素集合、要素和几何对象中被禁用,默认坐标精度为7位小数
WRITE_BBOX 设置为YES可在要素和要素集合级别包括几何的边界框
除GeoJSON外,还可以选择导出为“GeoJSON-换行符分隔”(请参阅https://gdal.org/drivers/vector/geojsonseq.html).您可以以换行符顺序分隔的一种类型(可能只有Feature)流,而不是带Feature的FeatureCollection。
GeoJSON-换行符分隔还提供了一些特定的层选项:
COORDINATE_PRECISION 请参见上文(与GeoJSON相同)
RS 是否以RS=0x1E字符开始记录。不同之处在于要素的分隔方式:仅使用换行符(LF)字符(换行符分隔的JSON,Geojsonl),或者还使用前缀记录分隔符(RS)字符(给出GeoJSON文本序列,Geojson)。默认为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提供程序支持多列主键,但如果您希望获得最佳性能,则您的主键应该是类型为 INTEGER
。
添加视图
将视图添加为层时,SAP HANA提供程序无法自动标识明确标识要素的列。此外,有些视图是只读的,不能编辑。
要具有完整的要素编辑支持,视图必须是可更新的(选中列 IS_READ_ONLY
在系统视图中 SYS.VIEWS
对于有问题的视图),并且您必须手动为QGIS提供一个或多个标识特性的列。可以使用以下命令给出列 ,然后选择 Feature id 纵队。为了获得最佳性能, Feature id 值应为单值 INTEGER
纵队。
15.3.3. 横跨180°经度的图层
Many GIS packages don't wrap layers with a geographic reference system (lat/lon) crossing the 180 degrees longitude line. As result, if we open such a layer in QGIS, we could see two widely separated locations, that should appear near each other. In 图 15.27, the tiny point on the far left of the map canvas (Chatham Islands) should be within the grid, to the right of the New Zealand main islands.

图 15.27 横跨180°经线的经度/经度地图
15.3.3.1. 在PostGIS中的求解
一种解决方法是使用PostGIS和 ST_ShiftLongitude 功能。此函数读取几何体中每个要素的每个组件中的每个点/顶点,并将其经度坐标从-180..0°移动到180..360°,如果在这些范围之间,则反之亦然。该函数是对称的,因此结果是-180..180°数据的0..360°表示和0..360°数据的-180..180°表示。

图 15.28 横跨180°经度应用 ST_ShiftLongitude 功能
将数据导入到PostGIS (将数据导入到PostgreSQL 例如,使用DB Manager插件。
使用PostGIS命令行界面发出以下命令:
-- In this example, "TABLE" is the actual name of your PostGIS table update TABLE set geom=ST_ShiftLongitude(geom);
如果一切顺利,您应该会收到有关更新的功能数量的确认信息。然后,您将能够加载地图并查看差异 (Figure_vector_crossing_map) 。