ArcGIS 支持的 PostgreSQL 数据类型

创建表或向数据库中的表添加新列时,将为列定义特定数据类型。数据类型确定以下内容:

  • 可以在该列中存储哪些值
  • 可以在该列中对数据执行哪些操作
  • 如何在数据库中存储该列的数据

ArcGIS 使用特定数据类型。通过数据库连接、查询图层或 web 服务访问数据库表时,ArcGIS 将过滤掉任何不受支持的数据类型。ArcGIS 不会显示不受支持的数据类型并且您无法通过 ArcGIS 编辑不受支持的数据类型。同样,使用 ArcGIS 将包含不受支持的数据类型的表从一个数据库复制和粘贴到另一个数据库时,ArcGIS 只粘贴使用受支持的数据类型的列。

下表第一列列出了 ArcGIS 的各个数据类型。第二列列出了 ArcGIS 创建的 PostgreSQL 数据类型。第三列显示了在查看 ArcGIS 外创建的表时哪些其他 PostgreSQL 数据类型(如果有)会映射到 ArcGIS 数据类型。最后一列用于提供所需其他信息。

ArcGIS 数据类型创建的 PostgreSQL 数据类型可以查看的其他 PostgreSQL 数据类型备注

BLOB

bytea

日期

timestamp without zone

timestamp

双精度型

numeric(p,s)

big serial、double precision

ArcGIS 中指定的精度和小数位数可以影响在数据库中创建的结果数据类型。有关详细信息,请参阅 ArcGIS 字段数据类型

浮点型

numeric(p,s)

ArcGIS 中指定的精度和小数位数可以影响在数据库中创建的结果数据类型。有关详细信息,请参阅 ArcGIS 字段数据类型

几何

ST_Geometry, Geometry (PostGIS), Geography (PostGIS)

在地理数据库中,创建要素类时使用的配置关键字的 GEOMETRY_STORAGE 设置将决定在数据库中创建的数据类型。

要在数据库(非地理数据库)中使用 ST_Geometry,必须先进行安装。有关详细信息,请参阅PostgreSQL 数据库添加 ST_Geometry 类型

要使用 PostGIS 几何或地理类型,您必须在 PostgreSQL 数据库集群中安装 PostGIS,且数据库本身必须允许使用 PostGIS。有关详细信息,请参阅 PostgreSQL 文档。

Global ID

varchar(38)

仅地理数据库支持。

GUID

varchar(38)

UUID

长整型

整数

serial

对象 ID

地理数据库中的 Integer

数据库中的 Serial

ArcGIS 类型 ObjectID 是表(或要素类)的注册行 ID 列。每个表只能存在一个 ObjectID。

栅格

bytea

仅地理数据库支持栅格。

短整型

smallint

real

文本

character varying

character、varchar、text

如果使用 SQL 客户端或第三方应用程序创建文本字段,但未定义长度(换言之,长度为 0),则 ArcGIS 会将此字段读取为 CLOB。

如果您的表中包含了一列具有 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) 和开放地理空间联盟 (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_Point 具有单个 x,y 坐标值(始终是简单的),并且边界为空。

ST_LineString

  • 以用于定义线性插值路径的点序列的形式进行存储的一维对象。
  • ST_LineString 具有长度。
  • 如果 ST_LineString 不与其内部相交,则 ST_LineString 为简单几何。
  • 闭合的 ST_LineString 的端点(边界)占据空间中的相同点。
  • 如果 ST_LineString 是闭合的并且是简单的,那么它是一个环。
  • 端点通常形成 ST_LineString 的边界,除非 ST_LineString 是闭合的(在这种情况下边界为空)。
  • ST_LineString 的内部是位于端点间的连接路径,ST_LineString 闭合的情况除外,这种情况下内部是连续的。

ST_Polygon

  • 以点序列的形式存储的二维表面,用于定义其外接环以及 0 个或更多内部环。
  • ST_Polygon 具有面积并且始终是简单的。
  • 外部环和任意内部环确定了 ST_Polygon 的边界,环之间的封闭空间确定了 ST_Polygon 的内部。
  • ST_Polygon 的环可以相切,但绝不可以相交。

ST_MultiPoint

  • ST_Point 的集合。
  • 具有 0 个维度。
  • 如果 ST_MultiPoint 中的元素占据的坐标空间互不相同,则它是简单的。
  • ST_MultiPoint 的边界为空。

ST_MultiLineString

  • ST_LineStrings 的集合。
  • ST_MultiLineStrings 具有长度。
  • 如果 ST_MultiLineString 只在 ST_LineString 元素的端点相交,则它是简单的。
  • 如果 ST_LineString 元素的内部相交,则 ST_MultiLineString 是非简单的。
  • ST_MultiLineString 的边界是 ST_LineString 元素的非相交端点。
  • 如果 ST_MultiLineString 的所有 ST_LineString 元素均为闭合的,则它也为闭合的。
  • 如果 ST_MultiLineString 的所有元素的所有端点都相交,则它的边界为空。

ST_MultiPolygon

  • 面的集合。
  • ST_MultiPolygons 具有面积。
  • ST_MultiPolygon 的边界是其元素外部环和内部环的累积长度。
  • ST_MultiPolygon 的内部被定义为其 ST_Polygon 元素的累积内部。
  • ST_MultiPolygon 的元素的边界只能相切。

ST_Geometry 子类型

请注意每个子类都继承 ST_Geometry 的属性,但超类还有其本身的属性。适用于 ST_Geometry 数据类型的函数可接受任何子类实体类型。不过,有些函数定义在子类级别,且仅接受特定的子类。例如,ST_GeometryN 函数仅将 ST_MultiLinestring、ST_MultiPoint 或 ST_MultiPolygon 子类型值作为输入。

PostGIS 空间数据类型

PostGISPostgreSQL 数据库的空间操作扩展产品。PostGIS 遵循 SQL 的 OGC 简单要素规范。它使用 OGC 熟知二进制 (WKB) 和熟知文本 (WKT) 表示几何。

PostGIS 具有两个空间类型选项:几何类型和地理类型。要使用它们,必须在 PostgreSQL 数据库集群中安装 PostGIS,并使用 PostGIS 模板数据库创建将存储地理数据库的数据库。请确保要使用的 ArcGIS 版本支持所安装的 PostGIS 版本。

PostGIS 空间存储类型与 ArcGIS 一起使用时,请牢记以下内容:

  • 必须使用 PostGIS 数据库模板创建用于地理数据库的 PostgreSQL 数据库或在数据库中启用 PostGIS
    注:

    如果使用创建企业级地理数据库地理处理工具创建地理数据库,则将使用 PostGIS 模板以外的其他模板来创建数据库。因此,如果想要使用 PostGIS 几何或地理类型,必须使用 PostGIS 模板手动创建数据库。然后,可以在运行创建企业级地理数据库地理处理工具时,指定现有数据库,该地理数据库也将在启用了 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 地理类型的设置)。因此,您必须指定配置关键字,其中包含为您所需的空间数据类型设置的 GEOMETRY_STORAGE 参数:PG_GEOMETRY 或 PG_GEOGRAPHY。

默认情况下,新要素类使用 ST_Geometry 存储。如果要以 PostGIS 存储类型存储大部分数据,则请更改 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 Desktop 连接至 PostgreSQL 数据库,并将包含 PostGIS 列的表注册到地理数据库。有关详细信息,请参阅将表或视图注册到地理数据库


在本主题中
  1. 几何数据类型