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 imageryraster 地图

  • 属性(非空间数据)

  • 扩展部分

从QGIS版本3.8开始,GeoPackage还可以存储QGIS项目。GeoPackage层可以具有JSON字段。

GeoPackage是QGIS中矢量数据的默认格式。

15.3.2.2. Esri shapefile格式

ESRI Shapefile格式仍然是最常用的矢量文件格式之一,即使与GeoPackage和SpatiaLite相比有一些限制。

ESRI Shapefile格式的数据集由多个文件组成。以下三项是必需的:

  1. .shp 包含要素几何的文件

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

  3. .shx 索引文件

ESRI shapefile格式数据集还可以包含具有 .prj 后缀,它包含投影信息。虽然有一个投影文件是非常有用的,但它不是强制性的。Shapefile格式的数据集可以包含其他文件。有关更多详细信息,请参阅ESRI technical specification

GDAL支持对压缩的ESRI shapefile格式进行读写 (shzshp.zip )。

Improving Performance for ESRI Shapefile format datasets

要提高ESRI Shapefile格式数据集的绘制性能,可以创建空间索引。空间索引将提高缩放和平移的速度。QGIS使用的空间索引具有 .qix 分机。

使用以下步骤创建索引:

  1. 加载ESRI shapefile格式的数据集(请参阅 浏览器面板 )

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

  3. Source 选项卡中,单击 Create Spatial Index 按钮

Problem loading a .prj file

如果加载ESRI shapefile格式的数据集时 .prj 文件,并且QGIS无法从该文件中读取坐标参考系,则需要在 Layer Properties ► Source 通过单击层的 集合投影 Select CRS 纽扣。这是由于这样一个事实 .prj 文件通常不提供在QGIS中使用并在中列出的完整投影参数 CRS 对话框中。

出于同样的原因,如果使用QGIS创建新的ESRI shapefile格式数据集,则会创建两个不同的投影文件: .prj 具有有限投影参数的文件,与ESRI软件兼容,并且 .qpj 文件,提供CRS的所有参数。无论何时QGIS发现 .qpj 文件,则将使用该文件而不是 .prj

15.3.2.3. 分隔的文本文件

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

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

  1. 该文件必须具有带分隔符的字段名称标题行。这必须是数据的第一行(理想情况下是文本文件中的第一行)。

  2. 如果应启用几何体,则文件必须包含定义几何体的字段(S)。这些字段(S)可以有任何名称。

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

  4. 如果您有一个包含非字符串列的CSV文件,则可以有一个附带的CSVT文件(请参见部分 使用CSVT文件控制字段格式 )。

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

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

有关文本文件的一些注意事项:

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

  2. 第一行是标题行。它包含以下字段 XYELEV

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

  4. X坐标包含在 X 字段

  5. Y坐标包含在 Y 字段

在带分隔符的文本文件中存储几何信息

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

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

  • 作为任何几何类型的单列中的几何的公知文本(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_dumppg_restore 命令以及由QGIS保存的默认图层样式之后无法恢复,您需要将XML选项设置为 DOCUMENT 在RESTORE命令之前:

  1. 创建一个简单的备份 layer_style 表格

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

  3. 更改线路 SET xmloption = content; vt.进入,进入 SET XML OPTION DOCUMENT;

  4. 保存文件

  5. 使用psql恢复新数据库中的表

过滤数据库端

QGIS allows to filter features already on server side. Check Settings ► Options ► Data Sources ► 复选框 Execute expressions on server-side if possible 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_newgis_data 数据库。新层的空间参考标识符(SRID)将为2964。请参见部分 使用投影 有关空间参考系和投影的更多信息。

小技巧

Exporting datasets from PostGIS

还有一个用于将PostGIS数据集导出为Shapefile格式的工具: pgsql2shp 。它在您的PostGIS发行版中提供。

Or2ogr

除了……之外 shp2pgsqlDB 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 方法,您可以导出以下环境变量(至少在 尼克斯OSX ):

export PG_USE_COPY=YES

ogr2ogr 不会创建空间索引,如 shp2pgsl 的确如此。您需要使用普通的SQL命令手动创建它们 CREATE INDEX 之后,作为额外的步骤(如下一节所述 提高性能 )。

提高性能

从PostgreSQL数据库检索要素可能很耗时,尤其是通过网络。通过确保数据库中的每个图层上都存在PostGIS空间索引,可以提高PostgreSQL图层的绘制性能。PostGIS支持创建GIST(通用搜索树)索引以加快空间搜索(GIST索引信息取自https://postgis.net).上的PostGIS文档

小技巧

您可以使用DBManager为您的层创建索引。您应该首先选择该层,然后单击 Table ► Edit table ,请访问 Indexes 选项卡,然后单击 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 nameLayer name

此外,您还可以选择 SQLite 作为格式,然后添加 SPATIALITE=YESCustom Options ► Data source 菲尔德。这将告诉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提供一个或多个标识特性的列。可以使用以下命令给出列 Layer ► Add Layer ► Add SAP HANA Spatial Layer ,然后选择 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.

../../../_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 横跨180°经度应用 ST_ShiftLongitude 功能

  1. 将数据导入到PostGIS (将数据导入到PostgreSQL 例如,使用DB Manager插件。

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