Gibt es eine einfache Möglichkeit, zwischen SqlGeometry und DbGeometry zu konvertieren? Ich benutze eine beliebte sql räumliche Helfer Bibliothek und alle Funktionen in dort erwarten SqlGeometry. Wenn ich Entity Framework jedoch für eine ESRI ArcSDE-Feature-Class verwende, wird das Shape-Feld als DbGeometry zurückgegeben. Ich kann keine der Methoden, die ich möchte (wie LocateAlongGeom) mit diesem DbGeometry-Typ aufrufen. Vielleicht gibt es eine Möglichkeit, es als Binär oder Text zu serialisieren und es dann wieder als SqlGeometry einzulesen?Konvertierung zwischen SqlGeometry und DbGeometry
6
A
Antwort
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
Eine einfache Möglichkeit ist über Erweiterungsmethoden, wie so mehrere räumliche Datentypen zu verwalten: Sie (mit leicht modifizierten Versionen der Codebeispiele von @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);
}
}
Sobald Sie sie umgesetzt haben, können sie wie so ...
DbGeometry anyDbGeometry;
SqlGeometry anySqlGeometry;
//Convert to DbGeometry
anyDbGeometry = anySqlGeometry.ToDbGeometry();
//Convert to SqlGeometry
anySqlGeometry = anyDbGeometry.ToSqlGeometry();
Sollte nicht die 'DbGeometry' zu' SqlGeometry' Konvertierung ... 'SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB (neu SqlBytes (dbGeo.AsBinary()), dbGeo. KoordinatensystemId); ' Um Geometrien zu berücksichtigen, die nicht in SRID-0 sind? – Xharlie
Ja, ich würde annehmen, dass Sie in den meisten Fällen die SRID übergeben möchten. Für die meisten GPS-Koordinaten würden Sie '4326' für WGS84 verwenden. http://spatialreference.org/ref/epsg/4326/ – jocull
Ich glaube, Sie können es auch dynamisch erkennen mit 'dbGeo.CoordinateSystemId' anstelle der Null oben. – jocull