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

示例SQL语句代码

IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL
DROP TABLE dbo.SpatialTable;
GO CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeomCol1 geometry,
GeomCol2 AS GeomCol1.STAsText() );
GO INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0)); INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
GO INSERT INTO SpatialTable (GeomCol1)
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))

  

几何类型操作

 Database db = DatabaseFactory.CreateDatabase();
DbCommand dbCmd = db.GetSqlStringCommand("SELECT GeomCol1 FROM SpatialTable WHERE id=4");
using (IDataReader reader = db.ExecuteReader(dbCmd))
{
if (reader.Read())
{
SqlGeometry o = reader[] as SqlGeometry; }
} SqlGeometry geo = SqlGeometry.Parse("POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))");
//DataSet ds = db.ExecuteDataSet(dbCmd); //SqlGeometry geo = ds.Tables[0].Rows[0][1] as SqlGeometry; //SqlDouble area = geo.STArea(); dbCmd = db.GetSqlStringCommand(@"INSERT INTO SpatialTable (GeomCol1) values(@p)"); //构建多边形
SqlGeometryBuilder sb = new SqlGeometryBuilder();
sb.SetSrid();
sb.BeginGeometry(OpenGisGeometryType.Polygon);
sb.BeginFigure(, );
sb.AddLine(, );
sb.AddLine(, );
sb.AddLine(, );
sb.AddLine(, );
sb.EndFigure();
sb.EndGeometry(); dbCmd = db.GetSqlStringCommand(string.Format("INSERT INTO SpatialTable (GeomCol1) values(geometry::STGeomFromText('{0}', {1}))"
, sb.ConstructedGeometry.ToString(), ));
//db.AddInParameter(dbCmd, "@p", DbType.Binary, sb.ConstructedGeometry.STAsBinary().Buffer); int cnt = db.ExecuteNonQuery(dbCmd);

  

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

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

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

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

 SqlGeometryBuilder sb = new SqlGeometryBuilder(); //构造多个多边形实例
sb.SetSrid();
sb.BeginGeometry(OpenGisGeometryType.MultiPolygon); sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第一个多边形
sb.BeginFigure(, );
sb.AddLine(, -);
sb.AddLine(-,-);
sb.AddLine(-,);
sb.AddLine(,);
sb.EndFigure();
sb.EndGeometry(); sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第二个多边形
sb.BeginFigure(,);
sb.AddLine(,);
sb.AddLine(,);
sb.AddLine(,);
sb.AddLine(,);
sb.EndFigure();
sb.EndGeometry(); sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第N个多边形
sb.BeginFigure(,);
sb.AddLine(,);
sb.AddLine(,);
sb.AddLine(,);
sb.AddLine(,);
sb.EndFigure();
sb.EndGeometry(); sb.EndGeometry(); geo = sb.ConstructedGeometry; //下面是解析代码
int numGeometries = geo.STNumGeometries().Value; //有多少个多边形 SqlGeometry geoN = null; for (int i = ; i <= numGeometries; i++)
{
geoN = geo.STGeometryN(i);//第几个多边形
for (int j = ; j <= geoN.STNumPoints(); j++) //转到百度地图多边形最后一个点可以去掉
{
point = geoN.STPointN(i);
Console.WriteLine("第{0}个多边形,第{1}点,X={2},Y={3}", i, j, point.STX.Value, point.STY);
} }

  

输出结果:

参数化的SQL语句传值

   DbCommand dbCmd = db.GetSqlStringCommand(@"INSERT INTO SpatialTable (GeomCol1) values(@p)");

  db.AddInParameter(dbCmd, "@p", DbType.Binary, sb.ConstructedGeometry.Serialize());

  int cnt = db.ExecuteNonQuery(dbCmd);

  

判断多边形是否相交

DECLARE @bigGeo geometry= 'POLYGON((0 0, 3 0, 3 3, 0 3,0 0))';
DECLARE @smallGeo geometry='POLYGON((1 1 ,2 1,2 2,1 2,1 1))';
DECLARE @midGeo geometry='POLYGON((0 0, 1.5 0, 1.5 1.5, 0 1.5,0 0))';
DECLARE @Geo3 geometry='POLYGON((2 2, 3 2,3 3,2 3,2 2))'; SELECT @bigGeo.STIntersection(@smallGeo).STAsText() SELECT @midGeo.STIntersection(@smallGeo).STIsEmpty() SELECT @midGeo.STIntersection(@Geo3).STIsEmpty() 如果相交则结果不为空

参考资料:

 
       

空间数据类型相关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. 解决JQuery中datatables设置隐藏显示列多次提交后台刷新数据的问题

    此次项目开发过程中用到了Jquery的Datatables插件,无疑他是数据列表展示,解决MVC中同步过程中先走控制器后返回视图,查询数据过程中无法提示等待的弊端, 而且他所提供的各种方法也都有较强的 ...

  2. replace() replace_copy()

    int a[] = {1,2,3,3,4}; vector<int> v(a, a+5); vector<int> v2; //replace(v.begin(), v.end ...

  3. EmEditor处理大文本文件

    前段时间新闻网由于用户不当操作.导致三年的报纸栏目内容全部清空.紧急情况下只能求助于SQL数据恢复.但备份的数据文件有500M左右. 首先用的文本编辑器是Notepad++,打开之后软件几乎完全卡死. ...

  4. ibats注意

    <isNotEqual property="id" compareValue="0" prepend="and">id=#id# ...

  5. Oracle备份与恢复之exp/imp

    获取帮助 exp help=y/imp help=y 工作方式 交互式 exp 命令行 exp user/pwd@dbname file=/oracle/test.dmp full=y 参数文件方式 ...

  6. 【设计模式】工厂方法模式(Factory Method)

    工厂方法模式 定义了一个创建对象的接口,但由子类决定要实现的类是哪一个.工厂方法让类把实例化推迟到子类.所有的工厂模式都用来封装对象的创建.工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创 ...

  7. bzoj2618: [Cqoi2006]凸多边形

    Description 逆时针给出n个凸多边形的顶点坐标,求它们交的面积.例如n=2时,两个凸多边形如下图: 则相交部分的面积为5.233. Input 第一行有一个整数n,表示凸多边形的个数,以下依 ...

  8. android学习笔记48——SQLite

    SQLite SQLite试试一个嵌入式的数据库引擎,专门用于资源有限的设备(如手机.PDA)上适量数据存取. SQLite支持绝大部分SQL92语法,同样允许开发者使用SQL语句操作数据库中的数据, ...

  9. PHP注释有意思的排列

    <?php // // _ooOoo_ // o8888888o // 88" . "88 // (| -_- |) // O\ = /O // ____/`---'\___ ...

  10. MVC 介绍

    1>.NUGET,发布软件,管理平台: 2>.Razor,mvc视图引擎,集中生成HTML代码模板@开始,有自己的格式,语法,如同web forms视图引擎web forms view e ...