数据库数据和 ArcGIS

连接到数据源时,ArcGIS 会应用某些规则。ArcGIS 连接到数据库中的数据并进行读取时,会应用下列规则:

对象名称

数据库管理系统对于对象名称可以接受的字符具有不同的定义。大部分名称必须以字母开头,并且不可以包含空格、反斜线或数据库管理系统保留关键字。部分数据库允许包含正斜线 (/)、下划线 (_)、美元符号 ($)、破折号 (-)、点 (.) 等特殊字符以及这些字符的混合。有时,如果您提供用分隔符(例如双引号)括起来的对象名称,数据库会允许使用包含特殊字符、保留关键字或者强制混合大小写字符、大写字符或小写字符的名称。

但是,ArcGIS 并不分隔对象名称。如果要在 ArcGIS 中使用,请勿创建任何需要分隔符的表、要素类、索引、数据库、用户*、角色或其他对象名称。可以在数据库中创建对象,但不能从 ArcGIS 访问该对象。

*包含特殊字符的 Microsoft SQL Server 用户名会被分隔,以便完全支持活动目录组和 Windows 验证的登录帐户;但是,ArcGIS 不支持包含单引号标记或撇号的用户名。

名称长度

ArcGIS 可以读取并(在某些情况下)创建数据库对象(例如表、视图和用户等)。下表中列出了 ArcGIS 允许这些对象使用的最大名称长度以及例外情况(如果适用)。

注:

如果您的数据库允许的字符数少于 ArcGIS 允许的字符数,则将限制为数据库允许的字符数。有关其对象名称限制,请参阅数据库管理系统文档。

假设所列字符数使用单字节字符。

对象类型ArcGIS 创建的最大字符数ArcGIS 读取的最大字符数异常

数据库名称

NA

31

ArcGIS 可以读取 Oracle 允许的最大数据库名称。

数据库名称值不适用于 SAP HANA

表、要素类或视图名称

128

128

索引名称

所有数据库的索引名称都限制为 16 个字符,但 SQL Server 除外,您可以为其创建最多 128 个字符的索引名称。

具体取决于在 ArcGIS 外部创建的索引的数据库限制。

索引名称不适用于 SAP HANA

字段(列)名称

SQL ServerPostgreSQLSAP HANATeradata 中创建时,该限制为 31。

Db2Oracle 中创建时,该限制为 30。

在从 PostgreSQL 读取时,该限制为 31

在从 Db2Oracle 12.1 或更早版本中读取时,该限制为 30。

具体取决于其他受支持数据库的数据库限制。

用户名

ArcGIS 仅在以下数据库中创建用户。将显示所创建的最大用户名长度。

  • Oracle - 在 12.1 或更低版本中为 30;在 12.2 及更高版本中为 31
  • PostgreSQL - 31
  • SAP HANA - 31
  • SQL Server - 128

具体取决于您的连接方式;“数据库连接”对话框仅允许使用 31 个字符。创建数据库连接地理处理工具可接受最高的数据库限制。

用户名值不适用于 SQLite

密码

ArcGIS 仅在以下数据库中为用户创建密码。将显示所创建的最大密码长度。

  • Oracle - 30
  • PostgreSQL - 75
  • SAP HANA - 31
  • SQL Server - 128

所有受支持数据库的密码长度均限制为 256 个字符,但 Teradata 除外,它仅支持 31 个字符。

密码值不适用于 SQLite

几何验证

使用 ArcGIS 客户端在数据库中创建数据时,ArcGIS 会根据特定的规则验证几何。如果您在 ArcGIS 客户端中建立的几何无效,则 ArcGIS 不允许将其插入到数据库中。

创建要素时,Esri 和 IBM ST_Geometry 构造函数以及 ArcGIS API 使用 Esri 形状库验证几何数据。因此,即使使用 SQL 创建 Esri 或 IBM ST_Geometry 形状,仍将应用验证规则,无效的几何同样不会被提交至数据库。

其他空间类型(例如 SDO_Geometry、PostGIS 几何或地理以及 Microsoft SQL Server 几何或地理)具有自己的构造函数,因此使用自己的几何验证规则。这些规则也许与 ArcGIS 所应用的规则不同。ArcGIS 客户端会在读取数据时验证几何,并且不会显示违反 ArcGIS 几何验证规则的几何。如果要连接到的数据库包含于 ArcGIS 外部创建的数据,则需要注意 ArcGIS 所应用的规则。

针对点的验证规则

  • 点的面积和长度为 0.0。
  • 单个点的包络矩形等于该点的 x,y 值。
  • 多部件点的包络矩形是最小边界框。

针对简单线或线串的验证规则

  • 各部件必须至少具有两个不同的点。
  • 各部件不可以与自身相交。起始点和终止点可以相同,但是不会将生成的环视为面。
  • 各部件可彼此相接于端点。
  • 长度是所有部件的长度的总和。

