有两种类型的空间数据。geometry 数据类型支持平面或欧几里得(平面球)数据。geometry 数据类型符合适用于 SQL 规范的开放地理空间联盟 (OGC) 简单特征 1.1.0 版。

另外,SQL Server 支持 geography 数据类型,该数据类型可存储诸如 GPS 纬度和经度坐标之类的椭圆体(圆球)数据。

geometry 和 geography 数据类型支持十一种空间数据对象或实例类型。但是,这些实例类型中只有七种“可实例化”;可以在数据库中创建并使用这些实例(或可对其进行实例化)。这些实例的某些属性由其父级数据类型派生而来,使其在 GeometryCollection 中区分为 Points LineStringsPolygons 或多个 geometry  geography 实例。

下图描述了 geometry 和 geography 数据类型所基于的 geometry 层次结构。geometry 和 geography 的可实例化类型以蓝色表示。

如图所示,geometry 和 geography 数据类型的七种可实例化类型为 PointMultiPointLineStringMultiLineStringPolygonMultiPolygon 和GeometryCollection。只要特定实例的格式正确,即使未显式定义该实例,geometry  geography 类型也可识别该实例。例如,如果您使用 STPointFromText() 方法显式定义了一个 Point 实例,只要方法输入的格式正确,geometry 和 geography 便将该实例识别为 Point。如果您使用 STGeomFromText() 方法定义了相同的实例,则 geometry 和geography 数据类型都将该实例识别为 Point

SRID (空间引用标识符)

每个空间实例都有一个空间引用标识符 (SRID)。

SRID 对应于基于特定椭圆体的空间引用系统,可用于平面球体映射或圆球映射。

空间列可包含具有不同 SRID 的对象。

然而,在使用 SQL Server 空间数据方法对数据执行操作时,仅可使用具有相同 SRID 的空间实例。

从两个空间数据实例派生的任何空间方法的结果仅在这两个实例具有相同的 SRID(该 SRID 基于相同的用于确定实例坐标的度量单位、数据和投影)时才有效。SRID 最常见的度量单位为米或平方米。

如果两个空间实例的 SRID 不相同,则对这两个实例使用 geometry 或 geography 数据类型方法后的结果将返回 NULL。例如,若要以下谓词返回非 NULL 结果,两个 geometry实例(geometry1 和 geometry2)必须具有相同的 SRID:

geometry1.STIntersects(geometry2) = 1

空间引用标识系统是由 European Petroleum Survey Group (EPSG) standard(欧洲石油测绘组 (EPSG) 标准)定义的,它是为绘图、测绘以及大地测量数据存储而开发的一组标准。该标准归石油天然气生产商 (OGP) 测绘和定位委员会所有。

几何图形实例默认 SRID 为零

SQL Server 中 geometry 实例的默认 SRID 为 0。利用 geometry 空间数据,执行计算是不需要空间实例的指定 SRID 的;因此,实例可驻留在未定义的平面空间。若要在geometry 数据类型方法的计算中指明未定义的平面空间,SQL Server 数据库引擎 使用 SRID 0。

地域实例必须使用支持的 SRID

SQL Server 支持基于 EPSG 标准的 SRID。必须使用 geography 实例的支持,SQL Server 的 SRID 执行计算或将方法用于地域空间数据。

SRID 必须与 sys.spatial_reference_systems 目录视图中显示的 SRID 中的一个匹配。

如前所述,在使用 geography 数据类型对空间数据执行计算时,结果将取决于在创建数据时使用的是哪个椭圆体,因为为每个椭圆体都分配了一个特定空间引用标识符 (SRID)。

对 geography 实例使用方法时,SQL Server 使用等于 4326 的默认 SRID,它将映射到 WGS 84 空间引用系统。如果要使用 WGS 84(或 SRID 4326)之外的某个空间引用系统中的数据,您需要确定地域空间数据的特定 SRID。

在 SQL Server 空间数据中,Point 是表示单个位置的零维对象,可能包含 Z(仰角)和 M(度量)值。

下面的示例创建一个表示点 (3, 4) 的 geometry Point 实例,该实例的 SRID 为 0。

  1. DECLARE @g geometry;
  2. SET @g = geometry::STGeomFromText('POINT (3 4)', 0);
  1.  

下一个示例创建一个表示点 (3, 4) 的 geometry Point 实例,该实例的 Z(仰角)值为 7,M(度量)值为 2.5,默认 SRID 为 0。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('POINT(3 4 7 2.5)');
  1.  

最后一个示例返回 geometry Point 实例的 X、Y、Z 和 M 值。

  1. SELECT @g.STX;
  2. SELECT @g.STY;
  3. SELECT @g.Z;
  4. SELECT @g.M;
  1.  

Z 和 M 值可以显式指定为 NULL,如下例所示。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('POINT(3 4 NULL NULL)');

