在SqlGeometry和DbGeometry之间转换

时间:2013-03-18 20:09:05

标签: c# geospatial sqlgeometry

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

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

管理多种空间类型的简单方法是通过扩展方法,如下所示:(使用来自@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();