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


