空间数据 第1部分
从SQL Server 2008中的关系数据到空间数据
引言
这是空间数据分析!让我来解释一下。空间数据描述了物体在空间中的位置、形状和方向。当我们描述地球上物体的位置和形状时——这被称为地理空间数据。软件巨头们正在超越关系型数据,而微软也适时推出了 SQL Server 2008,它为开发人员提供了两种新的空间数据类型:Geometry 和 Geography。(如果你安装了 SQL Server 2008,现在就去看看——你会发现这些数据类型就在那里。啊!你没看到。我知道你忙着看其他好东西)。所以,欢迎来到空间数据世界。
背景
SQL Server 2005 支持许多数据类型:int
、char
、varchar(50)
。但随后,精确地在地图/地球上定位的想法增加了对空间数据分析的兴趣。这也是为什么微软在 SQL Server 2008 中添加了两种新的数据类型:geography 和 geometry,用于空间数据分析。
涉及的业务逻辑
这其中涉及大量的业务逻辑。让我们考虑其中两个:
- 如果我们能够可视化某个特定区域(在地图上)的销售趋势,那该多好啊!然后我们可以根据客户和竞争对手的距离来决定是否要开设新店。此外,如果我们想发展我们的业务(开设新店),我们可以(当然也可以可视化)构建我们的店铺网络,以提供最有效的区域覆盖。
- 你听说过全球定位系统 (GPS) 吗?你可能听过!考虑一下当你必须将车辆/设备/资源发送到某个区域的特定地点时的情况。这可能是出于商业目的,也可能是为了在洪水情况下运送救灾物资。在地图上标出位置肯定会有帮助!
所以,我们所谈论的是以地图信息而不是表格/图表格式来呈现数据。
关于 Geometry 和 Geography 数据类型
SQL Server 表中的每个变量、参数和列都被定义为具有特定的数据类型
。大家都知道一些常见的 SQL Server 数据类型,如int、char、float 等。
SQL Server 2008 引入了两个新的数据类型——**geometry(用于存储平面矢量空间数据)和 geography(用于存储大地测量矢量空间数据)**
Geometry
geometry 空间数据类型用于在统一的二维平面上表示信息,这与我们在学校用坐标纸做的那样非常相似。因此,我们可以用一对笛卡尔坐标 (x,y) 来表示任何点的**位置**。
然而,geometry 数据类型最适合存储**投影坐标 (x,y)**。在这种情况下,投影过程(还记得工程制图吗)已经将角度地理坐标映射到一个平面上,然后 geometry 数据类型的方法就可以应用于这个平面。
现在,你通常会从现有的图纸或地图开始,并根据这张底图定义你的空间数据。
Geography
地球不是平的,也不是球形的。是吗?
所以,这就是我们拥有 geography 数据类型的原因。geography 数据类型最重要的特性是它存储大地测量空间数据,这考虑到了地球的曲面。
例如,如果我们要在 geography 数据类型中定义一条连接地球表面两个点的线,这条线会弯曲以适应地球的表面。
使用地理坐标系统时,点的坐标用**纬度**(一个点距离赤道的南北距离)和**经度**(一个点距离本初子午线的东西距离)的角度来表示,这与 geometry 和 geography 数据类型有关。
相似之处和不同之处
相似之处
- 它们都可以使用一系列几何图形来表示空间信息——
点 (Points)
、线串 (LineStrings)
和多边形 (Polygons)
。 - 在 SQL Server 2008 内部,这两种数据类型都以相同的格式将空间数据存储为二进制数据
流
。 - 它们都实现了许多相同的标准空间方法(我稍后会告诉你)
区别
属性 | 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)
。(SRID
为0
。)
当我们执行它时,我们可以在 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)
这里的4326
是SRID
。
关注点
这一系列的文章还有很多内容。空间数据可以用于许多项目,通过集成 .NET 和 Google/Bing Maps 来精确显示您的数据。当你能够精确地定位你的位置、你的结构并可视化事物时,会带来很多乐趣。
历史
- 版本 1:第一部分
更多内容请访问我的博客 http://dexpression.wordpress.com