地理数据库支持使用 Microsoft 几何类型和地理类型存储矢量数据。SQL Server 中提供这些类型;因此无需单独安装即可使用。您也可以使用 ArcGIS 访问包含几何列或地理列的数据库表。
出现以下情形之一时,您可以将几何存储类型与 ArcGIS 一同使用:
- 想要使用的坐标系不是地理坐标系或未在 SQL Server 数据字典中定义。
- 正在使用 SQL Server 2008 或 2008 R2 并且想要用形状存储 z 值或 m 值。
出现以下情形之一时,您可以将地理存储类型与 ArcGIS 一同使用:
- 想要使用的坐标系已在 SQL Server 数据字典中定义。
- 使用 SQL Server 2008 或 2008 R2 并且不需要存储要素的 z 值或 m 值。
- 使用 SQL Server 2012,ArcGIS 支持其中的 z 值和 m 值。
- 数据覆盖大型空间范围并且需要使用 SQL 面积和长度计算。
使用大椭圆线插值的 SQL 面积和长度计算与大型空间范围上的平面线插值明显不同。
- 需要使用大椭圆线插值进行 SQL 空间查询。
使用配置关键字指定空间类型
默认情况下,SQL Server 中的地理数据库使用几何类型。如果想要在 SQL Server 中的地理数据库中使用地理存储类型,必须执行以下操作之一:
- 将 DEFAULTS 配置关键字下的 GEOMETRY_STORAGE 配置参数更改为 GEOGRAPHY。如果大多用户在多数时候都使用地理类型存储数据,则只应更改 DEFAULTS 关键字下的 GEOMETRY_STORAGE 参数。
- 指定在创建要素类时指定 GEOGRAPHY 的 GEOMETRY_STORAGE 配置参数的配置关键字。如果只有部分数据将以地理类型进行存储,则应在创建要素类时指定一个单独的关键字。可使用所提供的关键字 GEOGRAPHY,或者可以创建自己的自定义关键字。
在 SQL Server 数据库(不是地理数据库)中创建要素类时,选择几何或地理关键字。
将现有空间表注册到地理数据库
如果您在地理数据库中使用第三方应用程序或 SQL 创建了包含 SQL Server 空间类型列的表,则可以将这些表注册到该地理数据库来利用地理数据库功能,例如关系类、拓扑、几何网络、宗地结构或者使地理数据库具有子类型、默认值、域或验证规则。为此,这些表必须满足某些先决条件:
- 表必须归对其进行注册的用户所有。
- 表必须具有几何或地理类型的单个空间列。
- 列中所有形状的空间类型必须相同,可以是点、线、面、多点、多字符串或多面。
此外,也不支持在将表注册到地理数据库后使用 SQL 将不同类型的形状添加到列中,这会导致要素类出现意外状况。
- 列中的所有形状都必须使用相同的空间参考 ID (SRID)。
- 注册时指定的 SRID 必须存在于 SDE_spatial_references 系统表中。否则,注册时必须定义投影。
- 如果表中包含主键,必须对其进行聚类。
有关说明,请参阅将表注册到地理数据库。
创建空间索引
SQL Server 要求表具有一个主键才可以在表中创建空间索引。
在 ArcGIS 中
使用 ArcGIS 创建包含几何列或地理列的要素类时,默认情况下,ArcGIS 会在业务表的 ObjectID 列上创建聚类主键。然后 ArcGIS 使用 SQL Server 默认设置创建空间索引。将要素类注册为版本后,将在添加表的 ObjectID 列和状态 ID 列上创建聚类主键,然后创建空间索引。
ArcGIS 会将含几何或地理空间列的要素类的边界框计算为要建立索引的数据的范围。将不会对位于此范围以外的任何要素创建索引,但仍然会在空间查询中返回此类要素。如果未设置要素类范围,则会将该要素类的空间参考系统的最大坐标范围作为边界框。您可以在要素类属性对话框的要素范围选项卡中设置或重新计算要素类的范围。如果要素类位于地理数据库中,只要将空间索引删除并重新创建,就会使用最新的范围对边界框进行调整。
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 的地理要素类中缩放至全球范围会生成违反半球规则的空间过滤器,或含有有效地理范围外坐标的空间过滤器,这种情况下,过滤器形状创建将失败,并且查询将不返回任何结果。