在SqlGeometry和DbGeometry之间转换
本文关键字:之间 转换 DbGeometry SqlGeometry | 更新日期: 2023-09-27 18:04:28
是否有一种简单的方法在SqlGeometry和DbGeometry之间转换?我正在使用一个流行的sql空间助手库和所有的函数在那里期望SqlGeometry。但是当我对ESRI ArcSDE功能类使用实体框架时,Shape字段返回为DbGeometry。我不能调用任何方法,我想(如LocateAlongGeom)与DbGeometry类型。也许有一种方法可以将其序列化为二进制或文本,然后将其读取为SqlGeometry?
//Convert from SqlGeometry to DbGeometry
SqlGeometry sqlGeo = ...
DbGeometry dbGeo = DbGeometry.FromBinary(sqlGeo.STAsBinary().Buffer);
//Convert from DBGeometry to SqlGeometry
SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB(new SqlBytes(dbGeo.AsBinary()), 0);
管理多个空间类型的简单方法是通过扩展方法,如下所示:(使用@BizarroDavid代码示例的稍微修改版本)
public static class GeometryExtensions
{
public static DbGeometry ToDbGeometry(this SqlGeometry sqlGeometry)
{
return DbGeometry.FromBinary(sqlGeometry.STAsBinary().Buffer);
}
public static SqlGeometry ToSqlGeometry(this DbGeometry dbGeometry)
{
return SqlGeometry.STGeomFromWKB(new SqlBytes(dbGeometry.AsBinary()), dbGeometry.CoordinateSystemId);
}
}
一旦你实现了它们,你可以像这样使用它们…
DbGeometry anyDbGeometry;
SqlGeometry anySqlGeometry;
//Convert to DbGeometry
anyDbGeometry = anySqlGeometry.ToDbGeometry();
//Convert to SqlGeometry
anySqlGeometry = anyDbGeometry.ToSqlGeometry();
实体框架不支持CURVES (CIRCLE) ->更改为lines:
return DbGeometry.FromBinary(sqlGeometry.**STCurveToLine()**.STAsBinary().Buffer);