Парсинг MSDN Geometry Data Type - PullRequest
       16

Парсинг MSDN Geometry Data Type

4 голосов
/ 11 августа 2010

У меня есть база данных, где одно поле дает пространственные координаты. Я узнал, что поле представляет собой сериализованный тип данных геометрии MSDN (http://msdn.microsoft.com/en-us/library/bb933973.aspx).

Я хочу получить доступ к этой базе данных из Python и бродил, если кто-нибудь знал формат типа данных Geometry или какие-либо библиотеки, способные анализировать его в набор гео-координат в Python.

В ссылке говорится, что Microsoft использовала стандарт Open Geospatial Consortium (OGC) при разработке этого типа данных. Означает ли это, что пространственные координаты определяются этим стандартом?

Кто-нибудь еще имеет опыт с этим?

Любая помощь будет высоко ценится!

Ответы [ 2 ]

3 голосов
/ 11 августа 2010

Как показано в комментариях ниже (спасибо MarkJ!):

  • геометрия является типом данных .NET, но использует свой собственный формат сериализации;Вы можете выбрать весь столбец и затем переопределить его, открыв Microsoft.SqlServer.Types.dll в Reflector и начав с
  • , или вы можете использовать поддержку SQL-сервера для этого типа, чтобы считывать свойства данных геометрии.из базы данных, например, select geocolumn.STX, geocolumn.STY from myTable;
  • или вы можете экспортировать все значение как GML , например, select geocolumn.AsGml() from myTable;, которое может обрабатываться библиотеками геометрии Python, такими как http://gispython.org/http://mapnik.org/ http://www.qgis.org/wiki/Python_Bindings

Первоначально я думал, что SQL Server хранит типы данных CLR в виде сериализованных объектов .NET непосредственно в таблице, но это оказалось неправильно.

1 голос
/ 09 декабря 2016

"… если кто-то знал формат геометрии [тип данных]…"

Здесь указан двоичный формат сериализации для пространственных типов GEOMETRY и GEOGRAPHY SQL Server:

[MS-SSCLRT]: форматы сериализации типов CLR Microsoft SQL Server

"Указывает двоичный формат структур GEOGRAPHY, GEOMETRY, HIERARCHYID и CLR пользовательского типа (UDT), которые управляются SQL Server."

Эта спецификация хорошо написана, и двоичный формат прост для понимания, поэтому не должно возникнуть особых проблем с реализацией базового синтаксического анализатора для двоичного формата.

"... или любые библиотеки, способные анализировать его в набор [географических координат] в Python ..."

Использование Microsoft.SqlServer.Types через .NET-взаимодействие для десериализации следующих типов:

Если вы не хотите реализовывать свой собственный десериализатор (который должен быть довольно простым), но вы можете найти способ взаимодействия со сборкой .NET из Python & mdash; возможно через pythonnet ? & mdash ;, тогда могут быть интересны следующие советы:

Два типа T-SQL GEOMETRY и GEOGRAPHY реализованы как комбинация сборки .NET (Microsoft.SqlServer.Types), которая выполняет де-сериализацию из / в двоичный формат, только что упомянутый выше, и неуправляемая DLL (SqlServerSpatial….dll), которая содержит почти все остальное (то есть процедуры для пространственных операций).

Если вас интересует только десериализация пространственных данных SQL Server, и вы стараетесь не вызывать какие-либо пространственные функции на SqlGeometry или SqlGeography, то вы можете использовать Microsoft.SqlServer.Types для -сериализуйте пространственные двоичные данные для вас, затем , проверяя их с помощью реализации IGeometrySink110, которую вы должны предоставить, например, SqlGeometry.Populate метод .

Microsoft.SqlServer.Types и SqlServerSpatial….dll доступны либо в виде .NET для всего проекта NuGet , либо в виде общесистемного установочного пакета MSI (SQLSysClrTypes.msi) . AFAIK DLL также автоматически устанавливаются вместе с SQL Server.

Хорошо известный текст (WKT) и Хорошо известный двоичный файл (WKB):

Еще один вариант - разрешить SQL Server преобразовывать пространственные значения в общеизвестный текст (WKT) или Well-Known Binary (WKB), используя SELECT geometryColumn.STAsText() или SELECT geometryColumn.STAsBinary(), а затем искать библиотеку Python, которая может анализировать эти стандартные форматы обмена.

(Одно слово предостережения: если вы идете по этому маршруту, будьте осторожны, если ваши данные содержат дуги окружности. Существуют разные версии формата данных WKT и WKB. Сначала они были указаны как часть спецификации доступа к простым функциям Open Geospatial Consortium, эта версия не понимает дуг окружности. Поддержка сегментов круговой кривой была добавлена ​​в SQL / MM Часть 3: Пространственный стандарт, который реализует SQL Server.)

...