-------------我的一些笔记(六)(空间数据)(基于SQL 2008)---------

--小F-- 2010-01-27 01:17:43
加精
--SQL 2008使用空间数据

SQL SERVER 2008支持两种空间数据类型,geometry和geography.其中geometry数据类型支持平面或平面球数据,geography可用于存储GPS经度和纬度坐标等椭球体数据。

geometry和geography数据类型基于geometry层次结构。

----point类型
在SQL SERVER的空间数据中,Point用于定义一个点。例如:
declare @g geometry
set @g=geometry::STGeomFromText('POINT(3,4)',0)
在本例中,字符串POINT(3,4)用于表示一个点,其中X坐标为3,Y坐标为4。
使用下面的语句可以打印geometry变量@g的内容。
select @g.Tostring()
/*
point(3,4)
*/
geometry变量的STX属性表示其X坐标值,STY属性表示其Y坐标值。使用下面的语句可以打印@g的X和Y坐标值。
select @g.STX
select @g.STY

也可以使用geometry::STPointFromText()方法根据指定格式的字符串生成POINT类型的geometry变量
declare @g geometry;
set @g=geometry::STGeomFromText('POINT(3,4)',0);
select @g.STX;
select @g.STY;

----MultiPoint类型
在SQL SERVER的空间数据中,Point用于定义多个点。
declare @g geometry
set @g=geometry::STGeomFromText('MultiPoint(3,4),(20 21),(1,2)',0)
使用STGeometryN()方法可以获取MultiPoint类型数据中的一个点。例如@g.STGeometryN(1)
表示@g中的第一个点.
declare @g geometry
set @g=geometry::STGeomFromText('MultiPoint(3,4),(20 21),(1,2)',0)
declare @i int
set @i=1
print @g.tostring()
whlie@i<4
begin
print @g.STGeometryN(@i).STX
print @g.STGeometryN(@i).STY
set @i=@i+1
end
/*
MultiPoint(3,4),(20 21),(1,2)
3
4
20
21
1
2
*/

----LineString类型
在SQL SERVER的空间数据中,LineString是一维对象,用于表示一系列点和连接这些点的线段。
下面的语句声明一个包含3个点的LineString类型的geometry对象。
declare @g geometry
set @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)
使用STNumPoints()方法可以返回构成实例的点数。
declare @g geometry
set @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)
select @g.STNumPoints()
/*
3
*/
使用STPointN()方法可以获取LineString中指定的点。
declare @g geometry
set @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)
declare @i int
set @i=1
while @i<=@g.STNumPoints()--@g.STNumPoints()表示最后一个点
begin
select @g.STPointN(@i).ToString()
set @i=@i+1
end
/*
3 4
20 21
1 2
*/

----MultiLineString类型
在SQL SERVER的空间数据中,MultiLineString用于定义多个线段对象,即多个LineString.
declare @g geometry
set @g=geometry::STGeomFromText('MultiLineString((3 4,20 21),(21 22, 1 2))',13);

----Polygon类型
在SQL SERVER的空间数据中,Polygon是右一系列点和线段组成的二维图形(多边形).这些点和线段可以定义一个外部的边界环。也可以
在外部边界环的内部定义零个或者多个内部环。
declare @g geometry;
set @g=geometry::STPolyFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1, 1 2, 2 1, 1 1))',10);
Polygon对象的方法
1.STExteriorRing方法
使用STExteriorRing可以返回Polygon对象的外环。
declare @g geometry;
set @g=geometry::STPolyFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1, 1 2, 2 1, 1 1))',10);
select @g.STExteriorRing().tostring();
/*
LINESTRING(0 0, 0 3, 3 3, 3 0, 0 0)
*/

2.STNumterioring方法
使用STNumterioring方法可以获取Polygon对象中包含的内环的数量。
declare @g geometry;
set @g=geometry::STPolyFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1, 1 2, 2 1, 1 1))',10);
select @g.STExteriorRing().tostring();
/*
1
*/

3.STInteriorRingN方法
使用STInteriorRingN方法可以获取Polygon对象中包含的内环对象,即LineString对象。
declare @g geometry;
set @g=geometry::STPolyFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1, 1 2, 2 1, 1 1))',10);
select @g.STExteriorRing().tostring();
declare @i int
set @i=1
whlie @i<=@g.STNumterioring()
begin
select @g.STInteriorRingN(@i).tostring()
set @i=@i+1
end

/*
LINESTRING(1 1,1 2, 2 1,1 1)
*/

----MultiPolygon类型
在SQL SERVER的空间数据中,MultiPolygon用于定义多个多边形,即多个Polygon.
declare @g geometry;
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))))');
使用STGeometryN(1)表示@g中的第一个多边形。下面的代码可以输出MultiPolygon对象中所有多边形的字符串信息
declare @g geometry;
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))))');
declare @i int
set @i=1
print @g.tostring()
while @i<3
begin
print @g.STGeometryN(@i).tostring();
set @i=@i+1
end
/*
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))))
Polygon((0 0,0 3, 3 3,3 0,0 0),(1 1,1 2,2 1,1 1))
Polygon((9 9,9 10,10 9,9 9))
*/

