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[0] 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(4326);

sb.BeginGeometry(OpenGisGeometryType.Polygon);

sb.BeginFigure(0, 0);

sb.AddLine(150, 0);

sb.AddLine(150, 150);

sb.AddLine(0, 150);

sb.AddLine(0, 0);

sb.EndFigure();

sb.EndGeometry();



dbCmd = db.GetSqlStringCommand(string.Format("INSERT INTO SpatialTable (GeomCol1) values(geometry::STGeomFromText('{0}', {1}))"

, sb.ConstructedGeometry.ToString(), 4326));

//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(0);

sb.BeginGeometry(OpenGisGeometryType.MultiPolygon);



sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第一个多边形

sb.BeginFigure(1, 1);

sb.AddLine(1, -1);

sb.AddLine(-1,-1);

sb.AddLine(-1,1);

sb.AddLine(1,1);

sb.EndFigure();

sb.EndGeometry();



sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第二个多边形

sb.BeginFigure(1,1);

sb.AddLine(3,1);

sb.AddLine(3,3);

sb.AddLine(1,3);

sb.AddLine(1,1);

sb.EndFigure();

sb.EndGeometry();



sb.BeginGeometry(OpenGisGeometryType.Polygon); //构造第N个多边形

sb.BeginFigure(4,4);

sb.AddLine(6,4);

sb.AddLine(6,6);

sb.AddLine(4,6);

sb.AddLine(4,4);

sb.EndFigure();

sb.EndGeometry();



sb.EndGeometry();



geo = sb.ConstructedGeometry;



//下面是解析代码

int numGeometries = geo.STNumGeometries().Value; //有多少个多边形



SqlGeometry geoN = null;



for (int i = 1; i <= numGeometries; i++)

{

geoN = geo.STGeometryN(i);//第几个多边形

for (int j = 1; j <= geoN.STNumPoints(); j++) //转到百度地图多边形最后一个点可以去掉

{

point = geoN.STPointN(i);

Console.WriteLine("第{0}个多边形,第{1}点,X={2},Y={3}", i, j, point.STX.Value, point.STY);

}



}

  

 输出结果:

sql server Geometry 类型操作 笔记

你可能感兴趣的:(SQL Server)