2013-03-18 11 views
6

Esiste un modo semplice per convertire tra SqlGeometry e DbGeometry? Sto usando una libreria di helper spaziale sql e tutte le funzioni in là prevedono SqlGeometry. Ma quando uso Entity Framework contro una feature class ESRI ArcSDE il campo Shape viene restituito come DbGeometry. Non riesco a chiamare nessuno dei metodi che desidero (come LocateAlongGeom) con quel tipo DbGeometry. Forse c'è un modo per serializzarlo come binario o testo e poi leggerlo come SqlGeometry?Conversione tra SqlGeometry e DbGeometry

risposta

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

non dovrebbe il DbGeometry' a '' conversione SqlGeometry' essere ... 'SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB (nuove SqlBytes (dbGeo.AsBinary()), dbGeo. CoordinateSystemId); ' Per tenere conto delle geometrie che non sono in SRID-0? – Xharlie

+1

Sì, suppongo che tu voglia passare il SRID nella maggior parte dei casi. Per la maggior parte delle coordinate GPS si usa '4326' per WGS84. http://spatialreference.org/ref/epsg/4326/ – jocull

+0

Credo che si possa anche rilevarlo dinamicamente usando 'dbGeo.CoordinateSystemId' al posto dello zero sopra. – jocull

1

Un modo semplice per gestire più tipi spaziali è via metodi di estensione, in questo modo: (utilizzando versioni leggermente modificate dei campioni di codice da @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); 
    } 
} 

Una volta li implementato, è li possono utilizzare in questo modo ...

DbGeometry anyDbGeometry; 
SqlGeometry anySqlGeometry; 

//Convert to DbGeometry 
anyDbGeometry = anySqlGeometry.ToDbGeometry(); 

//Convert to SqlGeometry 
anySqlGeometry = anyDbGeometry.ToSqlGeometry(); 
Problemi correlati