Создание базы данных 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.

o  LineFromWKB(fctfcb[,srid]), LineStringFromWKB {wkb[,srid])

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

o  MLineFromWKB{ wkb [r srid] ),MultiLineStringFroraWKB{wkb[,srid])

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

o  MPointFromWKB{wkb[,srid]), MultiPointFroraWKB{wkb[, srid])

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

o  MPolyFromWKB {wkb[,srid]), MultiPolygonFromWKB[wkb[,srid])

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

o  PointFroraWKB[wkb[,srid])

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

o  PolyFromWKB {wkb [r srid]), PolygonFromWKB [wkb[, srid])

В спецификации OpenGIS также описываются и необязательные функции для созда­ния значений Polygon и MultoPolygon, основанных на WKB-представлении коллекции колец или значений замкнутых объектов LineString. Эти значения могут пересекаться. В MySQL не реализованы следующие функции:

o  BdMPolyFromWKB(wkb, srid)

Создает значение MultiPolygon из значения MultiLineString в WKB-формате, которое содержит произвольную коллекцию значений замкнутых объектов LineString.

o  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;