Подтвердить что ты не робот

Sql география для dbgeography?

Может, я что-то упустил. У меня есть столбец sql-сервера типа данных "География".

Я хочу использовать тип DbGeography в моем коде С#. Любой способ сделать или преобразовать из sql географии в dbgeography?

4b9b3361

Ответ 1

Извините за поздний ответ - но увидел это во время поиска чего-то еще.

Просто выполните следующее:

SqlGeography theGeography;
int srid = 4326; // or alternative

DbGeography newGeography = DbGeography.FromText(theGeography.ToString(), srid);

Отменить его:

DbGeography theGeography;
SqlGeography newGeography = SqlGeography.Parse(theGeography.AsText()).MakeValid();

Надеюсь, что это поможет!

Ответ 2

Когда производительность играет важную роль, вместо известного текста следует использовать хорошо известный двоичный код:

var newGeography = DbGeography.FromBinary(theGeography.STAsBinary().Value);

Существует перегрузка с использованием SRID, если это важно. В моем простом испытании с 1000 достаточно сложными полигонами двоичный подход в 4 раза быстрее, чем текстовый:

* Binary-based conversion
Run 1: 1948
Run 2: 1944
Run 3: 1959
Run 4: 1979
Run 5: 1988
Average: 1963.6

* Text-based conversion
Run 1: 8527
Run 2: 8553
Run 3: 8596
Run 4: 8535
Run 5: 8496
Average: 8541.4

Ответ 3

Вы должны добавить ссылку на сборки, как указано выше. Следующая публикация может помочь вам , link2

Ответ 4

Основываясь на моем чтении EntityFramework.SqlServer.dll в ILSpy, я считаю, что самый быстрый способ конвертировать из SqlGeography в DbGeography:

var dbGeo = System.Data.Entity.SqlServer.SqlSpatialServices.Default.GeographyFromProviderValue(sqlGeo);

Этот метод имеет то преимущество, что не требуется двоичное преобразование и разбор. Он просто возвращает DbGeography, используя SqlGeography в качестве внутреннего значения поставщика.

Ответ 5

Предоставленное решение выглядит нормально, если вы не используете EF6. С ранними версиями в порядке, но с EF6 мы не должны ссылаться на эту сборку. Это превращает EF в сумасшедший.

Ответ 6

Я нашел это в качестве рабочего решения:

int coordSys = DbGeography.DefaultCoordinateSystemId; // 4326; 
SqlGeography g = SqlGeography.Point(lat, lon, coordSys);
return DbSpatialServices.Default.GeographyFromProviderValue(g);

Нет сериализации/преобразования в строку (WKT) или двоичную (WKB), которые убивают производительность.

Он работает для меня на EF 6.1.3, SqlServer 2016 SP1 и Microsoft.SqlServer.Types.14.0.314.76