示例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); } }
输出结果: