Приложение 2. Примеры работы с геометрическим BLOB-объектом

!РАБОТА С ГЕОМЕТРИЧЕСКИМИ BLOB-ДАННЫМИ
!Установка режима хранения в БД геометрических данных
!в виде BLOB-значений
set session blob geometry storage on;

!Создание таблицы с геометрическими BLOB-данными
CREATE OR REPLACE TABLE GTEST (OBJECTID INT PRIMARY KEY, NAME NVARCHAR (250), GEOM GEOMETRY);

!Загрузка геометрических данных из шестнадцатеричного представления

INSERT INTO GTEST (OBJECTID,NAME,GEOM) VALUES (1 , n'TEST', NULL);
blob insert column=3
010300000001000000050000000000000000002440000000000000244000000000000
024400000000000004940000000000000494000000000000049400000000000004940
000000000000244000000000000024400000000000002440FFFF0000;
INSERT INTO GTEST (OBJECTID,NAME,GEOM) VALUES (2 , n'TEST', NULL);
blob insert column=3
010300000001000000060000000000000000002440000000000000244000000000000
024400000000000004940000000000000494000000000000049400000000000004940
000000000000244000000000000024400000000000002440000000000000244000000
00000002440FFFF0000;

!Проверка корректности загруженных геометрических объектов
! первый объект – корректный, второй – нет.

select GEOISVALID(GEOM) from GTEST;
1
0

!Создание таблицы с геометрическими BLOB-данными
CREATE OR REPLACE TABLE GTEST (OBJECTID INT PRIMARY KEY, NAME NVARCHAR (250), GEOM GEOMETRY);

!Загрузка геометрических данных из шестнадцатеричного представления
INSERT INTO GTEST (OBJECTID,NAME,GEOM) VALUES (1 , n'TEST',
GEOMFROMWKB(hex('01030000000100000005000000000000000000244000000000000
0244000000000000024400000000000004940000000000000494000000000000049400
000000000004940000000000000244000000000000024400000000000002440'),
 4284));

!Выборка геометрических BLOB-данных

!Информация о BLOB-значении: тип и длина BLOB-значения
select astext(GEOM) from GTEST;
|000000041 000000 000000 0 001|

!Шестнадцатеричное представление геометрического BLOB-значения
blob get column=1;
504F4C59474F4E20282831302031302C31302035302C35302035302C35302031302C313
02031302929

!Символьное представление геометрического BLOB-значения
select getblobstr(astext(GEOM), 1, 50), lenblob(astext(GEOM)), lenblob(GEOM) from GTEST;
|POLYGON ((10 10,10 50,50 50,50 10,10 10))| 41| 97|

!Получение длины и  атрибутов геометрического BLOB-значения
select lenblob(asbinary(GEOM)), asbinary(GEOM) from GTEST;
|         93|000000093 000002 000002 1 001|

blob get column=2;
0103000000010000000500000000000000000024400000000000002440000000000000
2440000000000000494000000000000049400000000000004940000000000000494000
0000000000244000000000000024400000000000002440

select cast getblobstr(asbinary(GEOM), 1, 93) as byte(93) from GTEST;
0103000000010000000500000000000000000024400000000000002440000000000000
2440000000000000494000000000000049400000000000004940000000000000494000
0000000000244000000000000024400000000000002440

!Вычисление размера геометрического BLOB-значения
select area(GEOM) from GTEST;
1600

!Загрузка текстового представления геометрического BLOB-объекта

INSERT INTO GTEST (OBJECTID,NAME,GEOM) VALUES (2 , n'TEST2', GeomFromText('POLYGON (0 0,0 20,20 20,20 0,0 0)', 4284));

Получение текстового представления геометрического BLOB-объекта
select getblobstr(astext(GEOM), 1, 50) from GTEST where OBJECTID=2;
|POLYGON ((0 0,0 20,20 20,20 0,0 0)) |

!Проверка пересечения геометрических BLOB-значений
select getblobstr(astext(GEOM), 1, 50) from GTEST where DISJOINT(GEOM, GeomFromText('POLYGON (0 0,0 1,1 1,1 0,0 0)', 4284)) = 0;
|POLYGON ((0 0,0 20,20 20,20 0,0 0)) |

select getblobstr(astext(GEOM), 1, 50) from GTEST where DISJOINT(GEOM, GeomFromText('POLYGON (49 49,49 50,50 50,50 49,49 49)', 4284)) = 0;
|POLYGON ((10 10,10 50,50 50,50 10,10 10)) |

!Объединение геометрических BLOB-значений
select getblobstr(astext(UNION(GEOM, GeomFromText('POLYGON (5 5,5 25,25 25,25 5,5 5)', 4284))), 1, 100) from GTEST;
|POLYGON ((10 25,10 50,50 50,50 10,25 10,25 5,5 5,5 25,10 25)) |
|POLYGON ((20 5,20 0,0 0,0 20,5 20,5 25,25 25,25 5,20 5))      |


!Пересечение геометрических BLOB-значений
select getblobstr(astext(INTERSECTION(GEOM, GeomFromText('POLYGON (5 5,5 25,25 25,25 5,5 5)', 4284))), 1, 200) from GTEST;
|POLYGON ((25 10,10 10,10 25,25 25,25 10)) |
|POLYGON ((5 20,20 20,20 5,5 5,5 20))      |

!Получить следующие параметры геометрическим BLOB-значений:
! – симметричную разность геометрических объектов
! – количество объектов в группе
! – объект с заданным порядковым  номером в группе

select
  getblobstr(astext(SYMDIFFERENCE(GEOM, GeomFromText('POLYGON (5 5,5 25,25 25,25 5,5 5)', 4284))), 1, 110),
  NUMGEOMETRIES(SYMDIFFERENCE(GEOM, GeomFromText('POLYGON (5 5,5 25,25 25,25 5,5 5)', 4284))),
  getblobstr(astext(GEOMETRYN(SYMDIFFERENCE(GEOM, GeomFromText('POLYGON (5 5,5 25,25 25,25 5,5 5)', 4284)), 2)), 1, 80)
from GTEST;
|MULTIPOLYGON (((10 25,10 50,50 50,50 10,25 10,25 25,10 25)),((25 10,25 5,5 5,5 25,10 25,10 10,25 10))) |
| 2|
|POLYGON ((25 10,25 5,5 5,5 25,10 25,10 10,25 10)) |

|MULTIPOLYGON (((20 5,20 0,0 0,0 20,5 20,5 5,20 5)),((5 20,5 25,25 25,25 5,20 5,20 20,5 20))) |
| 2|
|POLYGON ((5 20,5 25,25 25,25 5,20 5,20 20,5 20)) |

!Найти разность двух геометрических BLOB-объектов
select getblobstr(astext(DIFFERENCE(GEOM, GeomFromText('POLYGON (5 5,5 25,25 25,25 5,5 5)', 4284))), 1, 200) from GTEST;
|POLYGON ((10 25,10 50,50 50,50 10,25 10,25 25,10 25)) |
|POLYGON ((20 5,20 0,0 0,0 20,5 20,5 5,20 5))          |

!Получить название геометрического BLOB-объекта
select GEOMETRYTYPE(GEOM) from GTEST;
|POLYGON|
|POLYGON|

!Получить SRID геометрического BLOB-объекта
select SRID(GEOM) from GTEST;
|4284|
|4284|

!Найти минимальный прямоугольник, ограничивающий заданный
!геометрический BLOB-объект
select cast astext(ENVELOPE(GEOM)) as char(80) from GTEST;
|POLYGON ((10 10,50 10,50 50,10 50,10 10)) |
|POLYGON ((0 0,20 0,20 20,0 20,0 0))       |

Определить размерность геометрического BLOB-объекта
select DIMENSION(GEOM) from GTEST;
|2|
|2|

!function BOUNDARY (LINESTRINGs), LENGTH:
!Найти границу геометрического BLOB-объекта и её длину
select getblobstr(astext(BOUNDARY(GEOM)), 1, 50), GLENGTH(BOUNDARY(GEOM)) from GTEST;
|LINESTRING (10 10,10 50,50 50,50 10,10 10)| 160|
|LINESTRING (0 0,0 20,20 20,20 0,0 0)| 80|

!Найти геометрический центр геометрического BLOB-объекта
select cast astext(CENTROID(GEOM)) as char(50), X(CENTROID(GEOM)), Y(CENTROID(GEOM)) from GTEST;
|POINT (30 30)| 30| 30|
|POINT (10 10)| 10| 10|

!Определить внешнюю границу геометрического BLOB-объекта
SELECT getblobstr(astext(ExteriorRing(GEOM)), 1, 80) from GTEST;
|LINESTRING (10 10,10 50,50 50,50 10,10 10) |
|LINESTRING (0 0,0 20,20 20,20 0,0 0)       |

!Преобразовать геометрический BLOB-объект в новую систему координат
SELECT getblobstr(astext(TRANSFORM(GEOM, 1)), 1, 80) from GTEST;
|POLYGON ((10 10,10 50,50 50,50 10,10 10)) |
|POLYGON ((0 0,0 20,20 20,20 0,0 0))       |