Поиск

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

В этом разделе описываются типы данных, которые можно использовать для пред­ставления пространственных данных в MySQL, и функции, доступные для создания и извлечения пространственных значений.

Типы пространственных данных MySQL
В MySQL имеются типы данных, которые соответствуют классам OpenGIS. Некото­рые из этих типов хранят единственное геометрическое значение:

  1. GEOMETRY
  2. POINT
  3. LINESTRING
  4. POLYGON

GEOMETRY может хранить геометрические значения любого типа. Остальные типы пространственных данных с единственным значением - point, LINESTRING и polygon -ограничивают свои значения определенным геометрическим типом.
Некоторые типы данных могут хранить коллекции значений:

  1. MULTIPOINT
  2. MULTILINESTRING
  3. MULTIPOLYGON
  4. GEOMETRYCOLLECTION

GEOMETRYCOLLECTION позволяет сохранять коллекцию объектов любого типа. Осталь­ные ТИПЫ коллекций - MULTIPOINT, MULTILINESTRING, MULTIPOLYGON И GEOMETRYCOLLECTION -ограничиваются коллекциями с определенным типом геометрических объектов.

Создание пространственных значений
В этом разделе описываются способы создания пространственных значений с помощью WKT- и WKB-функций, определенных в стандартах OpenGIS, а также с помощью специальных MySQL-функций.
Создание геометрических значений с помощью WKT-функций
MySQL предлагает целый ряд функций, которые в качестве входных параметров принимают WKT-значения и, по выбору, идентификатор пространственной системы координат (SRID). Они возвращают значение соответствующей геометрии.
Функция GeomFromText() в качестве первого аргумента принимает WKT-значение любого геометрического типа. Реализация также обеспечивает отдельные для каждого типа функции-конструкторы, необходимые для создания геометрических значений каж­дого типа геометрических объектов.

  • GeomCollFromText(wkt[, srid)), GeometryCollectionFromText(wkt [, srid])
    Создает значение GEOMETRYCOLLECTION, используя его WKT-формат и идентифи­
    катор SRID.
  • GeomFromText (wkt[, srid]), GeometryFromText (wkt [, srid])

