Есть ли простой способ преобразования между SqlGeometry и DbGeometry? Я использую популярную библиотеку пространственных помощников sql, и все функции там ожидают SqlGeometry. Но когда я использую Entity Framework для класса объектов ESRI ArcSDE, поле Shape возвращается как DbGeometry. Я не могу назвать любые методы, которые я хотел бы (например, LocateAlongGeom) с этим типом DbGeometry. Может быть, есть способ сериализовать его как двоичный или текст, а затем прочитать его в виде SqlGeometry?Преобразование между SqlGeometry и DbGeometry
6
A
ответ
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
простой способ управлять несколькими типами пространственных осуществляется с помощью методов расширения, например, так: (с помощью слегка модифицированных версий примеров кода из @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();
не Если 'DbGeometry' в' SqlGeometry' преобразования будет ... 'SqlGeometry sqlGeo2 = SqlGeometry.STGeomFromWKB (новые SqlBytes (dbGeo.AsBinary()), dbGeo. CoordinateSystemId); ' Чтобы учесть геометрию, которая не находится в SRID-0? – Xharlie
Да, я бы предположил, что вы захотите пройти в SRID в большинстве случаев. Для большинства GPS-координат вы должны использовать '4326' для WGS84. http://spatialreference.org/ref/epsg/4326/ – jocull
Я считаю, что вы также можете обнаружить его динамически с помощью 'dbGeo.CoordinateSystemId' вместо нуля выше. – jocull