----GeometryCollection类型
在SQL SERVER的空间数据中,GeometryCollection用于定义零个或者多个geometry或geography实例的集合。
比如:
declare @g geometry;
set @g=geometry::STPolyFromText('GeometryCollection(point(3 21),Polygon((0 0,0 3,3 3,3 0,0 0)))',1);
上面的例子中表示2个geometry实例,一个Point实例,一个Polygon实例。
使用STNumGeometyies()方法可以获取集合中包含的几何图形数量。
declare @g geometry;
set @g=geometry::STPolyFromText('GeometryCollection(point(3 21),Polygon((0 0,0 3,3 3,3 0,0 0)))',1);
select @g.STNumGeometyies()
/*
2
*/

使用STGeometryN()方法可以获取GeometryCollection类型数据中指定的几何图形实例。例如STGeometryN(1)表示@g中的第1个几何图形实例。
declare @g geometry;
set @g=geometry::STPolyFromText('GeometryCollection(point(3 21),Polygon((0 0,0 3,3 3,3 0,0 0)))',1);
declare @i int
set @i=1
print @g.Tostring()
while @i<=@g.STGeometryN(@i).Tostring();
set @i=@i+1
end
/*
GeometryCollection(point(3 21),Polygon((0 0,0 3,3 3,3 0,0 0)))
point(3 21)
Polygon((0 0,0 3,3 3,3 0,0 0)))
*/
...全文
1520 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
chnsxiu 2010-09-16
  • 打赏
  • 举报
回复
今天刚发现2008有这东西
wangtao1912 2010-06-23
  • 打赏
  • 举报
回复
好,一直想找空间数据的操作的,真是帮了大忙,不过我的出现了错误
在执行用户定义例程或聚合 "geometry" 期间出现 .NET Framework 错误:
System.FormatException: 24141: 输入的位置 9 处应为数字,但实际为 ,2。
System.FormatException:
在 Microsoft.SqlServer.Types.OpenGisWktReader.RecognizeDouble()
在 Microsoft.SqlServer.Types.OpenGisWktReader.ParsePointText(Boolean parseParentheses)
在 Microsoft.SqlServer.Types.OpenGisWktReader.ParseTaggedText(OpenGisType type)
在 Microsoft.SqlServer.Types.OpenGisWktReader.Read(OpenGisType type, Int32 srid)
在 Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid)
在 Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)
Joetao 2010-03-30
  • 打赏
  • 举报
回复
这几天正好要弄空间数据库这块,正好用得着,收藏了。
moyifeng 2010-02-05
  • 打赏
  • 举报
回复

declare @g geometry
set @g=geometry::STGeomFromText('POINT(3,4)',0)

拷贝你的代码在2008上执行报错:
消息 6522,级别 16,状态 1,第 2 行
在执行用户定义例程或聚合 "geometry" 期间出现 .NET Framework 错误:
System.FormatException: 24141: 输入的位置 9 处应为数字,但实际为 ,4。
System.FormatException:
在 Microsoft.SqlServer.Types.OpenGisWktReader.RecognizeDouble()
在 Microsoft.SqlServer.Types.OpenGisWktReader.ParsePointText(Boolean parseParentheses)
在 Microsoft.SqlServer.Types.OpenGisWktReader.ParseTaggedText(OpenGisType type)
在 Microsoft.SqlServer.Types.OpenGisWktReader.Read(OpenGisType type, Int32 srid)
在 Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid)
在 Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)


帮忙分析下?
cgq815 2010-02-01
  • 打赏
  • 举报
回复
这里真是高手如云!
egg_1 2010-02-01
  • 打赏
  • 举报
回复
lz有心人,rp++
a87801912 2010-02-01
  • 打赏
  • 举报
回复
兰州好人。学习了
wangyu198300 2010-01-31
  • 打赏
  • 举报
回复
等有时间我一定来跟你好好学一学
bq26620378 2010-01-31
  • 打赏
  • 举报
回复
SQL SERVER的空间数据中,LineString是一维对象,用于表示一系列点和连接这些点的线段。
下面的语句声明一个包含3个点的LineString类型的geometry对象。
declare @g geometry
set @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)
使用STNumPoints()方法可以返回构成实例的点数。
declare @g geometry
csdn_风中雪狼 2010-01-30
  • 打赏
  • 举报
回复
lzh3ng 2010-01-30
  • 打赏
  • 举报
回复
没看懂
wmq6541 2010-01-30
  • 打赏
  • 举报
回复
学习
qinqin04 2010-01-30
  • 打赏
  • 举报
回复
蹲下慢慢看!
ifrancis 2010-01-30
  • 打赏
  • 举报
回复
数据库 命根子啊
麦田守望者 2010-01-30
  • 打赏
  • 举报
回复
学习了
Greentea107 2010-01-30
  • 打赏
  • 举报
回复
纯学习
yangfengwhatever 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 fredrickhu 的回复:]
上次不是有个兄弟问这两个类型吗?
[/Quote]
....
dahuk 2010-01-30
  • 打赏
  • 举报
回复
很牛,学习下
zrj525525 2010-01-29
  • 打赏
  • 举报
回复
深奥。。。
clairedanes 2010-01-29
  • 打赏
  • 举报
回复
up
加载更多回复(44)

6,129

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