SQL 2008空间数据啥玩意? SQL 2008空间数据啥玩意? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 --SQL 2008使用空间数据SQL SERVER 2008支持两种空间数据类型,geometry和geography.其中geometry数据类型支持平面或平面球数据,geography可用于存储GPS经度和纬度坐标等椭球体数据。geometry和geography数据类型基于geometry层次结构。----point类型在SQL SERVER的空间数据中,Point用于定义一个点。例如:declare @g geometryset @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.STXselect @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 geometryset @g=geometry::STGeomFromText('MultiPoint(3,4),(20 21),(1,2)',0)使用STGeometryN()方法可以获取MultiPoint类型数据中的一个点。例如@g.STGeometryN(1)表示@g中的第一个点.declare @g geometryset @g=geometry::STGeomFromText('MultiPoint(3,4),(20 21),(1,2)',0)declare @i intset @i=1print @g.tostring()whlie@i<4begin print @g.STGeometryN(@i).STX print @g.STGeometryN(@i).STY set @i=@i+1end/* MultiPoint(3,4),(20 21),(1,2) 3 4 20 21 1 2*/----LineString类型在SQL SERVER的空间数据中,LineString是一维对象,用于表示一系列点和连接这些点的线段。下面的语句声明一个包含3个点的LineString类型的geometry对象。declare @g geometryset @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)使用STNumPoints()方法可以返回构成实例的点数。declare @g geometryset @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)select @g.STNumPoints()/*3*/使用STPointN()方法可以获取LineString中指定的点。declare @g geometryset @g=geometry::STGeomFromText('LineString(3 4, 20 21,1 2)',4322)declare @i intset @i=1while @i<[email protected]()[email protected]()表示最后一个点begin select @g.STPointN(@i).ToString() set @i=@i+1end/* 3 4 20 21 1 2*/----MultiLineString类型在SQL SERVER的空间数据中,MultiLineString用于定义多个线段对象,即多个LineString.declare @g geometryset @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 intset @i=1whlie @i<[email protected]()begin select @g.STInteriorRingN(@i).tostring() set @i=@i+1end/*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 intset @i=1print @g.tostring()while @i<3begin print @g.STGeometryN(@i).tostring(); set @i=@i+1end/*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 intset @i=1print @g.Tostring()while @i<[email protected](@i).Tostring();set @i=@i+1end/*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)))*/=============================================================================================================--空间数据的一些操作1.在创建表时定义geometry类型的列例子:create table streets(streetid int identity(1,1),streetName nvarchar(20),streetGeo geometry);go2.向表中插入几何数据insert into streets values('street1',geometry::stgeomfromtext('LINESTRING(100 100,20 180, 180 180)',0))3.从表中获取几何数据--注意,直接读取无法看到真实的含义,可以在select 语句将该列的值读取到一个几何数据类型的变量,具体语句如下:declare @g geometryselect @g=streetgeo from streets where streetnam='street1'select @g.stastext()go4.获取geometry 实例中包含的点(1)获取geometry 实例中包含的点数使用STNumPoints()函数可以获得geometry实例中包含的点数。例如:declare @g geometryselect @g=streetgeo from streets where streetnam='street1'select @g.STNumPoints()go(2)获取geometry 实例中包含的点declare @g geometryselect @g=streetgeo from streets where streetnam='street1'select @g.STPointN(2).Tostring()go(3)获取起始点和终点declare @g geometryselect @g=streetgeo from streets where streetnam='street1'select @g.STStartPoint().ToString() as 起始点,@g.STEndPoint().ToString() as 终点go(4)获取多边形的中心点declare @g geometryset @g=geometry::STGeomFromText('POLYGON(0 0,0 2, 2 2,0 2, 0 0))',0);select @g.STCentroid().Tostring();5.获取geometry实例的维度信息(1)返回对象的维度使用STDimension()函数可以获取对象的维度信息。例如:declare @g geometry;set @g=geometry::STGeomFromText('POINT(3,4)',));select @g.STAsText(),@g.STDimension()go结果是:/*POINT(3,4),0*/(2)计算对象的长度使用STLength()函数可以计算一维或二维对象的长度。例如:declare @g geometryselect @g=streetgeo from streets where streetnam='street1'select @g.STLength()go(3)计算对象的面积使用STArea()函数可以计算二维对象的面积。例如:declare @g geometryset @g=geometr::STGeomFromText('POLYGON((0 0,2 0, 2 2,0 2,0 0))',0);select @g.STArea()6.检查是否为空在使用geometry实例之前,需要判断是否为空,可以使用STlsEmpty()函数实现此功能,当geometry实例为空时,则返回1,否则返回0declare @g geometry;set @g=geometry::STGeomFromText('POLYGON EMPTY',0);select @g STlsEmpty();set @g=geometry::STGeomFromText('POLYGON((0 0,2 0, 2 2,0 2,0 0))',0);select @g STlsEmpty();返回结果为1和07.判断geometry实例是否为简单满足下面条件的geometry实例子=被称为简单的geometry实例(1)实例中任何一个图形都不与自身相交,但其终点除外。(2)实例上任意两个图形可以在某个点相交,但两个边界上的点除外。当geometry 实例为简单实例时,返回1,否则返回0例如:declare @g geometry;set @g=geometry::STGeomFromText('LINESTRING(0 0,2 2,0 2,2 0)',0);select @g.STlsSimple();结果为1declare @g geometry;set @g=geometry::STGeomFromText('LINESTRING(0 0,0 2,2 2,2 0)',0);select @g.STlsSimple();结果为08.返回geometry实例的边界除Point和MultiPoint实例外,其他geometry实例都存在边界.使用STBoundary()函数可以返回geometry实例的边界下面是在LineString实例上应用STBoundary()函数的实例。declare @g geometry;set @g=geometry::STGeomFromText('LINESTRING(1 1,2 2,0 2,2 1)',0);select @g.STBoundary().Tostring();返回结果为Multipoint((2,1),(1,1)),即LineString实例的起点和终点.Polygon和MultiPolygon实例的边界值为Multipoint 实例。下面是Polygon应用STBoundary()函数的实例。declare @g geometry;set @g=geometry::STGeomFromText('POLYGON((0 0,0 3,3 3,3 0,0 0)(1 1,1 2, 2 1,1 1))',10);select @g.STBoundary().Tostring();返回结果为Multilinestring((1 1,1 2,2 1,1 1),(0 0 ,3 0 , 3 3, 0 3,0 0)),即Polygon的环。 sql 如何去掉0 请教一下怎么删除备份的逻辑设备 MS sqlserver2000数据库日志文件(*.LDF)增长过快的原因(好象以前的帖子中原因说的不是很清楚) 如何合并大部分字段内容相同,少许字段内容不同的记录? C/S模式DELPHI 7 和SQL Server 2000的连接应该怎样设置? 管道的另一端上无任何进程,连WINDOWS身份验证都登录不上 请教各位一个关于子查询的问题 没想出来的一条sql,忘大家赐教 在线等待:排序问题,请问此排序的SQL语句怎样写? 帮忙!这个触发器怎么写? 数据表窗体的数据修改问题 冰天雪地跪地求教
在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<[email protected]()[email protected]()表示最后一个点
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<[email protected]()
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<[email protected](@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)))
*/
=============================================================================================================--空间数据的一些操作1.在创建表时定义geometry类型的列
例子:
create table streets
(
streetid int identity(1,1),
streetName nvarchar(20),
streetGeo geometry
);
go2.向表中插入几何数据
insert into streets values('street1',geometry::stgeomfromtext('LINESTRING(100 100,20 180, 180 180)',0))3.从表中获取几何数据
--注意,直接读取无法看到真实的含义,可以在select 语句将该列的值读取到一个几何数据类型的变量,具体语句如下:
declare @g geometry
select @g=streetgeo from streets where streetnam='street1'
select @g.stastext()
go
4.获取geometry 实例中包含的点
(1)获取geometry 实例中包含的点数
使用STNumPoints()函数可以获得geometry实例中包含的点数。例如:
declare @g geometry
select @g=streetgeo from streets where streetnam='street1'
select @g.STNumPoints()
go(2)获取geometry 实例中包含的点
declare @g geometry
select @g=streetgeo from streets where streetnam='street1'
select @g.STPointN(2).Tostring()
go(3)获取起始点和终点
declare @g geometry
select @g=streetgeo from streets where streetnam='street1'
select @g.STStartPoint().ToString() as 起始点,@g.STEndPoint().ToString() as 终点
go(4)获取多边形的中心点
declare @g geometry
set @g=geometry::STGeomFromText('POLYGON(0 0,0 2, 2 2,0 2, 0 0))',0);
select @g.STCentroid().Tostring();5.获取geometry实例的维度信息
(1)返回对象的维度
使用STDimension()函数可以获取对象的维度信息。
例如:
declare @g geometry;
set @g=geometry::STGeomFromText('POINT(3,4)',));
select @g.STAsText(),@g.STDimension()
go
结果是:
/*
POINT(3,4),0
*/(2)计算对象的长度
使用STLength()函数可以计算一维或二维对象的长度。例如:
declare @g geometry
select @g=streetgeo from streets where streetnam='street1'
select @g.STLength()
go(3)计算对象的面积
使用STArea()函数可以计算二维对象的面积。例如:
declare @g geometry
set @g=geometr::STGeomFromText('POLYGON((0 0,2 0, 2 2,0 2,0 0))',0);
select @g.STArea()6.检查是否为空
在使用geometry实例之前,需要判断是否为空,可以使用STlsEmpty()函数实现此功能,当geometry实例为空时,则返回1,否则返回0
declare @g geometry;
set @g=geometry::STGeomFromText('POLYGON EMPTY',0);
select @g STlsEmpty();
set @g=geometry::STGeomFromText('POLYGON((0 0,2 0, 2 2,0 2,0 0))',0);
select @g STlsEmpty();
返回结果为1和07.判断geometry实例是否为简单
满足下面条件的geometry实例子=被称为简单的geometry实例
(1)实例中任何一个图形都不与自身相交,但其终点除外。
(2)实例上任意两个图形可以在某个点相交,但两个边界上的点除外。
当geometry 实例为简单实例时,返回1,否则返回0
例如:
declare @g geometry;
set @g=geometry::STGeomFromText('LINESTRING(0 0,2 2,0 2,2 0)',0);
select @g.STlsSimple();
结果为1
declare @g geometry;
set @g=geometry::STGeomFromText('LINESTRING(0 0,0 2,2 2,2 0)',0);
select @g.STlsSimple();
结果为08.返回geometry实例的边界
除Point和MultiPoint实例外,其他geometry实例都存在边界.使用STBoundary()函数可以返回geometry实例的边界
下面是在LineString实例上应用STBoundary()函数的实例。
declare @g geometry;
set @g=geometry::STGeomFromText('LINESTRING(1 1,2 2,0 2,2 1)',0);
select @g.STBoundary().Tostring();
返回结果为Multipoint((2,1),(1,1)),即LineString实例的起点和终点.
Polygon和MultiPolygon实例的边界值为Multipoint 实例。下面是Polygon应用STBoundary()函数的实例。
declare @g geometry;
set @g=geometry::STGeomFromText('POLYGON((0 0,0 3,3 3,3 0,0 0)(1 1,1 2, 2 1,1 1))',10);
select @g.STBoundary().Tostring();
返回结果为Multilinestring((1 1,1 2,2 1,1 1),(0 0 ,3 0 , 3 3, 0 3,0 0)),即Polygon的环。