Is there a simple way to convert between SqlGeometry and DbGeometry? I'm using a popular sql spatial helper library and all of the functions in there expect SqlGeometry. But when i use Entity Framework against an ESRI ArcSDE feature class the Shape field is returned as a DbGeometry. I can't call any of the methods I would like to (such as LocateAlongGeom) with that DbGeometry type. Maybe there is a way to serialize it as binary or text then read it back in as a SqlGeometry?
Convert between SqlGeometry and DbGeometry
Asked Answered
//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);
Yes, I would assume you'd want to pass in the SRID in most cases. For most GPS coordinates you'd use
4326
for WGS84. spatialreference.org/ref/epsg/4326 –
Unbidden I believe you can also detect it dynamically using
dbGeo.CoordinateSystemId
in place of the zero above. –
Unbidden An easy way to manage multiple spatial types is via extension methods, like so: (using slightly modified versions of the code samples from @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);
}
}
Once you have them implemented, you can use them like so...
DbGeometry anyDbGeometry;
SqlGeometry anySqlGeometry;
//Convert to DbGeometry
anyDbGeometry = anySqlGeometry.ToDbGeometry();
//Convert to SqlGeometry
anySqlGeometry = anyDbGeometry.ToSqlGeometry();
Entity Framework doesn't support CURVES (CIRCLE) -> change to lines:
return DbGeometry.FromBinary(sqlGeometry.**STCurveToLine()**.STAsBinary().Buffer);
© 2022 - 2024 — McMap. All rights reserved.
DbGeometry
toSqlGeometry
conversion be...SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB(new SqlBytes(dbGeo.AsBinary()), dbGeo.CoordinateSystemId);
To account for geometries that aren't in SRID-0? – Scintillate