连接到数据源时,ArcGIS 会应用某些规则。ArcGIS 连接到数据库中的数据并进行读取时,会应用下列规则:
对象名称
数据库管理系统对于对象名称可以接受的字符具有不同的定义。大部分对象名称必须以字母开头,并且不可以包含空格、反斜线或 DBMS 保留关键字。部分对象名称允许包含正斜线 (/)、下划线 (_)、美元符号 ($)、破折号 (-)、点 (.) 等特殊字符以及这些字符的混合。有时,如果您提供用分隔符(例如双引号)括起来的对象名称,DBMS 会允许使用包含特殊字符、保留关键字、强制混合字符、大写字符或小写字符的名称。
但是,ArcGIS 并不分隔对象名称。如果要在 ArcGIS 中使用,请勿创建任何需要分隔符的表、要素类、数据库、用户*、角色或其他对象名称。可以在数据库中创建对象,但不能从 ArcGIS 访问该对象。
*包含特殊字符的 SQL Server 用户名会被分隔,以便完全支持 Active Directory 组和 Windows 验证的登录帐户。
名称长度
ArcGIS 可以读取并(在某些情况下)创建数据库对象(例如表、视图和用户等)。ArcGIS 允许这些对象使用的最大名称长度列于此处。
假设所列字符的数量是使用 ANSI 文本的结果。UTF-8 字符使用至少两倍于 ANSI 字符的字节数,因此允许的字符数将减少。
ALTIBASE | DAMENG | DB2 | Informix | Netezza | Oracle | PostgreSQL | SAP HANA | SQL Server | Teradata | |
---|---|---|---|---|---|---|---|---|---|---|
数据库名称 | 31 | 31 | 8 | 31 | 31 | 30 | 31 | 31 | 31 | 31 |
字段(列)名称 | 31 | 31 | 31 | 31 | 31 | 30 | 31 | 31 | 31 | 31 |
索引名称 | 40 | 128 | 128 | 128 | NA | 30 | 63 | 127 | 128 | 128 |
密码 | 22(Windows 中的 ALTIBASE) 16(非 Window 操作系统中的 ALTIBASE) | 31 | 31 | 31 | 31 | 31 | 31 | 127 | 31 | 30 |
表或要素类的名称 | 40 | 128 | 128 | 128 | 128 | 30 | 63 | 127 | 128 | 128 |
用户名 | 31 | 31 | 30 | 31 | 31 | 30 | 31 | 31 | 31 | 31 |
视图名称 | 40 | 128 | 128 | 128 | 128 | 30 | 63 | 127 | 128 | 128 |
几何验证
使用 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 几何。
因为区域 A 和 B 不接触,所以相交查询的结果会产生空几何。
- 要素具有维度。仅具有 x,y 坐标的要素被视为是二维的。具有 z 坐标或测量值的要素是三维的。要素还可能拥有 nil 测量值。
Spatial 元数据
地理数据库会存储关于其所包含的空间数据的元数据。ArcGIS 客户端可从地理数据库系统表中读取有关要素类实体类型(例如,点、线、面)、维数(x、y、z 和 m 坐标)、空间参考、唯一标识符和要素类范围的信息。在 ArcGIS 连接到数据库中的要素类时不能使用此类表。因此,ArcGIS 必须通过其他来源获取该信息。
将要素类(空间表)拖放到 ArcMap 中时,即相应地创建了一个查询图层。要定义查询图层,ArcMap 将执行以下操作:
- 它将查询数据库以获取有关空间表的信息,例如维数、空间参考和几何类型。
- 如果没有为整个表定义这些信息,则 ArcMap 将读取表中的第一行并使用来自该要素的信息。
- 如果空间参考、几何类型或维数无法通过查看第一行来确定(例如,如果表中不包含数据或者行正在使用一个自定义的空间参考),则系统将提示您提供这些信息以用于图层定义。
- ArcMap 将查询数据库以找到可在特定表中用作行的唯一标识符 (ObjectID) 的非空列。 如果没有找到符合条件的行,系统将提示您为表定义 ObjectID。
- 最后,在您将图层添加到地图后,ArcMap 将计算该图层的范围。
由于显示在地图中的内容取决于查询图层,因此可以打开查询图层定义并对其进行更改。例如,如果要素类包含点和面,则可以打开查询图层定义并选择要显示的几何类型。同样,如果要素类包含多个空间列,则可以打开查询图层定义并更改查询以包括其他任一空间列。但请注意,不能通过更改查询来显示不支持的数据类型。