Пытка вопрошает, а боль отвечает ...

Создание собственных пространственных справочных систем в MySQL 8.0

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Статья опубликована: 5 июня 2018

Создание собственных пространственных справочных систем в MySQL 8.0
MySQL 8.0.11 поставляется с каталогом 5108 пространственных справочных систем (SRS) . 4628 проекций (плоские карты), 479 географических (эллипсоидальных) представлений Земли и одной картезианской многоцелевой абстрактной плоскости (SRID 0). И если по какой-то причине этого недостаточно, мы можем создать свои собственные.

Создание (и удаление) SRS в настоящее время требует привилегии SUPER (это может быть позже разделено на отдельную привилегию). SRS создаются с помощью операторов CREATE SPATIAL REFERENCE SYSTEM. Синтаксис прост:

 

SRID – это числовой идентификатор, который MySQL будет использовать для этой SRS. Это имя предназначено только для людей, но MySQL будет уверен, что он всегда уникален. Определение состоит в том, что все детали скрыты. Предыдущие сообщения в блогах охватывали географические и прогнозируемые определения SRS, поэтому я не буду их повторять. Вернитесь к этим сообщениям для всех деталей.

Кроме того, существует два необязательных предложения: задает строку с текстовым описанием SRS и указывает организацию, являющуюся источником этого определения SRS, и SRID организации для этой SRS (которая не должна соответствовать SRID MySQL) , Оба необязательных предложения являются чисто информационными. MySQL не использует их. Однако, поскольку стандарт SQL / MM указывает его, MySQL гарантирует, что пара имени организации и конкретного SRID организации уникальна

 

Все определения SRS, установленные по умолчанию, указывают, что координаты – это широта первой долготы секунды. В качестве примера новой SRS давайте создадим широтно-широтную версию WGS 84 (SRID 4326). Все, что нам нужно сделать, это поменять порядок двух AXIS предложений в определении:

 

Если мы запросим представление ST_SPATIAL_REFERENCE_SYSTEMS, мы найдем наш SRS:

 

Этот SRS ведет себя так же, как SRID 4326, но с той разницей, что первая координата в SRID 1004326 является долготой, а вторая – широтой. Мы можем легко убедиться, что, вычислив расстояние между Тронхеймом (Норвегия) и Лондоном (Великобритания) в двух SRS. Если SRS одинаковы независимо от порядка оси, мы должны получить одинаковое расстояние в обеих SRS:

 

Расстояние действительно то же самое.

Между определениями SRS, которые установлены по умолчанию и определенными пользователем SRS, нет существенной разницы. MySQL относится к ним точно так же, и при использовании пользовательской SRS нет штрафа за производительность.

Выбор SRID

Какой SRID следует выбрать для вашей домашней SRS? SRID представляет собой неподписанное 32-битное целое число, поэтому у нас есть 4294967296 возможности для начала. Но в будущем MySQL будет расширен больше SRS, и вы должны выбрать SRID, который не вступает в конфликт с любыми новыми системными SRS. В настоящее время MySQL резервирует следующие диапазоны SRID:

  • [0, 32767]
  • [60000000, 69999999]
  • [2000000000, 2147483647]

Нам разрешено создавать SRS в этих диапазонах. В конце концов, у нас есть привилегия SUPER. Но MySQL предупреждает нас, что это не очень хорошая идея:

 

Поэтому, пожалуйста, будьте внимательны и не делайте этого. 🙂

Удаление SRS

Как и ожидалось, мы также можем отказаться от SRS, которые мы создаем:

 

И все! Мы также можем отказаться от SRS в зарезервированных регионах, включая те, которые установлены по умолчанию, но, опять же, пожалуйста, прислушайтесь к предупреждению и не делайте этого. Это не приятно.

Но мы не можем всегда отказываться от SRS, даже если мы SUPER. Рассмотрим этот пример:

 

Поскольку MySQL требует определения SRS для большинства пространственных операций, он отслеживает SRID, упомянутые в ограничениях столбцов, и останавливает нас, если мы попытаемся удалить SRS, который используется. В этом случае это только столбец, который ограничен SRID, но также могут быть индексы в этом столбце. Если SRS исчезнет, ​​пока существует индекс, использующий его, MySQL не будет знать, как искать или обновлять индекс. Поэтому нам не разрешено удалять SRS, которые используются.

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

 

Обратите внимание, что эта защита SRS применяется только к SRID, указанным в определениях таблиц. MySQL не отслеживает SRID, используемые в самих значениях. В этом примере столбец позиции не ограничен каким-либо SRID, но новый SRID используется в значениях точки в этом столбце:

 

Теперь мы находимся в ситуации, когда SRID, используемый двумя нашими геометриями, в настоящее время не определен. MySQL будет громко жаловаться на это. Например, это не позволит нам делать какие-либо вычисления:

 

Зачем? Потому что вычисление зависит от определения SRS. MySQL ничего не знает об этой SRS, если она географическая или проецируемая, какова форма эллипсоида или какая единица используется. Но мы не все потеряли. Мы все еще можем посмотреть на координаты:

 

Мы должны страдать от некоторых предупреждений, но мы не можем обвинять кого-либо в этом. Это наша собственная ошибка для сброса SRS, который использовался. Как выйти из этой ситуации? Мы можем либо воссоздать нашу SRS, либо мы можем отнести наши данные к другому (существующему) SRID. В этом случае мы знаем, что SRID 2004326 на самом деле совпадает с SRID 4326, поэтому мы можем изменить наши данные на этот SRID:

 

Это завершает наш тур по CREATE и DROP SPATIAL REFERENCE SYSTEM. Попробуйте, получайте удовольствие, и, пожалуйста, оставайтесь за пределами зарезервированных диапазонов SRID!

Благодарим вас за использование MySQL!

Создание собственных пространственных справочных систем в MySQL 8.0


Читайте также

    Добавить комментарий

    Войти с помощью: 

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

    badge
    Обратный звонок 1
    Отправить
    galka

    Спасибо! Ваша заявка принята

    close
    galka

    Спасибо! Ваша заявка принята

    close