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
6
A
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);
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();
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
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
Credo che si possa anche rilevarlo dinamicamente usando 'dbGeo.CoordinateSystemId' al posto dello zero sopra. – jocull