sqlGeometry 类型为sql server 2008之后的版本 新加的一种CLR扩展数据类型,为广大sql server开发人员存储几何类型及空间运算提供极大的便利,下面说明geometry类型的具体操作

示例SQL语句代码

  1. IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL
  2. DROP TABLE dbo.SpatialTable;
  3. GO
  4.  
  5. CREATE TABLE SpatialTable
  6. ( id int IDENTITY (1,1),
  7. GeomCol1 geometry,
  8. GeomCol2 AS GeomCol1.STAsText() );
  9. GO
  10.  
  11. INSERT INTO SpatialTable (GeomCol1)
  12. VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
  13.  
  14. INSERT INTO SpatialTable (GeomCol1)
  15. VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
  16. GO
  17.  
  18. INSERT INTO SpatialTable (GeomCol1)
  19. VALUES(geometry::STGeomFromText('LINESTRING (116.387112 39.920977,116.385243 39.913063,116.394226 39.917988,116.401772 39.921364,116.41248 39.927893,116.387112 39.920977)', 4326))

  

几何类型操作

  1. Database db = DatabaseFactory.CreateDatabase();
  2. DbCommand dbCmd = db.GetSqlStringCommand("SELECT GeomCol1 FROM SpatialTable WHERE id=4");
  3. using (IDataReader reader = db.ExecuteReader(dbCmd))
  4. {
  5. if (reader.Read())
  6. {
  7. SqlGeometry o = reader[] as SqlGeometry;
  8.  
  9. }
  10. }
  11.  
  12. SqlGeometry geo = SqlGeometry.Parse("POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))");
  13. //DataSet ds = db.ExecuteDataSet(dbCmd);
  14.  
  15. //SqlGeometry geo = ds.Tables[0].Rows[0][1] as SqlGeometry;
  16.  
  17. //SqlDouble area = geo.STArea();
  18.  
  19. dbCmd = db.GetSqlStringCommand(@"INSERT INTO SpatialTable (GeomCol1) values(@p)");
  20.  
  21. //构建多边形
  22. SqlGeometryBuilder sb = new SqlGeometryBuilder();
  23. sb.SetSrid();
  24. sb.BeginGeometry(OpenGisGeometryType.Polygon);
  25. sb.BeginFigure(, );
  26. sb.AddLine(, );
  27. sb.AddLine(, );
  28. sb.AddLine(, );
  29. sb.AddLine(, );
  30. sb.EndFigure();
  31. sb.EndGeometry();
  32.  
  33. dbCmd = db.GetSqlStringCommand(string.Format("INSERT INTO SpatialTable (GeomCol1) values(geometry::STGeomFromText('{0}', {1}))"
  34. , sb.ConstructedGeometry.ToString(), ));
  35. //db.AddInParameter(dbCmd, "@p", DbType.Binary, sb.ConstructedGeometry.STAsBinary().Buffer);
  36.  
  37. int cnt = db.ExecuteNonQuery(dbCmd);

  

数据库对数据进行过滤操作

  1. SELECT c_geomCol.MakeValid().STCentroid().STAsText() FROM t_green_point
  2. WHERE c_geomCol IS NOT NULL
  3. --AND c_geomCol2<>'POLYGON EMPTY'
  4. AND c_geomCol.STIsValid()=1

通过这个sql获得系统的坐标系(Sql server中):Select * from sys.spatial_reference_systems

//MultiPolygon 多个多边形结合处理

  1. SqlGeometryBuilder sb = new SqlGeometryBuilder(); //构造多个多边形实例
  2. sb.SetSrid();
  3. sb.BeginGeometry(OpenGisGeometryType.MultiPolygon);
  4.  
  5. sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第一个多边形
  6. sb.BeginFigure(, );
  7. sb.AddLine(, -);
  8. sb.AddLine(-,-);
  9. sb.AddLine(-,);
  10. sb.AddLine(,);
  11. sb.EndFigure();
  12. sb.EndGeometry();
  13.  
  14. sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第二个多边形
  15. sb.BeginFigure(,);
  16. sb.AddLine(,);
  17. sb.AddLine(,);
  18. sb.AddLine(,);
  19. sb.AddLine(,);
  20. sb.EndFigure();
  21. sb.EndGeometry();
  22.  
  23. sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第N个多边形
  24. sb.BeginFigure(,);
  25. sb.AddLine(,);
  26. sb.AddLine(,);
  27. sb.AddLine(,);
  28. sb.AddLine(,);
  29. sb.EndFigure();
  30. sb.EndGeometry();
  31.  
  32. sb.EndGeometry();
  33.  
  34. geo = sb.ConstructedGeometry;
  35.  
  36. //下面是解析代码
  37. int numGeometries = geo.STNumGeometries().Value; //有多少个多边形
  38.  
  39. SqlGeometry geoN = null;
  40.  
  41. for (int i = ; i <= numGeometries; i++)
  42. {
  43. geoN = geo.STGeometryN(i);//第几个多边形
  44. for (int j = ; j <= geoN.STNumPoints(); j++) //转到百度地图多边形最后一个点可以去掉
  45. {
  46. point = geoN.STPointN(i);
  47. Console.WriteLine("第{0}个多边形,第{1}点,X={2},Y={3}", i, j, point.STX.Value, point.STY);
  48. }
  49.  
  50. }

  

