ArcGIS 和 Microsoft 空间类型
地理数据库支持使用 Microsoft 的几何类型和地理类型存储矢量数据。SQL Server 中提供这些类型;因此无需单独安装即可使用。您也可以使用 ArcGIS 访问包含几何列或地理列的数据库表。
几何与地理
Microsoft 几何类型和地理类型都提供对空间数据的 SQL 访问。以下部分对这两种空间类型的其他特征进行了比较。有关 Microsoft 空间类型的附加信息,请参阅 SQL Server 文档。
几何
- 几何类型支持所有的 X/Y 坐标系。
- 平面(平地,欧氏)计算和折点间的直线插值用于渲染和空间比较。
- 符合 SQL 规范(版本 1.1.9)的开放地理空间联盟 (OGC) 简单要素,并符合 ISO 标准 SQL MM。
出现以下情形之一时,您可以将几何存储类型与 ArcGIS 一同使用:
- 想要使用的坐标系不是地理坐标系,或未在 SQL Server 数据字典中定义。
- 正在使用 SQL Server 2008 或 2008 R2 并且想要用形状存储 z 值或 m 值。
地理
- 地理类型支持许多标准地理坐标系,例如 GPS 经度和纬度。
Microsoft 要求使用 SQL Server 数据字典中定义的 SRID 和地理坐标系。
- 椭圆体(圆形地球)模型和折点间的大椭圆线段插值用于计算和空间比较。
- 使用全球(椭圆体)图层范围。
数据坐标不能超过全球范围。
- 在 SQL Server 2008 和 2008 R2 中,要素必须小于单个半球。
- 如果使用 SQL Server 2008 或 2008 R2,当要素与 ArcGIS 一同使用时,则要素不能有 z 坐标或 m 坐标。
出现以下情形时,您可以将地理存储类型和 ArcGIS 一同使用
- 想要使用的坐标系已在 SQL Server 数据字典中定义。
- 使用 SQL Server 2008 或 2008 R2 并且不需要存储要素的 z 值或 m 值。
- 使用 SQL Server 2012,ArcGIS 支持其中的 z 值和 m 值。
- 数据覆盖大型空间范围并且需要使用 SQL 面积和长度计算。
使用大椭圆线插值的 SQL 面积和长度计算与大型空间范围上的平面线插值明显不同。
- 需要使用大椭圆线插值进行 SQL 空间查询。
Microsoft 空间类型与 ArcGIS 结合使用
使用配置关键字指定 Microsoft 空间类型
默认情况下,SQL Server 中的地理数据库使用 Microsoft 几何类型。如果要在预置 SQL Server 数据库中的地理数据库中使用 Microsoft 地理类型进行存储,必须 (1) 将 SDE_dbtune 表中 DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 参数更改为 GEOGRAPHY,或 (2) 指定在创建要素类时将 GEOMETRY_STORAGE 参数指定为 GEOGRAPHY 的配置关键字。
如果多数用户在多数时候都使用地理类型存储数据,则只应更改 DEFAULTS 关键字下的 GEOMETRY_STORAGE 参数。如果只有部分数据将以地理类型进行存储,则应在创建要素类时指定一个单独的关键字。可使用所提供的关键字 GEOGRAPHY,或者可以创建自己的自定义关键字。
使用 sdedbtune 管理命令更改 SDE_dbtune 表中的值。可使用 SQL Server 的 ArcSDE 应用程序服务器安装程序安装此命令。
在 SQL Server 数据库中创建要素类时,选择几何或地理关键字。
将现有空间表注册到地理数据库
如果您在地理数据库中使用第三方应用程序或 SQL 创建了包含 Microsoft 空间类型列的表,则可以将这些表注册到该地理数据库来利用地理数据库功能,例如关系类、拓扑、几何网络、地籍结构、terrain 或方案,或者或者使地理数据库具有子类型、默认值、域或验证规则。为此,这些表必须满足某些先决条件:
- 表必须归对其进行注册的用户所有。
- 表必须具有几何或地理类型的单个空间列。
- 列中所有形状的空间类型必须相同,可以是点、线、面、多点、多字符串或多面。
此外,也不支持在将表注册到地理数据库后使用 SQL 将不同类型的形状添加到列中,这会导致要素类出现意外状况。
- 列中的所有形状都必须使用相同的空间参考 ID (SRID)。
- 注册时指定的 SRID 必须存在于 SDE_spatial_references 系统表中。否则,注册时必须定义投影。
- 如果表中包含主键,必须对其进行聚类。
有关如何在 ArcGIS for Desktop 中将表注册到地理数据库的说明,请参阅将表注册到地理数据库。
在现有数据库中启用地理数据库不能将现有表自动注册到地理数据库中。任何想要在地理数据库中使用的表或要素类都必须分别注册到地理数据库中。
创建空间索引
SQL Server 要求表具有一个主键才可以在表中创建空间索引。
在 ArcGIS 中
在地理数据库中使用 ArcGIS 创建包含几何列或地理列的要素类时,默认情况下,ArcGIS 会在业务表的行 ID (ObjectID) 列上创建聚类主键,然后基于为创建要素类时使用的 SDE_dbtune 表中的配置关键字的 B_MS_SPINDEX 参数设置的值构建空间索引。将要素类注册为版本后,会在“添加”表的行 ID 和状态 ID 列上创建聚集主键,然后基于为创建要素类时使用的配置关键字中的 A_MS_SPINDEX 设置的值构建空间索引。这两个参数的默认值如下:
GRIDS = (MEDIUM, MEDIUM, MEDIUM, MEDIUM), CELLS_PER_OBJECT = 16
有关在 SDE_dbtune 表中设置值的详细信息,请参阅修改 DBTUNE 表的内容。
在数据库或地理数据库中通过 ArcGIS 使用几何或地理空间列创建要素类时,会将要素类的边界框计算为要建立索引的数据范围。将不会对位于此范围以外的任何要素创建索引,但仍然会在空间查询中返回此类要素。如果未设置要素类范围,则会将该要素类的空间参考系统的最大坐标范围作为边界框。您可以在要素类属性 对话框的要素范围选项卡中设置或重新计算要素类的范围。如果要素类位于地理数据库中,只要将图层从只加载 I/O 模式转换到正常 I/O 模式,就会使用最新的范围对边界框进行调整。
ArcGIS 外部
对于在 ArcGIS 外部创建的空间表(如,那些使用 SQL 创建的表),必须为此类表创建主键并使用 SQL 创建空间索引。以下是用于在包含几何类型列的表中创建空间索引的 SQL 语法:
CREATE SPATIAL INDEX <index_name>
ON <table> (<spatial column>)
USING GEOMETRY_GRID
WITH (
BOUNDING_BOX = minx,miny,maxx,maxy),
GRIDS = (low|medium|high, low|medium|high, low|medium|high, low|medium|high),
CELLS_PER_OBJECT = n,
<other regular btree index options like filegroups, fill factors, etc>
)
下列语法将在地理列中创建空间索引:
CREATE SPATIAL INDEX <index_name>
ON <table> (<spatial column>)
USING GEOGRAPHY_GRID
WITH (
GRIDS = (low|medium|high, low|medium|high, low|medium|high, low|medium|high),
CELLS_PER_OBJECT = n,
<other regular btree index options like filegroups, fill factors, etc>
)
将 SQL Server 地理与 ArcGIS 结合使用的已知限制条件
以下是将 SQL Server 地理数据存储在企业级地理数据库中时所需牢记的注意事项的列表:
- 如果使用的是 SQL Server 2008 或 2008 R2,ArcGIS 不能以地理数据类型存储 z 值或 m 值。因此,如果要将现有数据存储在地理数据库中(例如 shapefile 或其他地理数据库中的要素类),并且必须使用地理数据类型进行存储,那么导入的数据集不能具有 3D (z) 或测量 (m) 属性。
必须禁用 z 和 m 属性,才能将数据导入到 SQL Server 2008 或 2008 R2 的地理数据库中。此外,可将具有 3D 或测量属性的数据导入使用几何或压缩二进制存储类型的要素类中,或导入 SQL Server 2012 的地理数据库中。
- 大多数情况下,地理数据的测量值以米为单位。测量单位在 sys.spatial_ref_system 中指明;选中与数据关联的 EPSG 值使用的单位。
- 在 SQL Server 2008 的地理要素类中缩放至全球范围会生成违反半球规则的空间过滤器,或含有有效地理范围外坐标的空间过滤器,这种情况下,过滤器形状创建将失败,并且查询将不返回任何结果。