写在前面 :
为什么要在 SQL Server 内创建空间要素?
该需求来自于千万级别POI数据的存储与可视化。
存储部分使用 SQL Server 即可,并且筛选查询的效率也比较高。
可视化方面用的比较多的是 ArcGIS , 分析起来也比较方便,但对于大批量数据的处理效率比较低。
因此就希望能够把数据库的存储与查询能力,和 ArcGIS 的空间数据可视化与分析能力结合起来。经过一番搜索,得到了以下的解决方案。

1. 在 SQL Server 内创建空间要素

在数据库内创建空间要素的方法来自于微软官方文档 创建、构造和查询几何图形实例,在 SQL Server 2014 上测试可用。
此处以创建点要素为例: geometry::STPointFromText('POINT (x y)', SRID)
其中 x, y 为坐标值。SRID为空间参考编号,可在 ArcGIS 内空间参考设置处找到不同坐标系的ID, WGS 1984 坐标系的 SRID 为 4326 。
因此可用以下代码创建一个经纬度为121.15545, 31.65894的点。

1
select geometry::STPointFromText('POINT (121.15545 31.65894)', 4326)

2. 构造一个 ArcGIS 可直接连接的数据表

要在 ArcGIS 内直接显示 SQL Server 数据表内的空间要素,则对数据表的结构有一定要求。
以点要素为例,创建的表需要以int类型的OBJECTID字段作为主键,并有一个geometry数据类型的字段。
示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/***** 创建包含空间数据的表 *****/
USE [测试数据库]
CREATE TABLE [测试数据表] (
[OBJECTID] [int] primary key not NULL,
[id] [varchar](10) NULL,
[name] [varchar](200) NULL,
[lng] [float] NULL,
[lat] [float] NULL,
[形状] [geometry] not NULL
)
/***** 将数据插入表中 *****/
insert into [测试数据表]
SELECT ROW_NUMBER() over (order by [id]) as [OBJECTID]
,[id]
,[name]
,[lng]
,[lat]
,geometry::STPointFromText(concat('POINT (',convert(varchar, [lng], 128), ' ', convert(varchar, [lat], 128), ')'), 4326 ) as [形状]
FROM [原数据表]

Tip :
快速获得原数据表的数据结构代码,可对原数据表右键-编写表脚本为-CREATE 到-新查询编辑器窗口

3. 使用 ArcGIS 显示 SQL Server 内存储的数据

ArcGIS 软件提供了丰富的数据源方式,其中就包括 SQL Server。

  • ArcMap 内,目录窗口,双击数据库连接-添加数据库连接
  • 在弹出的窗口内,数据库平台选择SQL Server,实例填写 SQL Server 服务器名(SQL Server 安装在本机的话,可填写localhost或本机计算机名),身份验证类型按需选择,默认为操作系统身份验证,然后在下拉列表内选择数据表所在数据库,确定即可。
  • 数据库连接下找到新添加的连接,双击打开,将包含空间数据的表拖到显示窗口内即可。如果数据量较大,计算范围时间过程,可选择使用空间参考范围跳过此步骤。

如果只需要显示部分的数据,可在图层的属性-定义查询内填入筛选查询语句。筛选操作由数据库后台完成,因此效率还可以接受。

本文来自 i.xdc.at/2016/10/05/geometry-in-SQL-Server/


Tip :
如果想创建存储其他空间要素类型的数据表,如线要素的表,可在 ArcGIS 内将已有的线数据图层右键-数据-导出数据...,输出要素类的保存类型选择数据库要素类,将数据保存到数据库连接里的一张新表内,然后在 SQL Server 内查看这张表的结构,具体操作为对这张表右键-编写表脚本为-CREATE 到-新查询编辑器窗口

UPDATE: 2016-10-06

为提高数据在 ArcGIS 内显示的效率,最好对数据表创建空间索引,参见 创建、修改和删除空间索引