9

有没有一种简单的方法可以在 SqlGeometry 和 DbGeometry 之间进行转换?我正在使用一个流行的 sql 空间助手库,其中的所有函数都需要 SqlGeometry。但是,当我针对 ESRI ArcSDE 要素类使用实体框架时,Shape 字段将作为 DbGeometry 返回。我无法使用该 DbGeometry 类型调用任何我想调用的方法(例如 LocateAlongGeom)。也许有一种方法可以将其序列化为二进制或文本,然后将其作为 SqlGeometry 读回?

4

3 回答 3

12
//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);
于 2013-07-14T17:28:35.917 回答
3

管理多种空间类型的一种简单方法是通过扩展方法,如下所示:(使用来自@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();
于 2015-04-13T17:36:32.000 回答
0

实体框架不支持 CURVES (CIRCLE) -> 更改为行:

return DbGeometry.FromBinary(sqlGeometry.**STCurveToLine()**.STAsBinary().Buffer);
于 2022-01-09T13:35:06.480 回答