Как построить формат типа данных географии на сервере 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, которую он видит.