输出结果:

参数化的SQL语句传值

  1. DbCommand dbCmd = db.GetSqlStringCommand(@"INSERT INTO SpatialTable (GeomCol1) values(@p)");
  2.  
  3. db.AddInParameter(dbCmd, "@p", DbType.Binary, sb.ConstructedGeometry.Serialize());
  4.  
  5. int cnt = db.ExecuteNonQuery(dbCmd);

  

判断多边形是否相交

  1. DECLARE @bigGeo geometry= 'POLYGON((0 0, 3 0, 3 3, 0 3,0 0))';
  2. DECLARE @smallGeo geometry='POLYGON((1 1 ,2 1,2 2,1 2,1 1))';
  3. DECLARE @midGeo geometry='POLYGON((0 0, 1.5 0, 1.5 1.5, 0 1.5,0 0))';
  4. DECLARE @Geo3 geometry='POLYGON((2 2, 3 2,3 3,2 3,2 2))';
  5.  
  6. SELECT @bigGeo.STIntersection(@smallGeo).STAsText()
  7.  
  8. SELECT @midGeo.STIntersection(@smallGeo).STIsEmpty()
  9.  
  10. SELECT @midGeo.STIntersection(@Geo3).STIsEmpty()
  11.  
  12. 如果相交则结果不为空

参考资料:

 
       

空间数据类型相关Transact-SQL

sql server Geometry 类型操作 笔记的更多相关文章

  1. SQL Server锁类型

    SQL Server锁类型(SQL)收藏 1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁. 2. NOLOCK:不添加共享锁和排它锁,当这个选项生 ...

  2. Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表)

    Sql Server 函数的操作实例!(执行多条语句,返回Select查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ==== ...

  3. Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表)

    Sql Server 函数的操作实例!(返回一条Select语句查询后的临时表) SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE FUN ...

  4. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  5. SQL SERVER: 合并相关操作(Union,Except,Intersect)

    SQL SERVER: 合并相关操作(Union,Except,Intersect) use tempdb create table tempTable1 (id int primary key id ...

  6. MS SQL server对象类型type

    执行下面代码,将获取ms sql server对象类型以及其说明 IF OBJECT_ID('tempdb.dbo.#type') IS NOT NULL DROP TABLE #type CREAT ...

  7. SQL Server时间类型datetime

    SQL Server时间类型datetime 兼容ADO的COleDateTime. SQL datetime 日期和时间数据,可表示1753.1.1 至 9999.12.31的时间,精度为1/300 ...

  8. SQL Server 多库操作 库名.dbo.表名 出错的问题!

    SQL Server 多库操作 库名.dbo.表名 出错的问题! 数据库名不要用数字开头. 例如:343934.dbo.user 这就会出错.md a343934.dbo.user 就没问题!! 记住 ...

  9. SQL Server 方言类型映射问题

    关于SQL Server的类型映射问题,例如,nvarchar无法进行hibernate类型映射,需要通过convert进行类型转换方可进行获取

随机推荐

  1. OpenJudge计算概论-排队游戏【这个用到了栈的思想】

    /*======================================================================== 排队游戏 总时间限制: 1000ms 内存限制: ...

  2. nginx https http 共用

    openssl genrsa -des3 -out banmaxiaozhen.com.key 1024 openssl req -new -key banmaxiaozhen.com.key -ou ...

  3. html之ul标签

    html之无序列表,建议使用样式来定义列表的类型. 通常和li配对使用 可选属性: type:disc 圆点,circle圆圈,square方块 compact:显示效果比正常更小巧 <body ...

  4. HTTP接口功能自动化测试入门

    无论是浏览器上运行的Web应用还是移动端的H5应用,都离不开HTTP接口.Web应用通常是分为前后台开发的,后台提供接口调用返回Json对象,前台使用JS框架去加载后台返回的Json.而H5页面动态获 ...

  5. RMAN备份与恢复之不完全恢复

    要点:对于RMAN的不完全恢复,有如下步骤: 1)加载数据到mount状态(建议恢复前先做备份) 2)为高并发分配多个通道 3)还原所有(所需)的数据文件 4)使用until time,until s ...

  6. smarty函数-继承extents

    继承<{extends}> {extends}标签用在模版中的第一行: 如果子模板用{extends}标签继承父模板,那么它只能包含{block}标签(内容),其它任何模板内容都将忽略: ...

  7. ef 高级操作

    一:动态拼接条件查询 var expression = PredicateBuilder.True<OQC_MES_INF_UL_QMS_OFFLINE>(); SYS_ROLES_CON ...

  8. UI-导航控制器的使用

    1.初始化导航栏控制器 2..设置导航栏的标题 3.跳到下一个页面 4.返回上一个页面 5.自定义返回页面 6.导航栏上的自定义返回按钮 7.两个导航栏显示隐藏的常用方法(当前页不显示)

  9. 重绘Winform窗体

    本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...

  10. 一个问题提交的实例(js原生动画,原生ajax,js引用加参数)

    document.writeln("<div id=\"tanchuangwai\" class=\"tanchuangwai\" style= ...