65.9K
CodeProject 正在变化。 阅读更多。
Home

空间数据 第1部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (11投票s)

2011 年 6 月 1 日

CPOL

6分钟阅读

viewsIcon

33346

从SQL Server 2008中的关系数据到空间数据

引言

这是空间数据分析!让我来解释一下。空间数据描述了物体在空间中的位置、形状和方向。当我们描述地球上物体的位置和形状时——这被称为地理空间数据。软件巨头们正在超越关系型数据,而微软也适时推出了 SQL Server 2008,它为开发人员提供了两种新的空间数据类型:Geometry 和 Geography。(如果你安装了 SQL Server 2008,现在就去看看——你会发现这些数据类型就在那里。啊!你没看到。我知道你忙着看其他好东西)。所以,欢迎来到空间数据世界。

背景

SQL Server 2005 支持许多数据类型:intcharvarchar(50)。但随后,精确地在地图/地球上定位的想法增加了对空间数据分析的兴趣。这也是为什么微软在 SQL Server 2008 中添加了两种新的数据类型:geography 和 geometry,用于空间数据分析。

涉及的业务逻辑

这其中涉及大量的业务逻辑。让我们考虑其中两个:

  1. 如果我们能够可视化某个特定区域(在地图上)的销售趋势,那该多好啊!然后我们可以根据客户和竞争对手的距离来决定是否要开设新店。此外,如果我们想发展我们的业务(开设新店),我们可以(当然也可以可视化)构建我们的店铺网络,以提供最有效的区域覆盖。
  2. 你听说过全球定位系统 (GPS) 吗?你可能听过!考虑一下当你必须将车辆/设备/资源发送到某个区域的特定地点时的情况。这可能是出于商业目的,也可能是为了在洪水情况下运送救灾物资。在地图上标出位置肯定会有帮助!

所以,我们所谈论的是以地图信息而不是表格/图表格式来呈现数据。

关于 Geometry 和 Geography 数据类型

SQL Server 表中的每个变量、参数和列都被定义为具有特定的数据类型。大家都知道一些常见的 SQL Server 数据类型,如int、char、float 等。
SQL Server 2008 引入了两个新的数据类型——**geometry(用于存储平面矢量空间数据)和 geography(用于存储大地测量矢量空间数据)**

Geometry

geometry 空间数据类型用于在统一的二维平面上表示信息,这与我们在学校用坐标纸做的那样非常相似。因此,我们可以用一对笛卡尔坐标 (x,y) 来表示任何点的**位置**。
然而,geometry 数据类型最适合存储**投影坐标 (x,y)**。在这种情况下,投影过程(还记得工程制图吗)已经将角度地理坐标映射到一个平面上,然后 geometry 数据类型的方法就可以应用于这个平面。

现在,你通常会从现有的图纸或地图开始,并根据这张底图定义你的空间数据

Geography

地球不是平的,也不是球形的。是吗?

earth.png

所以,这就是我们拥有 geography 数据类型的原因。geography 数据类型最重要的特性是它存储大地测量空间数据,这考虑到了地球的曲面。

例如,如果我们要在 geography 数据类型中定义一条连接地球表面两个点的线,这条线会弯曲以适应地球的表面。

使用地理坐标系统时,点的坐标用**纬度**(一个点距离赤道的南北距离)和**经度**(一个点距离本初子午线的东西距离)的角度来表示,这与 geometry 和 geography 数据类型有关。

相似之处和不同之处

相似之处

  1. 它们都可以使用一系列几何图形来表示空间信息——点 (Points)线串 (LineStrings)多边形 (Polygons)
  2. 在 SQL Server 2008 内部,这两种数据类型都以相同的格式将空间数据存储为二进制数据

    binary_thumb.png

  3. 它们都实现了许多相同的标准空间方法(我稍后会告诉你)

区别

属性 geometry 数据类型 geography 数据类型
地球形状 平面 圆形(椭球体)
坐标系统 投影(或自然平面) 地理
坐标值 笛卡尔 (x 和 y) 纬度和经度
测量单位 与坐标值相同 根据空间参考标识符 (SRID)
大小限制 任何对象都不能占据超过一个半球。(这意味着 geography 数据类型的任何变量都不能存储一个超过地球一个半球的对象(区域)!)

SRID

每次(再读一遍——“每次”)我们声明纬度或经度,或描述 geometry 中点位置的 x 和 y 坐标时,我们都必须同时声明获取这些坐标系统的相关空间参考。没有这些额外的信息,一个坐标元组就只是一组数字。

然而,每次写下一组坐标时,都要写出基准面、本初子午线和测量单位的完整细节,这会不会造成负担?幸运的是(再读一遍——“幸运的是”),各种权威机构分配了易于记忆的**唯一整数参考号**,这些号码代表了空间参考系统的所有必要参数。这些参考号被称为**空间参考标识符 (SRID)**。

对于 **geography** 数据类型,每次存储数据项时,我们都必须提供适当的SRID。提供的SRID然后会与sys.spatial_reference_systems表中的一个受支持的空间参考系统相关联。然而,在所有一般情况下,我们可以使用空间参考系统EPSG:4326,其SRID为**4326**。

对于 geometry 数据类型,只要**它们是从同一系统获得的**,那么获取每个点坐标的空间参考系统是什么并不重要。这是因为在投影坐标系统中需要SRID来初始确定唯一标识地球上位置的坐标。一旦获得这些坐标,所有其他操作都可以使用基本几何方法进行。例如:一旦我们确定点 A 是 (0,0) 而点 B 是 (30,40),它们之间的距离总是 50 个单位,而不管获取这些坐标使用了什么空间参考系统。

我们在这里通常会使用SRID 0。但是,如果您需要一个特殊的地图投影系统,请使用那个特定的SRID。**在所有一般情况下,我们将为 geometry 数据类型使用 SRID = 0。**

入门 SQL 查询

让我们开始在 SQL Server Management Studio 2008 中编写查询

DECLARE @a Geometry
SET @a = Geometry::STGeomFromText(‘LINESTRING(0 0, 10 10, 20 0)’,
0) 
SELECT @a       		

这里我们声明一个 geometry 数据类型的变量 **a**。我们将其设置为一个Linestring,经过(0,0) ; (10,10); (20,0)。(SRID0。)

当我们执行它时,我们可以在 SQL Server Management Studio 中看到一个名为“Spatial results!”的新选项卡!

现在,让我们执行一个查询,了解地点 A(地球上 40.20 度 N,2.22 度 E)和地点 B(地球上 50.20 度 N,22.22 度 E)之间的距离。DECLARE @a geography = geography :: Point (40.20 , 2.22 , 4326)

DECLARE @a geography = geography :: Point (40.20 , 2.22 , 4326)
DECLARE @b geography = geography :: Point (50.20 , 22.22 , 4326)
SELECT @a.STDistance(@b)  

这里的4326SRID

关注点

这一系列的文章还有很多内容。空间数据可以用于许多项目,通过集成 .NET 和 Google/Bing Maps 来精确显示您的数据。当你能够精确地定位你的位置、你的结构并可视化事物时,会带来很多乐趣。

历史

© . All rights reserved.