连接到数据源时,ArcGIS 会应用某些规则。 ArcGIS 连接到数据库或云数据仓库中的数据并进行读取时,会应用下列规则:
对象名称
数据库管理系统或云数据仓库供应商对于对象名称可以接受的字符具有不同的定义。 有时,如果您提供用分隔符(例如双引号)括起来的对象名称,数据库会允许您在对象名称中使用不受支持的字符。 但是,ArcGIS 在查询数据库时不会分隔对象名称;因此,ArcGIS 无法识别这些名称。
名称长度
ArcGIS 可以读取并(在某些情况下)创建数据库对象(例如表、视图和用户等)。 下表中列出了 ArcGIS 允许这些对象使用的最大名称长度以及例外情况(如果适用)。
注:
如果您的数据库允许的字符数少于 ArcGIS 允许的字符数,则将限制为数据库允许的字符数。 有关其对象名称限制,请参阅数据库管理系统文档。
假设所列字符数使用单字节字符。
对象类型 | ArcGIS 创建的最大字符数* | ArcGIS 读取的最大字符数 | 异常 |
---|---|---|---|
数据库名称 | 不适用于除 SQLite 之外的任何数据库。 在 SQLite 中创建时,该限制为 250。 | 在从 SQLite 读取时,该限制为 250。 在从其他数据库读取时,该限制为 31。 在从 Amazon Redshift 和 Snowflake 读取时,该限制为 127。 | ArcGIS 可以读取 Oracle 允许的最大数据库名称。 数据库名称值不适用于 SAP HANA。。 SQLite 的数据库名称由文件路径、文件名和文件扩展名组成。 如果 SQLite 数据库配置为使用 ST_Geometry 或 SpatiaLite 空间类型,文件扩展名为 (.sqlite)。 如果 SQLite 数据库配置为 OGC GeoPackage,文件扩展名为 (.gpkg)。 |
表、要素类或视图名称 | 128 在 SQLite 中创建时,该限制为 158。 | 128 在从 SQLite 读取时,该限制为 158。 在从 Redshift 读取时,该限制为 127。 | |
索引名称 | 所有数据库的索引名称都限制为 16 个字符,但 SQL Server 和 SQLite 除外,您可以为其创建最多 128 个字符的索引名称。 | 达到数据库限制。 | 索引名称不适用于 SAP HANA 或云数据仓库。 |
字段(列)名称 | 在 SQL Server、PostgreSQL、SAP HANA、Teradata 和 SQLite 中创建时,该限制为 31。 在 Db2 和 Oracle 中创建时,该限制为 30。 | 在从 PostgreSQL 和 SQLite 读取时,该限制为 31。 当从 Db2 中读取时,该限制为 30。 在从 Snowflake 或 Google BigQuery 读取时,该限制为 128。 在从 Redshift 读取时,该限制为 127。 具体取决于其他受支持数据库的数据库限制。 | |
用户名 | ArcGIS 仅在以下数据库中创建用户。 将显示所创建的最大用户名长度。
| 具体取决于您的连接方式;“数据库连接”对话框最多允许使用 31 个字符。 创建数据库连接地理处理工具可接受最高的数据库限制,但仅支持数据库,不支持云数据仓库。 | 用户名值不适用于 SQLite 或 BigQuery。 |
密码 | ArcGIS 仅在以下数据库中为用户创建密码。 将显示所创建的最大密码长度。
| 所有受支持数据库和云数据仓库的密码长度均限制为 256 个字符,但 Teradata(仅支持 31 个字符)和 Redshift(仅支持 64 个字符)除外。 | 密码值不适用于 SQLite 或 BigQuery。 |
*您不能使用 ArcGIS 在云数据仓库中创建对象。
对于 BigQuery,受支持的最大默认数据集名称长度为 31 个字符。 受支持的最大工程名称长度为 30 个字符。
几何验证
使用 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 必须通过其他来源获取该信息。
将要素类(空间表)拖放到 ArcGIS Pro 中时,即相应地创建了一个查询图层。 要定义查询图层,ArcGIS Pro 将执行以下操作:
- 它将查询数据库以获取有关空间表的信息,例如维数、空间参考和几何类型。
- 如果没有为整个表定义这些信息,则 ArcGIS Pro 将读取表中的第一行并使用来自该要素的信息。
- 如果空间参考、几何类型或维数无法通过查看第一行来确定(例如,如果表中不包含数据或者行正在使用一个自定义的空间参考),则系统将提示您提供这些信息以用于图层定义。
- ArcGIS Pro 将查询数据库以找到可在特定表中用作行的唯一标识符 (ObjectID) 的非空列。 如果没有找到符合条件的行,系统将提示您为表定义 ObjectID。
- 最后,在您将图层添加到地图后,ArcGIS Pro 将计算该图层的范围。
由于显示在地图中的内容取决于查询,因此可以打开查询图层定义并对其进行更改。 例如,如果要素类包含点和面,则可以打开查询图层定义并选择要显示的几何类型。 同样,如果要素类包含多个空间列,则可以打开查询图层定义并更改查询以包括不同的空间列。 但请注意,不能通过更改查询来显示不支持的数据类型。