创建表或向数据库中的表添加新列时,将为列定义特定数据类型。 数据类型确定以下内容:
- 可以在该列中存储哪些值
- 可以在该列中对数据执行哪些操作
- 如何在数据库中存储该列的数据
ArcGIS 使用特定数据类型。 通过数据库连接、查询图层或 web 服务访问数据库表时,ArcGIS 将过滤掉任何不受支持的数据类型。 ArcGIS 不会显示不受支持的数据类型并且您无法通过 ArcGIS 编辑不受支持的数据类型。 同样,使用 ArcGIS 将包含不受支持的数据类型的表从一个数据库复制和粘贴到另一个数据库时,ArcGIS 只粘贴使用受支持的数据类型的列。
下表第一列列出了 ArcGIS 的各个数据类型。 第二列列出了 ArcGIS 创建的 PostgreSQL 数据类型。 第三列显示了在查看 ArcGIS 外创建的表(未注册到地理数据库的表)时哪些其他 PostgreSQL 数据类型(如果有)会映射到 ArcGIS 数据类型。 最后一列用于提供所需其他信息。
ArcGIS 数据类型 | 创建的 PostgreSQL 数据类型 | 可以查看的其他 PostgreSQL 数据类型 | 备注 |
---|---|---|---|
大整数 | bigint | ||
Blob | bytea | ||
日期 | timestamp without time zone | timestamp with time zone | |
仅日期 | date | ||
双精度 | numeric(p,s) | 双精度型 | ArcGIS 中指定的精度 (p) 和小数位数 (s) 可以影响在数据库中创建的结果数据类型。 有关详细信息,请参阅 ArcGIS 字段数据类型。 |
浮点型 | numeric(p,s) | decimal、double precision、numeric、real | ArcGIS 中指定的精度 (p) 和小数位数 (s) 可以影响在数据库中创建的结果数据类型。 有关详细信息,请参阅 ArcGIS 字段数据类型。 |
几何 | ST_Geometry, Geometry (PostGIS), Geography (PostGIS) | 在地理数据库中,创建要素类时使用的配置关键字的 GEOMETRY_STORAGE 设置将决定在数据库中创建的数据类型。 要在数据库(非地理数据库)中使用 ST_Geometry,必须先进行安装。 有关详细信息,请参阅向 PostgreSQL 数据库添加 ST_Geometry 类型。 要使用 PostGIS 几何或地理类型,您必须在 PostgreSQL 数据库集群中安装 PostGIS,且数据库本身必须允许使用 PostGIS。 有关详细信息,请参阅 PostgreSQL 文档。 | |
Global ID | varchar(38) | 仅地理数据库支持全局 ID。 | |
GUID | varchar(38) | UUID | |
长整型 | integer | serial | |
对象 ID | 地理数据库中的 integer(32 位)或 bigint(64 位) 数据库中的 Serial | ArcGIS 对象 ID 数据类型是表(或要素类)的注册行 ID 列。 每个表只能存在一个 ObjectID。 | |
栅格 | bytea | ArcGIS 栅格数据类型仅适用于地理数据库。 | |
短整型 | smallint | ||
文本 | character varying | character、text | 如果使用 SQL 客户端或第三方应用程序创建文本字段,但未定义长度(换言之,长度为 0),则 ArcGIS 会将此字段读取为 CLOB。 |
仅时间 | 时间 | time without time zone、time with time zone | |
时间戳偏移 | 不适用 | 不支持 |
如果表中包含了一列具有 ArcGIS 不支持的数据类型的数据,则可以将该列转换为文本。 但是请仅在要查看该列中的值时执行此操作;如果您将执行的分析需要用到该列中的值,请不要执行此操作。 例如,您可以运行 SELECT 语句选择 tableb 中的列,并将小数列 (total) 转换为文本:
SELECT id, name, total::text
FROM me.mydb.tableb;
几何数据类型
如表中所示,ArcGIS 可在 PostgreSQL 中创建并处理三种空间数据类型:Esri ST_Geometry、PostGIS 几何和 PostGIS 地理。 下面两部分将提供有关这些数据类型的详细背景。
ST_Geometry
以下是 ST_Geometry 空间数据类型的常规描述。 有关特定于 PostgreSQL 实施的信息,请参阅 PostgreSQL 中的 ST_Geometry。
ST_Geometry 数据类型遵循用户定义数据类型 (UDT) 的 SQL 3 规范,用于创建可存储空间数据(如地标、街道或土地宗地的位置)的列。 该数据类型可通过符合国际标准化组织 (ISO) 和 Open Geospatial Consortium (OGC) 标准的结构化查询语言 (SQL) 来访问地理数据库和数据库。 通过向表示地理要素的对象(点、线及面)提供存储空间,此存储类型扩展了数据库的功能。 此存储类型旨在充分利用数据库资源,与数据库要素(如复制与分区)兼容,以及快速访问空间数据。
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 空间数据类型
PostGIS 是一款在空间上启用 PostgreSQL 数据库的产品。 PostGIS 遵循 SQL 的 OGC 简单要素规范。 它使用 OGC 熟知二进制 (WKB) 和熟知文本 (WKT) 表示几何。
PostGIS 具有两个空间类型选项:几何类型和地理类型。 要使用它们,必须在 PostgreSQL 数据库集群中安装 PostGIS,并使用 PostGIS 模板数据库创建将存储地理数据库的数据库。 安装要使用的 ArcGIS 版本支持的 PostGIS 版本。
将 PostGIS 空间存储类型与 ArcGIS 一起使用时,请牢记以下内容:
- 必须使用 PostGIS 数据库模板创建用于地理数据库的 PostgreSQL 数据库或在数据库中启用 PostGIS。
- 必须为 sde 用户和在地理数据库或数据库中访问 PostGIS 数据的所有用户授予对特定 PostGIS 视图的权限。
- 所创建的要素类只能使用 PostGIS public.spatial_ref_sys 视图中列出的空间参考。 如果指定的空间参考不存在,要素类创建将失败。
- 要创建使用这两种空间数据类型之一的要素类,必须指定一个配置关键字,其中包含设置为 PG_GEOMETRY(用于 PostGIS 几何)或 PG_GEOGRAPHY(用于 PostGIS 地理)的 GEOMETRY_STORAGE 参数。
- 在 PostgreSQL 的地理数据库中,使用 PostGIS 类型的要素类将包含一个针对 CAD 和曲线存储的字段:GDB_GEOMATTR_DATA。 如果在 ArcGIS 外部创建一个空间表并将表注册到地理数据库,则该字段将被添加到表中。
- PostGIS 地理类型限制可处理形状的大小。 有关详细信息,请参阅 PostGIS 文档。
授予创建 PostGIS 几何或地理列的权限
如果数据库对 PostGIS 可用,则其将向公共方案中添加以下三个视图:geometry_columns、geography_columns 和 spatial_ref_sys。 您必须向地理数据库中包括 sde 用户在内的所有用户授予对 geometry_columns、geography_columns 和 spatial_ref_sys 视图的 SELECT 权限。
GRANT select
ON public.geometry_columns
TO <login_name>;
GRANT select
ON public.geography_columns
TO <login_name>;
GRANT select
ON public.spatial_ref_sys
TO <login_name>;
创建使用 PostGIS 空间数据类型的要素类
创建要素类时,ArcGIS 使用配置参数设置来确定使用哪种空间数据类型。 此参数为 GEOMETRY_STORAGE。 在 PostgreSQL 中的地理数据库中,此参数可设置为 ST_GEOMETRY、PG_GEOMETRY(PostGIS 几何类型的设置)或 PG_GEOGRAPHY(PostGIS 地理类型的设置)。 因此,您必须指定配置关键字,其中包含设置为所需 PostGIS 空间数据类型的 GEOMETRY_STORAGE 参数:PG_GEOMETRY 或 PG_GEOGRAPHY。
创建地理数据库以使用 ST_Geometry 空间类型时,DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数值将设置为 ST_GEOMETRY。 创建地理数据库以使用 PostGIS 空间类型时,DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数值将设置为 PG_GEOMETRY。
如果您希望以其他空间类型存储大部分数据,请更改 DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数值。 或者,如果您希望以 PostGIS 存储类型存储部分要素类,则可在创建要素类时指定 PG_GEOMETRY 或 PG_GEOGRAPHY 配置关键字。 从地理数据库中导出时,这些关键字将以如下方式显示:
##PG_GEOMETRY GEOMETRY_STORAGE "PG_GEOMETRY" UI_TEXT "User Interface text description for POSTGIS geometry storage" END
##PG_GEOGRAPHY GEOMETRY_STORAGE "PG_GEOGRAPHY" UI_TEXT "User Interface text description for POSTGIS geography storage" END
当使用其中任一配置关键字时,将从 DEFAULTS 关键字获取其余存储参数。 有关配置参数的详细信息,请参阅PostgreSQL 配置参数。
使用现有几何或地理表
ArcGIS 可以使用包含 PostGIS 几何或地理列的表(由其他应用程序或使用 SQL 在外部创建,也称为第三方表),但这些表必须满足以下先决条件:
- 每个表必须具有单个空间列。 如果没有,请定义只包含某个空间列的查询图层或视图。
- 表不得包含属于用户定义类型的其他列。
- 表的要素类型必须单一(点、线或面),但要素类可以为多部件类型。
- 每个表必须具有适合作为对象 ID 列的整型、唯一和非空列。
- 每个表应具有空间索引。
有关使用 SQL 创建包含 PostGIS 列的表的信息,请参阅 PostGIS 文档。
您可以从 ArcGIS Pro 连接至 PostgreSQL 数据库,并将包含 PostGIS 列的表注册到地理数据库。 有关详细信息,请参阅将表或视图注册到地理数据库。