创建表或向数据库中的表添加新列时,将为列定义特定数据类型。数据类型确定以下内容:
- 可以在该列中存储哪些值
- 可以在该列中对数据执行哪些操作
- 如何在数据库中存储该列的数据
ArcGIS 使用特定数据类型。通过数据库连接或查询图层访问数据库表时,ArcGIS 将过滤掉任何不受支持的数据类型。ArcGIS 不会显示不受支持的数据类型并且您无法通过 ArcGIS 编辑这些数据类型。同样,使用 ArcGIS 将包含不受支持的数据类型的表从一个数据库复制和粘贴到另一个数据库时,ArcGIS 只粘贴使用受支持的数据类型的列。
下表的第一列列出了 ArcGIS 数据类型。第二列列出了 ArcGIS 创建的 PostgreSQL 数据类型。第三列显示了在查看 ArcGIS 外创建的表时哪些其他 PostgreSQL 数据类型(如果有)会映射到 ArcGIS 数据类型。最后一列提供了所需的附加信息。
ArcGIS 数据类型 | 创建的 PostgreSQL 数据类型 | 可以查看的其他 PostgreSQL 数据类型 | 备注 |
---|---|---|---|
BLOB | BYTEA | ||
DATE | TIMESTAMP WITHOUT ZONE | TIMESTAMP | |
DOUBLE | NUMERIC(p) | BIG SERIAL、DOUBLE PRECISION | ArcGIS 中指定的精度和小数位数可以影响在数据库中创建的结果数据类型。有关详细信息,请参阅 ArcGIS 字段数据类型。 |
FLOAT | NUMERIC(p) | ArcGIS 中指定的精度和小数位数可以影响在数据库中创建的结果数据类型。有关详细信息,请参阅 ArcGIS 字段数据类型。 | |
GEOMETRY | ST_GEOMETRY or GEOMETRY (PostGIS) | 在地理数据库中,创建要素类时使用的配置关键字的 GEOMETRY_STORAGE 设置将决定在数据库中创建的数据类型。 要在数据库(而非地理数据库)中使用 ST_Geometry,必须先进行安装。有关详细信息,请参阅向 PostgreSQL 数据库添加 ST_Geometry 类型。 要使用 PostGIS 几何类型,您必须在 PostgreSQL 数据库集群中安装 PostGIS,且数据库本身必须允许使用 PostGIS。有关详细信息,请参阅 PostgreSQL 文档。 | |
GLOBAL ID | VARCHAR(38) | 仅地理数据库支持。 | |
GUID | VARCHAR(38) | UUID | 10.5.1 和 ArcGIS Pro 2.0 新增了 UUID 支持。 |
LONG INTEGER | INTEGER | SERIAL | |
OBJECT ID | 地理数据库中的 INTEGER 数据库中的 SERIAL | ArcGIS 类型 ObjectID 是表(或要素类)的注册行 ID 列。每个表只能存在一个 ObjectID。 | |
RASTER | BYTEA or ST_RASTER | 仅地理数据库支持栅格。创建哪种 PostgreSQL 数据类型将取决于创建栅格数据集或镶嵌数据集时所使用的配置关键字(rasterblob、binary 或 st_raster)。 要使用 ST_Raster,必须先在地理数据库中对其进行单独配置。有关说明,请参阅在 PostgreSQL 中安装 ST_Raster。 | |
SHORT INTEGER | SMALLINT | REAL | |
TEXT | CHARACTER VARYING | CHARACTER、VARCHAR、TEXT |
如果您的表中包含了一列具有 ArcGIS 不支持的数据类型的数据,则可以将该列转换为文本。但是请仅在想要查看该列中的值时执行此操作;如果您将执行的分析需要用到该列中的值,请不要执行此操作。例如,您可以执行 SELECT 语句选择 tableb 中的列,并将小数列 (total) 转换为文本:
SELECT id, name, total::text
FROM me.mydb.tableb;
几何数据类型
如表中所示,ArcGIS 可在 PostgreSQL 中创建并处理两种几何数据类型:Esri ST_Geometry 和 PostGIS Geometry。下面两部分将提供有关这两种数据类型的详细背景。
ST_Geometry
以下是 ST_Geometry 空间数据类型的常规描述。有关特定于 PostgreSQL 实施的信息,请参阅 PostgreSQL 中的 ST_Geometry。
ST_Geometry 数据类型遵循用户定义数据类型 (UDT) 的 SQL 3 规范,用于创建可存储空间数据(如地标、街道或土地宗地的位置)的列。该数据类型可通过符合国际标准化组织 (ISO) 和开放地理空间联盟 (OGC) 标准的结构化查询语言 (SQL) 来访问地理数据库和数据库。通过向表示地理要素的对象(点、线及面)提供存储空间,此存储类型扩展了数据库的功能。此存储类型旨在充分利用数据库资源,与数据库要素(如复制与分区)兼容,以及快速访问空间数据。
ST_Geometry 本身是抽象的、无法实例化的超类。但其子类可以实例化。实例化的数据类型是可定义为表列的数据类型,并且其类型值插入表列之中。
虽然可以将列定义为类型 ST_Geometry,但是您无法将 ST_Geometry 值插入此列,因为无法对 ST_Geometry 进行实例化。相反,您可以插入子类值。
下图说明了 ST_Geometry 数据类型及其子类的等级。
ST_Geometry 的子类分为两类:基础几何子类和同类集合子类。基础几何包括 ST_Point、ST_LineString 和 ST_Polygon,而同类集合包括 ST_MultiPoint、ST_MultiLineString 和 ST_MultiPolygon。与名称的含义一致,同类集合是基础几何的集合。除了共享基础几何属性之外,同类集合还具有某些自身的属性。
每个子类都存储其名称所指的几何类型;例如,ST_MultiPoint 存储多点。下表是子类及其说明的列表:
子类型 | 说明 |
---|---|
ST_Point |
|
ST_LineString |
|
ST_Polygon |
|
ST_MultiPoint |
|
ST_MultiLineString |
|
ST_MultiPolygon |
|
请注意每个子类都继承 ST_Geometry 的属性,但超类还有其本身的属性。适用于 ST_Geometry 数据类型的函数可接受任何子类实体类型。不过,有些函数定义在子类级别,且仅接受特定的子类。例如,ST_GeometryN 函数仅将 ST_MultiLinestring、ST_MultiPoint 或 ST_MultiPolygon 子类型值作为输入。
PostGIS geometry
PostGIS 是 PostgreSQL 数据库的空间操作扩展产品。PostGIS 遵从开放地理空间联盟 (OGC) 关于结构化查询语言 (SQL) 的简单要素规范。它使用 OGC 熟知二进制 (WKB) 和熟知文本 (WKT) 表示几何。
PostGIS 具有两个空间类型选项:几何类型和地理类型。ArcGIS 仅支持几何类型。
将 PostGIS 几何存储类型与 ArcGIS 一起使用时,请牢记以下内容:
- 必须使用 PostGIS 数据库模板创建用于地理数据库的 PostgreSQL 数据库或在数据库中启用 PostGIS。
- 必须为 sde 用户和在地理数据库或数据库中创建数据的所有用户授予对特定 PostGIS 表的权限。
- 所创建的要素类只能使用 PostGIS public.spatial_ref_sys 表中列出的空间参考。如果指定此表中不包含的空间参考,要素类创建将失败。
- 要创建使用 PostGIS 几何类型的要素类,必须指定包含将 GEOMETRY_STORAGE 参数设置为 PG_GEOMETRY 的配置关键字。
- 无法重命名使用 PostGIS 几何类型存储的空间表。这是因为不存在可用来对 public.geometry_columns 表中的表名称进行更新的 PostGIS 函数。
- 在 PostgreSQL 的地理数据库中,使用 PostGIS 几何类型的要素类将包含一个针对 CAD 和曲线存储的字段 (GDB_GEOMATTR_DATA)。如果在 ArcGIS 外部创建一个空间表,然后将表注册到地理数据库,则该字段将被添加到表中。
要使用 PostGIS 几何类型,必须安装 PostGIS。安装 PostgreSQL 之后安装 PostGIS。请确保要使用的 ArcGIS 版本支持所安装的 PostGIS 版本。
安装 PostGIS 时,会在 PostgreSQL 数据库集群中创建 PostGIS 模板数据库。使用 PostGIS 模板数据库可创建用于存储地理数据库的数据库。
授予创建 PostGIS 几何列的权限
如果数据库对 PostGIS 可用,则将在公共方案中创建两个表,即 geometry_columns 和 spatial_ref_sys。必须为 sde 用户和将在地理数据库中创建数据的所有用户至少授予对 geometry_columns 表的 SELECT、INSERT、UPDATE 和 DELETE 权限和对 spatial_ref_sys 表的 SELECT 权限。
GRANT select, insert, update, delete
ON TABLE public.geometry_columns
TO <user_name>;
GRANT select
ON TABLE public.spatial_ref_sys
TO <user_name>;
创建使用 PostGIS 几何的要素类
创建要素类时,ArcGIS 使用在 sde_dbtune 表中设置的配置参数来确定使用哪种空间数据类型。此参数为 GEOMETRY_STORAGE。在 PostgreSQL 中的地理数据库中,此参数可设置为 ST_GEOMETRY 或 PG_GEOMETRY(PostGIS 几何类型的设置)。因此,当您要使用 ArcGIS 创建使用 PostGIS 几何类型的要素类时,指定 GEOMETRY_STORAGE 参数设置为 PG_GEOMETRY 的配置关键字。
默认情况下,新要素类使用 ST_Geometry 存储。如果要以 PostGIS 存储类型存储大部分数据,则将 sde_dbtune 表中 DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数值更改为 PG_GEOMETRY。或者,如果仅要以 PostGIS 存储类型存储部分要素类,则可在创建要素类时指定 PG_GEOMETRY 配置关键字。从地理数据库中导出时,PG_GEOMETRY 关键字以如下方式显示:
##PG_GEOMETRY GEOMETRY_STORAGE "PG_GEOMETRY" UI_TEXT "User Interface text description for POSTGIS geometry storage" END
其余存储参数从 DEFAULTS 关键字中选择。有关配置关键字和参数的详细信息,请参阅下列主题:
使用现有几何表
ArcGIS 可以使用包含 PostGIS 几何列的表(由其他应用程序或使用 SQL 在外部创建,也称为第三方表),但这些表必须满足以下先决条件:
- 每个表必须具有单个几何列。如果没有,请定义查询图层或只包含某个几何列的视图。
- 表不得包含属于用户定义类型的其他列。
- 表的几何类型必须单一(点、线或面),但几何可以为多部件类型。
- 每个表必须具有适合作注册行 ID 列的整数、唯一和非空列。
- 每个表应具有空间索引。
有关使用 SQL 创建包含 PostGIS 列的表的信息,请参阅 PostGIS 文档。
您可以从 ArcGIS Desktop 连接到包含 PostGIS 表的 PostgreSQL 数据库并将这些表注册到地理数据库。有关详细信息,请参阅将表或视图注册到地理数据库。
栅格数据类型
您可以使用 bytea 或 ST_Raster 数据类型存储 PostgreSQL 中地理数据库内的栅格。默认使用 Bytea。如果要使用 ST_Raster,您必须配置地理数据库才能使用它。
Bytea
Bytea 是 PostgreSQL 所使用的长度可变的二进制字符串数据类型。与 BLOB 类似。有关此数据类型的详细信息,请参阅 PostgreSQL 文档。
ST_Raster
ST_Raster 是一种用户定义的数据类型,可将其安装在企业级地理数据库中以对栅格数据进行 SQL 访问。
要使用 ST_Raster 类型,您必须在数据库中对其进行配置。
有关如何定义 ST_Raster 对象类型的详细信息,请参阅 ST_Raster 数据类型。