C#

  1. SqlGeometry centPoint = (SqlGeometry)dr.GetValue(1); // 中心点或点SQlGeometry类型
  2. //实际上下面的代码执行一次就跳出了
  3. // 随机取了第一个点为中心点
  4. for (int j = 1; j <= centPoint.STNumPoints(); j++ )
  5. {
  6. GeoPoint geoPoint = new GeoPoint
  7. (centPoint.STPointN(j).STX.Value, centPoint.STPointN(j).STY.Value);
  8. //面积中心点
  9. spatialRes.GeoPolygon.CentPoint = geoPoint;
  10. //点
  11. spatialRes.GeoPoint = geoPoint;
  12. break;
  13. }
  1.  
  1. MultiPoint

MultiPoint 是零个点或更多个点的集合。MultiPoint 实例的边界为空。

下面的示例创建一个 geometry MultiPoint 实例,该实例的 SRID 为 23 且包含两个点:一个点的坐标为 (2, 3),另一个点的坐标为 (7, 8),Z 值为 9.5。

  1. DECLARE @g geometry;
  2. SET @g = geometry::STGeomFromText('MULTIPOINT((2 3), (7 8 9.5))', 23);
  1.  

该 MultiPoint 实例也可使用 STMPointFromText() 表示,如下所示。

  1. DECLARE @g geometry;
  2. SET @g = geometry::STMPointFromText('MULTIPOINT((2 3), (7 8 9.5))', 23);
  1.  

下面的示例使用方法 STGeometryN() 来检索有关集合中第一个点的说明。

  1. SELECT @g.STGeometryN(1).STAsText();
  1.  
  1. LineString

LineString 是一个一维对象,表示一系列点和连接这些点的线段。一个 LineString 实例必须由至少两个非重复点组成,也可以为空。

如图中所示:

  • 图 1 显示的是一个简单、非闭合的 LineString 实例。
  • 图 2 显示的是一个不简单、非闭合的 LineString 实例。
  • 图 3 显示的是一个闭合、简单的 LineString 实例,因此是一个环。
  • 图 4 显示的是一个闭合、不简单的 LineString 实例,因此不是一个环。

下面的示例说明如何创建一个包含三个点且 SRID 为 0 的 geometry LineString 实例:

  1. DECLARE @g geometry;
  2. SET @g = geometry::STGeomFromText('LINESTRING(1 1, 2 4, 3 9)', 0);

此 LineString 实例中的每个点都可以包含 Z(仰角)和 M(度量)值。下面这个示例向上例中创建的 LineString 实例添加了 M 值。M 和 Z 可以为 Null 值。

  1. DECLARE @g geometry;
  2. SET @g = geometry::STGeomFromText('LINESTRING(1 1 NULL 0, 2 4 NULL 12.3, 3 9 NULL 24.5)', 0);

MultiLineString

MultiLineString 是零个或更多 geometry 或 geography LineString 实例的集合。

如图中所示:

  • 图 1 显示的是一个简单的 MultiLineString 实例,其边界是其两个 LineString 元素的四个端点。
  • 图 2 显示的是一个简单的 MultiLineString 实例,因为只有 LineString 元素的端点相交。边界是两个不重叠的端点。
  • 图 3 显示的是一个不简单的 MultiLineString 实例,因为它的其中一个 LineString 元素的内部出现了相交。此 MultiLineString 实例的边界是四个端点。
  • 图 4 显示的是一个不简单、非闭合的 MultiLineString 实例。
  • 图 5 显示的是一个简单、非闭合的 MultiLineString。它没有闭合是因为它的 LineStrings 元素没有闭合。而其简单的原因在于,其任何 LineStrings 实例的内部都没有出现相交。
  • 图 6 显示的是一个简单、闭合的 MultiLineString 实例。它为闭合的是因为它的所有元素都是闭合的。而其简单的原因在于,其所有元素都没有出现内部相交现象。

下面的示例创建了一个包含两个 LineString 元素且 SRID 为 0 的简单 geometry MultiLineString 实例。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('MULTILINESTRING((0 2, 1 1), (1 0, 1 1))');

若要使用不同的 SRID 实例化此实例,请使用 STGeomFromText() 或 STMLineStringFromText()。也可以使用 Parse(),然后修改 SRID,如下例所示。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('MULTILINESTRING((0 2, 1 1), (1 0, 1 1))');
  3. SET @g.STSrid = 13;
  1.  
  1. 多边形

Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。可以从至少具有三个不同点的环中构建一个 Polygon 实例。Polygon 实例也可以为空。

Polygon 的外部环和任意内部环定义了其边界。环内部的空间定义了 Polygon 的内部。Polygon 的内部环在单个切点处既可与自身接触也可彼此接触,但如果 Polygon 的内部环交叉,则该实例无效。