Создает геометрическое значение любого типа, используя его WKT-формат и идентификатор SRID.

  • LineFromText{wkt[,srid]),LineStringFromText(wkt [, srid])
    Создает значение LINESTRING, используя его WKT-формат и идентификатор SRID.
  • MLineFromText{wkt[,srid]),MultiLineStringFromText[wkt [, srid])
    Создает значение MULTILINESTRING, используя его WKT-формат и идентификатор SRID.
  • MPointFromText(wkt[,srid]), MultiPointFromText(wkt [, srid])
    Создает значение MULTIPOINT, используя его WKT-формат и идентификатор SRID.
  • MPolyFromText{wkt[,srid]),MultiPolygonFromText(wfct [, srid])
    Создает значение MULT I POLYGON, используя его WKT-формат и идентификатор SRID.
  • PointFromText (wkt[, srid])
    Создает значение POINT, используя его WKT-формат и идентификатор SRID.
  • PolyFromText(wkt[, srid]), PolygonFromText(wkt [, srid])
    Создает значение POLYGON, используя его WKT-формат и идентификатор SRID.
  • В спецификации OpenGIS также описываются и необязательные функции для созда­ния значений Polygon и MultoPolygon, основанных на WKT-представлении коллекции колец или значений замкнутых объектов LineString. Эти значения могут пересекаться. В MySQL не реализованы следующие функции:
  • BdMPolyFromText (wkt, srid)
    Создает значение MultiPolygon из значения MultiLineString в WKT-формате, которое содержит произвольную коллекцию значений замкнутых объектов LineString.
  • BdPolyFromText {wkt, srid)
  • Создает значение Polygon из значения MultiLineString в WKT-формате, которое содержит произвольную коллекцию значений замкнутых объектов LineString.
    Создание геометрических значений с помощью WKB-функций
    MySQL предлагает набор функций, которые в качестве входных параметров прини­мают значения BLOB в WKB-формате, и, по выбору, идентификатор пространственной системы координат (SRID).Они возвращают значение соответствующей геометрии.
    Функция GeomFromWKT () в качестве первого параметра принимает WKB-значения любого типа геометрических объектов. Реализация также обеспечивает отдельные для каждого типа функции-конструкторы, предназначенные для создания геометрических значений каждого типа геометрических объектов.

    1. GeomCollFromWKB(wkb[, srid]), GeometryCollectionFromWKB(wkt[, srid])
      Создает значение GEOMETRYCOLLECTION, используя его WKB-формат и идентифи­
      катор SRID.
    2. GeomFromWKB(wkb[,srid]), GeometryFromWKB {wkt [,srid])

    Создает геометрическое значение геометрии любого типа, используя его WKB-формат и идентификатор SRID.

    • LineFromWKB(fctfcb[,srid]), LineStringFromWKB {wkb[,srid])
    • Создает значение LINESTRING, используя его WKB-формат и идентификатор SRID.
    • MLineFromWKB{ wkb [r srid] ),MultiLineStringFroraWKB{wkb[,srid])
    • Создает значение MULTILINESTRING, используя его WKB-формат и идентификатор SRID.
    • MPointFromWKB{wkb[,srid]), MultiPointFroraWKB{wkb[, srid])
    • Создает значение MULTIPOINT, используя его WKB-формат и идентификатор SRID.
    • MPolyFromWKB {wkb[,srid]), MultiPolygonFromWKB[wkb[,srid])
    • Создает значение mult I polygon, используя его WKB-формат и идентификатор SRID.
    • PointFroraWKB[wkb[,srid])
    • Создает значение POINT, используя его WKB-формат и идентификатор SRID.
    • PolyFromWKB {wkb [r srid]), PolygonFromWKB [wkb[, srid])
    • В спецификации OpenGIS также описываются и необязательные функции для созда­ния значений Polygon и MultoPolygon, основанных на WKB-представлении коллекции колец или значений замкнутых объектов LineString. Эти значения могут пересекаться. В MySQL не реализованы следующие функции:
    • BdMPolyFromWKB(wkb,srid)
    • Создает значение MultiPolygon из значения MultiLineString в WKB-формате, которое содержит произвольную коллекцию значений замкнутых объектов LineString.
    • BdPolyFromWKB(wkb, srid)
    • Создает значение Polygon из значения MultiLineString в WKB-формате, которое содержит произвольную коллекцию значений замкнутых объектов LineString.
      Создание геометрических значений с помощью
      специальных MySQL-функций | На заметку!
      щ Функции, перечисленные в этом разделе, в MySQL не реализованы.
      MySQL предлагает набор полезных функций для создания WKB-представлений геометрических значений. Функции, описанные в этом разделе, являются расширениями MySQL для спецификаций OpenGIS. Результаты данных функций - это значения BLOB, содержащие WKB-представление геометрических значений без идентификатора про­странственной системы координат (SRID). Результаты этих функций могут использо­ваться в качестве первого аргумента для любой функции из семейства GeomFromWKB ().
      • GeometryCollection{gl,д2,...)
      • Создает WKB-значение GeometryCollection. Если какой-нибудь из параметров имеет неправильный WKB-формат геометрического объекта, возвращается значе­ние NULL.
      • LineString {ptlrpt2,...)
      • Создает WKB-значение LineString из ряда WKB-аргументов Point. Если хотя бы один из аргументов не является WKB-значением Point, возвращается значение NULL. Если количество аргументов Point меньше двух, возвращаемым значением будет NULL.
      • MultiLineString{lsl,Is2,...)
      • Создает WKB-значение (объекта) MultiLineString, используя WKB-аргументы LineString. Если хотя бы один из аргументов не является WKB-значением LineString, возвращается значение NULL.
      • Multipoint (ptltpt2,...)
      • Создает WKB-значение Multipoint, используя WKB-аргументы Point. Если хотя бы один из аргументов не является WKB-значением Point, возвращается значение null.
      • MultiPolygon[polyl,poly2, ...)
      • Создает WKB-значение MultiPolygon из набора WKB-аргументов Polygon. Если хотя бы один из аргументов не является WKB-значением Polygon, возвращается значение NULL.
      • Point (x, у)
      • Polygon {lslrls2,...)
      Создает WKB-значение Polygon из ряда WKB- аргументов LineString. Если хотя бы один из аргументов не является WKB-значением объекта LinearRing (то есть незамкнутого простого объекта LineString), возвращается значение NULL.
      Создание пространственных столбцов
      MySQL предлагает стандартный путь создания пространственных столбцов для раз­ных типов геометрий, например, с помощью операторов CREATE TABLE или ALTER TABLE. В настоящее время пространственные столбцы поддерживаются только для таблиц My lSAM.
      • Для создания таблицы с пространственным столбцом используйте оператор CREATE TABLE:
      • mysql> CREATE TABLE geom (g GEOMETRY); Query OK, 0 rows affected (0.02 sec)
      • Чтобы добавить пространственный столбец в существующую таблицу или уда лить его, используйте оператор ALTER TABLE:
      mysql> ALTER TABLE geom ADD pt POINT; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
      raysql> ALTER TABLE geom DROP pt; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0
      Заполнение пространственных столбцов
      После того, как пространственные столбцы созданы, их можно заполнить простран­ственными данными.
      Значения должны сохраняться во внутреннем формате геометрического объекта, но в такой формат их можно преобразовывать и из форматов WKT и WKB. Следующие при­меры иллюстрируют способы вставки геометрических значений в таблицу путем преоб­разования WKT-значений во внутренний геометрический формат.
      Преобразование можно выполнять непосредственно через оператор INSERT:
      INSERT INTO geom VALUES (GeomFromText(4POINT(1 1)'));
      SET @g = 'POINT(1 1)';
      INSERT INTO geom VALUES (GeomFromText(@g));
      Или же можно преобразовать значения в нужный формат и перед выполнением опе­ратора INSERT:
      SET @g = GeomFromText('POINT(1 I)1); INSERT INTO geom VALUES (@g);
      В следующих примерах выполняется вставка в таблицу более сложных геометриче­ских значений:
      SET @g = 'LINESTRING(0 0,1 1,2 2) ';
      INSERT INTO geom VALUES (GeomFromText(@g));
      SET @g = fPOLYGON((0 0,10 0,10 10,0 10,0 0), (5 5,7 5,7 7,5 7, 5 5))f;
      INSERT INTO geom VALUES (GeomFromText(@g));

      SET @g =
      'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))'; INSERT INTO geom VALUES (GeomFroraText(@g));
      Во всех приведенных выше примерах для создания геометрических значений исполь­зуется функция GeomFromText (). Также можно применять и специальные для каждого типа функции:
      SET @g = 'POINT(1 1) ';
      INSERT INTO geom VALUES (PointFromText(@g));
      SET @g = 'LINESTRING(0 0,1 1,2 2)';
      INSERT INTO geom VALUES (LineStringFromText(@g));
      SET @g = 'POLYGON( (0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))'; INSERT INTO geom VALUES (PolygonFromText(@g));
      SET @g =
      'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))'; INSERT INTO geom VALUES (GeomCollFromText(@g));
      Обратите внимание, что если клиентская прикладная программа требует использо­вать WKB-формат геометрических значений, именно она и будет отвечать за отправку на сервер корректно оформленных WKB-значений в запросах. Однако существует не­сколько способов удовлетворить такое требование. Например:
      • Можно вставить значение POINT (1 1), используя шестнадцатеричный литераль ный/буквенный синтаксис:
      • mysql> INSERT INTO geom VALUES
        -> (GeomFromWKB (0x0101000000000000000000F03F000000000000F03F));
      • Приложение ODBC может посылать значения в WKB-формате, привязывая их к заполнителю с помощью аргумента типа BLOB:
      • INSERT INTO geom VALUES (GeomFromWKB(?))
        Другие интерфейсы программирования могут поддерживать подобный механизм заполнителя.
      • В программе С можно отменить двоичное значение с помощью mysql_real_escape_string() и включить результат в отсылаемую на сервер строку запроса.
      Выборка пространственных данных
      Геометрические значения, сохраненные в таблице, могут быть выбраны во внутрен­нем формате. Также их можно преобразовывать в формат WKT или WKB.
      Выборка пространственных данных во внутреннем формате
      Выборка геометрических значений с использованием внутреннего формата может пригодиться при переходах от таблицы к таблице:
      CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;
      Выборка пространственных данных в WKT-формате

      Выборка пространственных данных в WKB-формате
      Функция AsBinary() преобразует геометрический объект из внутреннего формата в содержащий WKB-значение объект BLOB.
      SELECT AsBinary(g) FROM geom;