2013-03-18 2 views
6

Есть ли простой способ преобразования между SqlGeometry и DbGeometry? Я использую популярную библиотеку пространственных помощников sql, и все функции там ожидают SqlGeometry. Но когда я использую Entity Framework для класса объектов ESRI ArcSDE, поле Shape возвращается как DbGeometry. Я не могу назвать любые методы, которые я хотел бы (например, LocateAlongGeom) с этим типом DbGeometry. Может быть, есть способ сериализовать его как двоичный или текст, а затем прочитать его в виде 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

+1

Да, я бы предположил, что вы захотите пройти в SRID в большинстве случаев. Для большинства GPS-координат вы должны использовать '4326' для WGS84. http://spatialreference.org/ref/epsg/4326/ – jocull

+0

Я считаю, что вы также можете обнаружить его динамически с помощью 'dbGeo.CoordinateSystemId' вместо нуля выше. – jocull

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