После заполнения пространственных столбцов значениями можно делать запросы и анализировать их. MySQL предлагает набор функций для выполнения различных операций над пространственными данными. Эти функции можно разделить на четыре основных категории согласно типу выполняемой ими операции:
- Функции, которые преобразуют геометрические объекты из одного формата в
другой. - Функции, которые обеспечивают доступ к качественным или количественным
свойствам того или иного геометрического объекта. - Функции, которые описывают взаимосвязь между двумя геометриями.
- Функции, которые создают новые геометрии из уже существующих.
Функции пространственного анализа могут использоваться в различных контекстах: - В любой интерактивной SQL-программе, подобной mysql или MySQLCC.
- В прикладных программах, написанных на любом языке, который поддерживает
клиентский API-интерфейс MySQL.
Функции преобразования формата геометрических объектов
MySQL поддерживает следующие функции для преобразования формата значений геометрических объектов с внутреннего в WKT- или WKB-формат и наоборот:
- AsBinary(д). Преобразует значение во внутреннем геометрическом формате в
WKB-формат и возвращает двоичный результат. - AsText(g). Преобразует значение во внутреннем геометрическом формате гео
метрии в WKT-формат и возвращает результат в виде строки.
mysql> SET @g =’LineString(l 1,2 2,3 3)’;
mysql> SELECT AsText(GeomFromText(@g));
I AsText(GeomFromText(@G)) I
+—————————————— h
I LINESTRINGd 1,2 2,3 3) |
- GeomFromText(wkt[,srid]). Преобразует строковое значение из WKT-формата во
внутренний геометрический формат и возвращает результат. Также поддержива
ется набор специальных для каждого типа функций, таких как PointFromText() и
LineFromText(); см. раздел Создание геометрических значений с помощью WKT-функций - GeomFromWKB({Wcb[,srid]). Преобразует двоичное значение из WKB-формата во
внутренний геометрический формат и возвращает результат. Также поддерживается набор специальных для каждого типа функций, таких как PointFromWKB() и
LineFromWKB (); см. раздел Создание геометрических значений с помощью WKB-функций
Геометрические функции
Каждая функция, принадлежащая данной группе, принимает геометрическое значение в качестве аргумента и возвращает некоторое качественное или количественное свойство геометрии. Некоторые функции ограничивают тип аргументов. Такие функции возвращают значение NULL, если геометрический тип аргумента указан неверно. Например, функция Area () возвратит NULL, если тип объекта не соответствует ни Polygon, ни MultiPolygon.
Общие функции геометрических объектов
Функции, перечисленные в этом разделе, не ограничивают аргументы и принимают геометрическое значение любого типа.
- Dimension(g). Возвращает унаследованное измерение геометрического значения
д. Результатом может быть -1, 0, 1 или 2. (Описание смысла этих значений дается
в разделе Класс Geometry)
raysql> SELECT Dimension(GeomFromText(ALineString (l 1,2 2)’));
Envelope (g). Возвращается минимальный ограничивающий прямоугольник (MBR) для геометрического значения д. Результат возвращается в виде значения Polygon.
mysql> SELECT AsText(Envelope(GeomFromText(‘LineString(l 1,2 2)’)));
Границы многоугольника определяются угловыми точками ограничивающего прямоугольника:
POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
GeometryType (g). Возвращает в виде строки название геометрического типа, к которому относится экземпляр геометрии д. Название будет соответствовать названию одного из подклассов с возможностью создания экземпляров класса Geometry
SRID(g). Возвращает целое число, обозначающее идентификатор пространствен¬ной системы координат (SRID) для геометрии д. mysql> SELECT SRID (GeomFromText (‘ Line String (l 1,2 2)’,101));
В спецификации OpenGIS также определены следующие функции, которые в MySQL пока не реализованы:
- Boundary {д}. Возвращает геометрический объект, который является замыканием
комбинаторной границы геометрического значения д. - isEmpty(д). Возвращает 1, если значение геометрии д является пустой геометри
ей, 0 – если не пустой, и -1 – если аргумент равен NULL. Если геометрический объ
ект пустой, он представляет собой пустое множество точек. - IsSimple (g). В настоящее время эта функция является заполнителем и не должна
использоваться. Ниже представлено ее описание на тот случай, если она все-таки
будет применяться.
Функция возвращает 1, если значение геометрии д не содержит никаких аномальных геометрических точек, подобных самопересечению или самокасания. IsSimple () возвращает 0, если аргумент не является простым, и -1, если аргумент равен NULL.
В описании каждого геометрического класса с возможностью создания экземпляров, предложенном ранее в этой главе, перечислены определенные условия, при которых экземпляры того или иного класса будут классифицироваться как непростые.
Функции Point
Point состоит из координат X и Y, которые можно получить с помощью следующих функций:
- X (р). Возвращает значение координаты X для точки р в виде числа с двойной точ
ностью.
mysql> SELECT X (GeomFromText (‘Point (5б.7 53.34)’));
Y (p). Возвращает значение координаты Y для точки р в виде числа с двойной точностью.
mysql> SELECT Y(GeomFromText(‘Point(56.7 53.34)’));
Функции LineString
Объект LineString состоит из значений Point. Можно извлекать определенные точки объекта LineString, подсчитывать количество точек, из которых он состоит, или получать значение его длины.
- EndPoint(Is). Возвращает точку Point, которая является конечной точкой
LineStr ing-значения Is.
mysql> SET @ls = ‘LineString(l 1,2 2,3 3)‘; mysql> SELECT AsText(EndPoint(GeomFromText(@ls)));
- GLength (Is). Возвращает в виде числа с удвоенной точностью длину LineString значения Is со связанной с ним пространственной ссылкой.
- IsClosed(ls). Возвращает 1, если LineString-значения 25 является замкнутым
(то есть значения StartPoint () и EnPoint () совпадают). Возвращает 0, если Is не
является замкнутым, и -1, если Is соответствует NULL. - NumPoints (Js). Возвращает число точек в LineStr ing-объекте Is.
mysql> SET @ls = ‘LineString(1 1,2 2,3 3)’;
mysql> SELECT NumPoints (GeomFromText(@ls));
- PointN(Is,л). Возвращает л-ную точку в Linestring-значении Is. Нумерация то
чек начинается с 1.
mysql> SET Ш = ‘LineString(l 1,2 2,3 3)‘; mysql> SELECT GLength(GeomFromText (@Is));
mysql> SET Sis – ‘LineStringU 1,2 2,3 3)‘ ; mysql> SELECT IsClosed(GeoraFromText(61s));
mysql> SET @ls = ‘LineString(l 1,2 2,3 3)‘; mysql> SELECT AsText(PointN(GeomFromText(@ls),2));
mysql> SET @ls = ‘LineString(l 1,2 2,3 3)’ ;
mysql> SELECT AsText(StartPoint(GeomFromText(@Is)));
В спецификации OpenGIS также определена следующая функция, которая MySQL пока не реализована:
« isRing(Is). Возвращает 1, если LineSt r ing-объект Is является замкнутым (то есть значения StartPoint () и EndPoint () совпадают) и простым (линия не проходит в одной и той же точке более одного раза). Возвращает 0, если Is – это не кольцо, и -1, если Is равно NULL.
Функции MultiLineString
- GLength (mis). Возвращает в виде числа с удвоенной точностью значение длины Mu ltiLineSt r ing-объекта mis. Длина mis равна сумме длин составляющих его элементов.
mysql> SET @mls = ‘MultiLineString((1 1,2 2,3 3),(4 4,5 5))
mysql> SELECT GLength(GeomFromText(@mls));
IsClosed(mls). Возвращает 1, если MultiLineString-объект mis является замкнутым (то есть значения StartPoint () и EndPoint () одинаковы для каждого объекта LineString в mis). Возвращает 0, если mis замкнутым не является, и -1, если значение mis равно NULL.
mysql> SET @mls = ‘MultiLineString((1 1,2 2,3 3),(4 4,5 5))’;
mysql> SELECT IsClosed(GeomFromText(@mls));
Функции Polygon
- Area {poly). Возвращает в виде числа с удвоенной точностью значение области
Polygon-объекта poly, в соответствии с его размерами в пространственной систе
ме координат. - ExteriorRing(poly). Возвращает внешнее кольцо Polygon-объекта poly в виде
LineString. - InteriorRingN(poly,n). Возвращает л-ное внутреннее кольцо для Polygon
значения poly в виде LineString. Нумерация колец начинается с 1. - NumlnteriorRings {poly). Возвращает количество внутренних колец в Polygon
объекте poly. - Area {mpoly). Возвращает в виде числа двойной точности область MultoPolygon
объекта mpoly, в соответствии с его размерами в пространственной системе коор
динат.
mysql> SET @poly = ‘Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 I)) 1;
mysql> SELECT Area(GeomFromText(@poly));
mysql> SET @poly = ‘Polygon((0 0,0 3,3 3,3 0,0 0), (1 1,1 2,2 2,2 1,1 I))1;
mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly)));
mysql> SET @poly = ‘Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 I))1;
mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly) ,1));
mysql> SET @poly = ‘Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))’;
mysql> SELECT NumlnteriorRings(GeomFromText(@poly));
Функции MultiPolygon
mysql> SET @mpoly =
-> ‘MultiPolygon(((0 0,0 3,3 3,3 0,0 0), (I 1,1 2,2 2,2 1,1 I)))1;
mysql> SELECT Area(GeomFromText(@mpoly));
В спецификации OpenGIS также определены следующие функции, которые в MySQL пока не реализованы:
- Centroid{mpoly). Возвращает математический центр тяжести для MultiPolygon
объекта mpoly в виде Point. He гарантируется, что результат будет находиться в
пределах MultiPolygon. - PointOnSurface {mpoly). Возвращает значение Point, которое гарантированно будет находиться в пределах Multi Polygon-объекта mpoly.
Функции GeometryCollection
- GeometryN {дс, л). Возвращает л-ный геометрический объект в GeometryCollection
объекте дс. Нумерация геометрических объектов начинается с 1. - NumGeometries(gc). Возвращает количество геометрических объектов в
GeometryCollection-значении дс.
mysql> SET @gc = ‘GeometryCollection(Point(1 1),LineString(2 2, 3 3))’;
mysql> SELECT AsText(GeometryN(GeomFromText(@gc),1));
mysql> SET @gc = ‘GeometryCollection(Point(1 1),LineString(2 2,3 3))’; mysql> SELECT NumGeometries(GeomFromText(@gc));
Функции для создания новых геометрий из существующих
Геометрические функции для создания новых геометрий
В разделе Геометрические функцииуже обсуждались некоторые функции, с помощью которых можно создавать новые геометрии из существующих:
- Envelope (gr)
- StartPoint(Is)
- EndPoint(Is)
- PointK(ls,n)
- ExteriorRing{poly)
- InteriorRingN{poly,n)
- GeometryN(gc, л)
Пространственные операторы
OpenGIS предлагает ряд других функций для создания геометрий. В этих функциях используются пространственные операции.
В MySQL данные функции пока не реализованы, возможно, они появятся в будущих версиях.
- Buffer {g, d). Возвращает геометрию, представляющую все точки, расстояние ко
торых от значения геометрии д меньше или равно расстоянию d. - ConvexHull (g). Возвращает геометрию, которая представляет собой выпуклую
оболочку геометрии д. - Difference {glf g2). Возвращает геометрию, которая представляет разность мно
жества точек геометрии gl и д2. - Intersection{gl,g2). Возвращает геометрию, которая представляет пересечение множества точек геометрий gl и д2.
- SymDifference(grl,g2). Возвращает геометрию, которая представляет симметри
ческую разность множества точек геометрий gl и д2. - Union iglfg2). Возвращает геометрию, которая представляет объединение множества точек геометрий gl и д2.
Функции для проверки пространственных отношений между геометрическими объектами
Функции, описанные в этих разделах, принимают две геометрии в качестве входных параметров и возвращают значение качественного или количественного отношения между ними.
Отношение минимальных ограничивающих
прямоугольников
MySQL предлагает некоторые функции, с помощью которых можно проверять отношение между минимальными ограничивающими прямоугольниками (Minimum Bounding Rectangle – MBR) двух геометрий gl и д2. Они включают:
- MBRContains (glt g2). Возвращает значение 1 или 0, указывающее, содержит ли
минимальный ограничивающий прямоугольник геометрии gl минимальный огра
ничивающий прямоугольник геометрии д2.
mysql> SET §gl = GeomFromText(‘Polygon((0 0,0 3,3 3,3 0,0 0))1);
mysql> SET @g2 = GeomFromText(‘Point(1 1)’);
mysql> SELECT MBRContains(@gl,@g2), MBRContains(@g2,@gl);
MBRDisjoint [glfg2). Возвращает значение 1 или 0, указывающее, разделены ли (не пересекаются) минимальные ограничивающие прямоугольники (MBR) двух геометрий gl и д2.
- MBREqual {gl,g2). Возвращает значение 1 или 0, указывающее, являются ли мини
мальные ограничивающие прямоугольники двух геометрий gl и д2 одинаковыми. - MBRIntersects (glfg2). Возвращает значение 1 или 0, указывающее, пересекаются
ли минимальные ограничивающие прямоугольники двух геометрий gl и д2. - MBROverlaps {gl,g2). Возвращает значение 1 или 0, указывающее, перекрывают ли
друг друга минимальные ограничивающие прямоугольники двух геометрий gl и д2. - MBRTouches {glrg2). Возвращает значение 1 или 0, указывающее, соприкасаются
ли минимальные ограничивающие прямоугольники двух геометрий gl и д2. - MBRWithin{glfg2). Возвращает значение 1 или 0, указывающее, находится ли ми
нимальный ограничивающий прямоугольник геометрии gl внутри минимального
ограничивающего прямоугольника геометрии д2.
mysql> SET @gl = GeomFromText(‘Polygon((0 0,0 3,3 3,3 0,0 0))’);
mysql> SET @g2 = GeomFromText (‘Polygon((0 0,0 5,5 5,5 0,0 0))’);
mysql> SELECT MBRWithin(@gl,@g2), MBRWithin(@g2,@gl);
Функции для проверки пространственных отношений между геометриями
В спецификации OpenGIS определены следующие функции. В настоящее время MySQL не реализует их согласно спецификации. Те из них, которые введены в MySQL, возвращают тот же результат, что и соответствующие функции для MBR. Сюда относятся представленные в следующем ниже списке функции, за исключением Distance () и Related().
Вполне возможно, что эти функции будут введены в последующих версиях, включая полную поддержку для пространственного анализа, а не только поддержку для MBR-функций.
Функции работают с двумя значениями геометрий gl и д2.
- Contains {gl, g2). Возвращает значение 1 или 0, указывающее, включает в себя геометрия gl геометрию д2 полностью.
- Crosses [glfg2). Возвращает значение 1, если gl пространственно пересекает д2.<
Возвращает значение NULL, если gl является Polygon или MultiPolygon, или если
д2 является Point или Multipoint. В противном случае возвращается значение 0 - Эти две геометрии пересекаются.
- В результате их пересечения образуется геометрия, значение измерения которой
на один меньше максимального значения измерения обеих данных геометрий. - Их пересечение не равно ни одной из двух данных геометрий.
- Disjoint{gl,g2). Возвращает значение 1 или 0, указывающее, отделена ли про
странственно геометрия gl от геометрии д2 (то есть, пересекает ли она ее или нет).
Distance {gl,д2). Возвращает в виде числа двойной точности значение наимень
шего расстояния между любыми двумя точками в двух геометриях. - Equals {glr g2). Возвращает значение 1 или 0, указывающее, является ли gl про
странственно равной д2. - Intersects {gl,g2). Возвращает значение 1 или 0, указывающее, пересекает ли пространственно геометрия gl геометрию д2
- Overlaps {gl, g2). Возвращает значение 1 или 0, указывающее, перекрывает ли
пространственно геометрия gl геометрию д2. Термин “пространственно перекры
вает” используется, если две геометрии пересекаются и в результате их пересече
ния образуется геометрия такого же измерения, но не равная ни одной из двух
данных геометрий. - Related(gl,g2,pattern_matrix). Возвращает значение 1 или 0, указывающее,
существует ли пространственное соотношение, заданное в patternjnatrix, между
gl и д2. Возвращает значение -1, если аргументы равны NULL. Матрица образцов
pattern_matrix представляет собой строку. Требования для нее будут определе
ны после реализации функции. - Touches {gl,g2). Возвращает значение 1 или 0, указывающее, соприкасается ли
пространственно gl с д2. Две геометрии пространственно соприкасаются, если их
внутренние пространства не пересекаются, но граница одной из геометрий пере
секает либо границу, либо внутреннее пространство другой геометрии. - Within {gl, g2). Возвращает значение 1 или 0, указывающее, находится ли gl про
странственно в пределах д2.
Выражение “пространственно пересекает” обозначает пространственное отношение между двумя данными геометриями, характеризующееся следующими свойствами: