SQL Server 空间类型和 ArcGIS

地理数据库支持使用 Microsoft 几何类型和地理类型存储矢量数据。SQL Server 中提供这些类型;因此无需单独安装即可使用。您也可以使用 ArcGIS 访问包含几何列或地理列的数据库表。

出现以下情形之一时,可将几何存储类型与 ArcGIS 一同使用:

  • 想要使用的坐标系不是地理坐标系或未在 SQL Server 数据字典中定义。
  • 您想要用形状存储 z 值或 m 值。

出现以下情形之一时,可将地理存储类型与 ArcGIS 一同使用:

  • 想要使用的坐标系已在 SQL Server 数据字典中定义。
  • 数据覆盖大型空间范围并且需要使用 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>
 )

ArcGIS 添加列以存储额外的几何元素

几何类型和地理类型无法存储地理数据库必定支持的所有类型的几何元素。因此,当您创建或注册将几何或地理存储类型与 SQL Server 中的地理数据库配合使用的要素类时,ArcGIS 会向业务表中添加列,以存储这些额外的几何元素。此列名为 gdb_geomattr_data。其他几何元素如下:

  • 通过高级编辑工具创建的参数对象,例如圆弧和贝塞尔曲线
  • PointID
  • 多面体要素
  • 来自 ArcGIS Spatial Analyst extension 的表面片

一旦 ArcGIS 检测到数据源具有这些额外的几何元素,则会将简单几何表达存储在 shape 列中,并将未修改的数据(包括其他元素)存储在 gdb_geomattr_data 列中。

将 SQL Server 地理与 ArcGIS 结合使用的已知限制条件

大多数情况下,地理数据的测量值以米为单位。测量单位在 sys.spatial_ref_system 中指明;选中与数据关联的 EPSG 值使用的单位。