针对线或管 (spaghetti) 状线串的验证规则

  • 线可以与自身相交。
  • 各部件必须至少具有两个不同的点。
  • 长度是所有部件的长度的总和。

针对面的验证规则和操作

  • 悬挂线无效。
  • 确认构成面的线段闭合(起点和终点的 z 坐标也必须相同)且不交叉。
  • 对于带有孔洞的面,孔洞必须整体位于外边界以内。外边界以外的任何孔洞均无效。
  • 与外边界相接于单个公共点的孔洞会转换为反转的面。
  • 相接于多个公共点的多个孔洞会合并为一个孔洞。
  • 多部件面不能重叠。不过,两个部件可以相接于一点。
  • 多部件面之间不能共享公共边界。
  • 如果两个环拥有一个公共边界,它们会合并为一个环。
  • 将计算总的几何体周长(包括圆环面中所有孔洞的边界)并存储为几何体的长度。
  • 将计算面积。
  • 将计算包络矩形。
  • 尽管 ArcGIS 客户端可返回按顺时针或逆时针方向排列的点,但是对于面的点,会按照逆时针方向存储。如果生成含有顺时针坐标的面,ArcGIS 会更改旋转方向,以确保坐标遵循逆时针方向。

    以逆时针方向存储的面折点

    在该示例中,起始点为 a,正确的坐标描述为 a,b,c,d,a。

  • 面可以包含反转区域,即面内与外部边界接触的空白区域。

    带有反转面形状的面的折点方向

  • 反转的面包含与外边界接触的内部环。这些区域形状并不会视为圆环面。
  • 面具有圆环孔洞时,会首先读取外边界。孔洞的各点以与外边界相反的方向进行存储。

    在下图中,将外边界描述为 a,b,c,d,a,将孔洞描述为 e,f,g,h,e。对于整个面,要素存储为 a,b,c,d,a,e,f,g,h,e。

    带有孔洞的面的折点方向

  • 如果两个孔洞相接于某一点,它们会被视为一个孔洞,而不是两个。

    带有共享同一公共点的两个孔洞的面的折点方向

    在该示例中,这两个内部区域被视为一个孔洞,因为它们共享一个公共点 g。

  • 面和带有孔洞的面的组合可能变得相当复杂,如下图所示。外边界是一个带有岛的湖。在岛上有一个小湖。

    嵌套面

    可以将这些面表示为一个、两个或三个要素。可以将各个面分别存储为单独的要素。较大的湖是一个圆环面。大湖的边界是外边界,而岛是单个圆环孔洞的边界。该岛也是一个圆环面。相对于小湖,岛的边界是外边界,而小湖是孔洞。小湖是一个单一面。

    如果这些湖是重要的要素,则可用一个带有孔洞的要素表示大湖,而另一个形状表示小湖。还可使用多部件面表示该要素。第一个面部件是带有表示岛的圆环孔洞的大湖。第二个部件是小湖。

  • Nil 几何有效并充当占位符。它们允许属性行中不含有相应几何。例如,在请求两个不相交面的相交部分时就会得到 nil 几何。

    不相交面产生一个 nil 几何

    因为区域 A 和 B 不接触,所以相交查询的结果会产生空几何。

  • 要素具有维度。仅具有 x,y 坐标的要素被视为是二维的。具有 z 坐标或测量值的要素是三维的。要素还可能拥有 nil 测量值。

Spatial 元数据

地理数据库会存储关于其所包含的空间数据的元数据。ArcGIS 客户端可从地理数据库系统表中读取有关要素类实体类型(例如,点、线、面)、维数(x、y、z 和 m 坐标)、空间参考、唯一标识符和要素类范围的信息。在 ArcGIS 连接到数据库中的要素类时不能使用此类表。因此,ArcGIS 必须通过其他来源获取该信息。

将要素类(空间表)拖放到 ArcGIS Pro 的地图中时,即相应地创建了一个查询图层。要定义查询图层,ArcGIS Pro 将执行以下操作:

  1. 它将查询数据库以获取有关空间表的信息,例如维数、空间参考和几何类型。
  2. 如果没有为整个表定义这些信息,则 ArcGIS Pro 将读取表中的第一行并使用来自该要素的信息。
  3. 如果空间参考、几何类型或维数无法通过查看第一行来确定(例如,如果表中不包含数据或者行正在使用一个自定义的空间参考),则系统将提示您提供这些信息以用于图层定义。
  4. ArcGIS Pro 将查询数据库以找到可在特定表中用作行的唯一标识符 (ObjectID) 的非空列。如果没有找到符合条件的行,系统将提示您为表定义 ObjectID
  5. 最后,在您将图层添加到地图后,ArcGIS Pro 将计算该图层的范围。

由于显示在地图中的内容取决于查询,因此可以打开查询图层定义并对其进行更改。例如,如果要素类包含点和面,则可以打开查询图层定义并选择要显示的几何类型。同样,如果要素类包含多个空间列,则可以打开查询图层定义并更改查询以包括不同的空间列。但请注意,不能通过更改查询来显示不支持的数据类型