跳转到内容

Microsoft SQL Server/地理空间数据

来自维基教科书,开放的书籍,开放的世界

微软在 2008 年发布的 SQL Server 最终为 SQL Server 产品套件带来了地理空间支持。

这允许将空间数据存储在 SQL 表中(以点、线和多边形的形式),以及一组函数来操作这些数据。还包括新的空间索引来支持这些函数的执行。

示例数据库

[编辑 | 编辑源代码]

本书将使用一个示例数据库作为其大多数示例的基础。创建该数据库的代码可以在附录 A 中找到,应该按照那里的说明运行,以便能够在本书中使用示例代码。以下是该数据库及其包含数据的简要描述。如果您愿意,可以跳过此部分,直接进入有趣的内容,在学习过程中找出数据库的作用。

地理空间数据类型

[编辑 | 编辑源代码]

SQL Server 2008 支持两种不同的空间数据类型:GEOMETRY 和 GEOGRAPHY。

  • GEOMETRY - 此数据类型将数据存储在投影平面表面中。
  • GEOGRAPHY - 此数据类型将数据存储在椭球模型中。

几何类定义了一个层次结构,如下所示

从图中我们可以看到,有七种可实例化的空间数据类型(橙色)。即


点是一个表示单个位置的对象。它始终具有 X 和 Y 坐标,并且可以另外具有海拔 Z 和度量 M。

多点对象是点的集合。它与线串和多边形不同,因为集合中的点之间没有隐含的连接。因此,多点对象的边界为空。

线串同样是点的集合。但是,这与多点对象不同,因为点是有序的,线串对象还表示连接点的线段。

多线串

[编辑 | 编辑源代码]

多线串只是线串的集合。

多边形

[编辑 | 编辑源代码]

多边形是表示二维表面的点的集合。多边形可以包含一个外部环和多个内部环。为了使多边形对象成为有效的实例,内部环不能交叉。

多边形集合

[编辑 | 编辑源代码]

多边形集合是多边形的集合。

几何集合

[编辑 | 编辑源代码]

几何集合是几何(或地理)对象的集合。

视觉化

[编辑 | 编辑源代码]

将地理空间数据导入 SQL Server

[编辑 | 编辑源代码]

数据可以从以下格式直接导入 SQL Server:WKT、WKB 和 GML。有关这些格式的更多详细信息,请参阅附录。

那我无法从 shape 文件导入数据吗?

[编辑 | 编辑源代码]

目前您无法直接执行此操作,将来版本是否会改变还有待观察。如果您的数据在 shape 文件或其他格式中,则需要找到一种方法进行转换。有许多 Microsoft Spatial 合作伙伴提供工具,可以让您执行此操作,但显然这会涉及额外的许可费用。我相信随着 SQL Server 2008 版本的发布,免费版本将开始出现。目前,Morten Nielsen 在他的博客上发布了这样一个免费工具 [[1]],Tillmann Eitelberg 在 CodePlex 上发布了 MS-PL 下的 SSIS shape 文件源 [[2]]。AutoConViz(由 Sugam Sharma、U Sunday Tim 和 Shashi Gadia 开发)还提供基于 GUI 的空间格式转换(shape 文件格式到 GML)作为其核心功能之一 [[3]]。

导入函数

[编辑 | 编辑源代码]

将空间数据导入 SQL Server 2008 是通过 STxxxfromyyy 函数集来完成的,其中 xxx 可以是以下之一

  • Geom - 用于导入任何空间数据类型。
  • Point - 用于导入点数据。
  • Line - 用于导入线数据。
  • Poly - 用于导入多边形数据。


  • GeomColl - 用于导入几何集合。
  • MPoint - 用于导入多点数据。
  • MLine - 用于导入多线数据。
  • MPoly - 用于导入多边形数据。


yyy 可以是

  • Text - 用于导入 WKT 格式的数据。
  • WKB - 用于导入 WKB 格式的数据。
  • Gml - 用于导入 GML 格式的数据。(注意 Gml 的大小写,此函数缺少前导 ST,例如:GeomfromGml(.....))
CREATE TABLE Districts 
( DistrictId int IDENTITY (1,1),
DistrictName nvarchar(20),
DistrictGeo geometry);
GO

CREATE TABLE Streets 
( StreetId int IDENTITY (1,1),
StreetName nvarchar(20),
StreetGeo geometry);
GO

INSERT INTO Districts (DistrictName, DistrictGeo)
VALUES ('Downtown',
geometry::STGeomFromText
('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));

INSERT INTO Districts (DistrictName, DistrictGeo)
VALUES ('Green Park',
geometry::STGeomFromText
('POLYGON ((300 0, 150 0, 150 150, 300 150, 300 0))', 0));

INSERT INTO Districts (DistrictName, DistrictGeo)
VALUES ('Harborside',
geometry::STGeomFromText
('POLYGON ((150 0, 300 0, 300 300, 150 300, 150 0))', 0));

INSERT INTO Streets (StreetName, StreetGeo)
VALUES ('First Avenue',
geometry::STGeomFromText
('LINESTRING (100 100, 20 180, 180 180)', 0))
GO

INSERT INTO Streets (StreetName, StreetGeo)
VALUES ('Mercator Street', 
geometry::STGeomFromText
('LINESTRING (300 300, 300 150, 50 51)', 0))
GO

地理空间 SQL 函数

[编辑 | 编辑源代码]
  • STRelate
  • STDisjoint
  • STIntersects
  • STTouches
  • STCrosses
  • STWithin
  • STContains
  • STOverlaps
  • STBuffer
  • STConvexHull
  • STIntersection
  • STUnion
  • STGeomFromText
  • STPointFromText
  • STLineFromText
  • STPolyFromText
  • STGeomFromWKB
  • STPointFromWKB
  • STLineFromWKB
  • STPolyFromWKB

A. 示例数据库代码

B. WKT(Well Known Text)格式定义

C. GML(地理标记语言)格式定义

参考文献

[编辑 | 编辑源代码]
  • Directions 杂志对 Ed Katibah 的采访 [4]
  • Isaac Kunen 的博客 [5]
  • Microsoft 空间论坛 [6]
  • Microsoft SQL Server 2008 空间数据概述 [7]
  • Microsoft SQL Server 2008 空间数据数据表 [8]
  • Microsoft SQL Server 2008 空间数据白皮书 [9]
  • Microsoft 联机丛书 [10]
  • 维基百科 [11]
  • AutoConViz 用于基于 GUI 的空间格式在线转换 [12]
华夏公益教科书