Microsoft SQL Server/地理空间数据
微软在 2008 年发布的 SQL Server 最终为 SQL Server 产品套件带来了地理空间支持。
这允许将空间数据存储在 SQL 表中(以点、线和多边形的形式),以及一组函数来操作这些数据。还包括新的空间索引来支持这些函数的执行。
本书将使用一个示例数据库作为其大多数示例的基础。创建该数据库的代码可以在附录 A 中找到,应该按照那里的说明运行,以便能够在本书中使用示例代码。以下是该数据库及其包含数据的简要描述。如果您愿意,可以跳过此部分,直接进入有趣的内容,在学习过程中找出数据库的作用。
SQL Server 2008 支持两种不同的空间数据类型:GEOMETRY 和 GEOGRAPHY。
- GEOMETRY - 此数据类型将数据存储在投影平面表面中。
- GEOGRAPHY - 此数据类型将数据存储在椭球模型中。
几何类定义了一个层次结构,如下所示
从图中我们可以看到,有七种可实例化的空间数据类型(橙色)。即
点是一个表示单个位置的对象。它始终具有 X 和 Y 坐标,并且可以另外具有海拔 Z 和度量 M。
多点对象是点的集合。它与线串和多边形不同,因为集合中的点之间没有隐含的连接。因此,多点对象的边界为空。
线串同样是点的集合。但是,这与多点对象不同,因为点是有序的,线串对象还表示连接点的线段。
多线串只是线串的集合。
多边形是表示二维表面的点的集合。多边形可以包含一个外部环和多个内部环。为了使多边形对象成为有效的实例,内部环不能交叉。
多边形集合是多边形的集合。
几何集合是几何(或地理)对象的集合。
-
点
-
多点
-
线串
-
多线串
-
多边形
-
多边形集合
-
几何集合
数据可以从以下格式直接导入 SQL Server:WKT、WKB 和 GML。有关这些格式的更多详细信息,请参阅附录。
目前您无法直接执行此操作,将来版本是否会改变还有待观察。如果您的数据在 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
- STRelate
- STDisjoint
- STIntersects
- STTouches
- STCrosses
- STWithin
- STContains
- STOverlaps
- STBuffer
- STConvexHull
- STIntersection
- STUnion
- STGeomFromText
- STPointFromText
- STLineFromText
- STPolyFromText
- STGeomFromWKB
- STPointFromWKB
- STLineFromWKB
- STPolyFromWKB
A. 示例数据库代码