2013-03-18 25 views
6

是否有一種簡單的方法在SqlGeometry和DbGeometry之間進行轉換? 我正在使用流行的sql空間幫助程序庫以及其中的所有函數都期望使用SqlGeometry。但是,當我使用實體框架對ESRI ArcSDE要素類時,Shape字段作爲DbGeometry返回。 我不能使用該DbGeometry類型調用任何我想要的方法(例如LocateAlongGeom)。 也許有一種方法將其序列化爲二進制文本或文本,然後將其作爲SqlGeometry讀回來?SqlGeometry和DbGeometry之間的轉換

回答

9
//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); 
+2

不應該'DbGeometry'到'SqlGeometry'轉換爲...'SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB(新SqlBytes(dbGeo.AsBinary()),dbGeo。 CoordinateSystemId); ' 要考慮不在SRID-0中的幾何? – Xharlie 2014-10-15 09:57:46

+1

是的,我假設你想在大多數情況下通過SRID。對於大多數GPS座標,您可以使用'4326'作爲WGS84。 http://spatialreference.org/ref/epsg/4326/ – jocull 2015-04-13 15:17:44

+0

我相信你也可以用'dbGeo.CoordinateSystemId'代替上面的零動態檢測它。 – jocull 2015-04-13 15:40:49

1

一個簡單的方法來管理多個空間類型是通過擴展方法,像這樣:(使用@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();