日期:2014-05-18  浏览次数:20520 次

关于geometry类型,求教高手
我的数据库表中的一列类型是geometry的,用来存一条线。把数据读出来以后toString的结果是“LINESTRING (0.8157141 47.4624569, 0.8160616 47.4620566, 0.81627420000000006 47.4618914, 0.8165576 47.4617301, 0.8190376 47.4603279)”。我想找到这条线的起点和终点坐标,就是把string中的“0.8157141 47.4624569”这个点和“ 0.8190376 47.4603279”这个点给提取出来。因为数据库中存了很多线,长度是不定的,因此用string操作感觉很费劲。请问懂geometry类型的高手,C#里有没有什么数据类型是对应到SQL2008里的geometry的?比如我定义一个什么类型来存储这条线,然后读一下他的firstpoint和lastpoint属性就能把起点和终点提取出来,有没有像这样比较直接的方法?
请前辈们赐教 拜谢~~

------解决方案--------------------
有,你得安装Sql2008的扩展类型包才行,可以去M$免费下载

Microsoft.SqlServer.Types.dll 。是sql2008的扩展安装包。

顺便问下,楼主啥公司?在开发新的GIS软件吗
------解决方案--------------------
SQL code
--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