在SqlGeometry和DbGeometry之间转换

本文关键字:之间 转换 DbGeometry SqlGeometry | 更新日期: 2023-09-27 18:04:28

是否有一种简单的方法在SqlGeometry和DbGeometry之间转换?我正在使用一个流行的sql空间助手库和所有的函数在那里期望SqlGeometry。但是当我对ESRI ArcSDE功能类使用实体框架时,Shape字段返回为DbGeometry。我不能调用任何方法,我想(如LocateAlongGeom)与DbGeometry类型。也许有一种方法可以将其序列化为二进制或文本,然后将其读取为SqlGeometry?

在SqlGeometry和DbGeometry之间转换

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