Как построить формат типа данных географии на сервере SQL?

Я не в состоянии понять, как география типа данных на сервере SQL... Например, у меня есть следующие данные:

0xE6100000010CCEAACFD556484340B2F336363BCA21C0

что я знаю:

0x - префикс шестнадцатеричного

последние 16 чисел - долгота: B2F336363BCA21C0 (двойной десятичный формат)

16 чисел перед последними 16 являются широтой: CEAACFD556484340 (двойной десятичный формат)

4 первых числа SRID: E610 (шестнадцатеричный для WGS84)

что я не понимаю

цифры от 5 до 12: 0000010C

что это?

Из того, что я прочитал, похоже, что это связано с WKB(хорошо известным двоичным кодом) или EWKB(расширенным хорошо известным двоичным файлом). В любом случае, я не смог найти определение для EWKB... А для WKB это должен быть тип геометрии (4 байта). целое число), но значение не совпадает с кодами типов Geometry (этот пример для координаты одной точки)

Можете ли вы помочь понять этот формат?

3 ответа

Пространственные типы (геометрия и география) в SQL Server реализованы как типы данных CLR. Как и с любыми такими типами данных, вы получаете двоичное представление при непосредственном запросе значения. К сожалению, это не (насколько я знаю) WKB, а скорее тот формат, который Microsoft решила, был лучшим для их реализации. Для нас (пользователей) мы должны работать с опубликованным интерфейсом методов, которые были опубликованы MS (например, ссылка на метод географии). Это значит, что вы должны пытаться расшифровать двоичное представление MS только в том случае, если вам интересно (а не работать с ним).

Тем не менее, если вам нужно / хотите работать с WKB, вы можете! Например, вы можете использовать STGeomFromWKB() статический метод для создания экземпляра географии из WKB, который вы предоставляете и STAsBinary() может быть вызван для экземпляра географии, чтобы вернуть вам WKB.

Спецификацию формата можно найти здесь:

https://msdn.microsoft.com/en-us/library/ee320529(v=sql.105).aspx

Как показывает эта страница, она очень часто менялась, но значительно замедлилась за последние 2 года

В настоящее время мне нужно углубиться в спецификацию, чтобы сериализовать код JVM в файл bcp, чтобы я мог использовать SQLServerBulkCopy вместо простого JDBC для загрузки данных в таблицы (записать bcp-файл примерно в 7 раз быстрее, чем с использованием JDBC), но это оказывается сложнее, чем я ожидал.

После тестирования с помощью bcp вы можете загрузить географию, указав формат вне строки ( varchar(max)) и сохранить известный текст, SQL-сервер увидит это и предположит, что вам нужна география на основе WKT, которую он видит.

В моем случае преобразование в nvarchar решило проблему.

Другие вопросы по тегам