如图中所示:

  1. 图 1 是由外部环定义其边界的 Polygon 实例。
  2. 图 2 是由外部环和两个内部环定义其边界的 Polygon 实例。内部环内的面积是 Polygon 实例的外部环的一部分。
  3. 图 3 是一个有效的 Polygon 实例,因为其内部环在单个切点处相交。

下例创建了一个带有孔和 SRID 为 10 的简单 geometry Polygon 实例。

  1. DECLARE @g geometry;
  2. SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);
  1.  

可能输入无效的实例并转换为有效的 geometry 实例。在下列 Polygon 示例中,内部环和外部环重叠且该实例无效。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))');

在下例中,无效实例通过 MakeValid() 成为有效实例。

  1. SET @g = @g.MakeValid();
  2. SELECT @g.ToString();

以上示例中返回的 geometry 实例为 MultiPolygon

  1. MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)), ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))
  1.  
  1. MultiPolygon
  1. MultiPolygon 实例是零个或更多个 Polygon 实例的集合。

如图中所示:

  • 图 1 是一个包含两个 Polygon 元素的 MultiPolygon 实例。边界由两个外环和三个内环界定。
  • 图 2 是一个包含两个 Polygon 元素的 MultiPolygon 实例。边界由两个外环和三个内环界定。这两个 Polygon 元素在切点处相交。

下面的示例演示如何创建 geometry MultiPolygon 实例,并返回第二个组件的熟知文本 (WKT)。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('MULTIPOLYGON(((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))');
  3. SELECT @g.STGeometryN(2).STAsText();

该示例实例化一个空的 MultiPolygon 实例。

  1. DECLARE @g geometry;
  2. SET @g = geometry::Parse('MULTIPOLYGON EMPTY');
  1.  
  1. 括号要注意一个()代表LineString (())代表面,((()))代表多面
  1.  
  1. GeometryCollection
  1. GeometryCollection 是零个或更多个 geometry geography 实例的集合。GeometryCollection 可以为空。
  1. 下面的示例实例化一个包含 Point 实例和 Polygon 实例的 geometry GeometryCollection,它具有 Z 值,且 SRID 1
  1. DECLARE @g geometry;
  2. SET @g = geometry::STGeomCollFromText('GEOMETRYCOLLECTION(POINT(3 3 1), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))', 1);

SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)的更多相关文章

  1. SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

    原文:SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft S ...

  2. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

  3. SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

  4. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...

  5. SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据

    转自:http://www.cnblogs.com/beniao/archive/2011/03/22/1989310.html 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Micros ...

  6. SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息

    原文:SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2 ...

  7. SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...

  8. SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

    原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...

  9. SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

    原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Se ...

随机推荐

  1. HDU-5540 Secrete Master Plan

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission( ...

  2. mysite-exampleservice和mysite-vsg

    可能找到了这两个nova安装的地方,下午分析 搜素site_name test 这条线 cord-compute-maas-playbook这条线 这个可以作为验证

  3. hibernate基础配置文件

    主配置文件 <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC " ...

  4. 如何实现session的共享?

    1.以cookie加密的方式保存在客户端. 优点是减轻服务器端的压力 缺点是受到cookie的大小限制,可能占用一定带宽,因为每次请求会在头部附带一定大小的cookie信息,另外这种方式在用户禁止使用 ...

  5. mysqldump 工具使用详解——参数选项

    mysqldump 简介 mysqldump 是一种用于逻辑备份的客户端工具,它会产生一套能够重新构建数据库或表的SQL语句.所谓逻辑备份:是利用SQL语言从数据库中抽取数据并存于二进制文件的过程.逻 ...

  6. 2.while循环 编码的初识,逻辑运算符 格式化输出

    while循环 循环 while True: # while 是关键字 条件 print('精忠报国') print('团结就是力量') print('北京欢迎你') print('葫芦爷爷救娃娃') ...

  7. 揭开Python科学计算的面纱

    春牛春杖.无限春风来海上.便与春工.染得桃红似肉红. 春幡春胜.一阵春风吹酒醒.不似天涯.卷起杨花似雪花. 标准的Python中用列表保存一组值,可以当做数组使用,但是由于其值类型任意,所以列表中保存 ...

  8. Jquery | 基础 | 使用 jQuery 表单过滤选择器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. BZOJ1026(数位dp)

    数位dp第二道-就当成搜索,套板子写了写.我写的dp[pos][pre][state0]记录的是当前pos位没有限制时.前面的数是pre时.前面是否都是0时的方案数. #include <cst ...

  10. 线段树/树状数组 POJ 2182 Lost Cows

    题目传送门 题意:n头牛,1~n的id给它们乱序编号,已知每头牛前面有多少头牛的编号是比它小的,求原来乱序的编号 分析:从后往前考虑,最后一头牛a[i] = 0,那么它的编号为第a[i] + 1编号: ...