Поиск

Анализ пространственной информации

После заполнения пространственных столбцов значениями можно делать запросы и анализировать их. MySQL предлагает набор функций для выполнения различных опера­ций над пространственными данными. Эти функции можно разделить на четыре основ­ных категории согласно типу выполняемой ими операции:

  • Функции, которые преобразуют геометрические объекты из одного формата в другой.
  • Функции, которые обеспечивают доступ к качественным или количественным свойствам того или иного геометрического объекта.
  • Функции, которые описывают взаимосвязь между двумя геометриями.
  • Функции, которые создают новые геометрии из уже существующих. Функции пространственного анализа могут использоваться в различных контекстах:
  • В любой интерактивной SQL-программе, подобной mysql или MySQLCC.
  • В прикладных программах, написанных на любом языке, который поддерживает клиентский API-интерфейс MySQL.
Функции преобразования формата геометрических объектов
MySQL поддерживает следующие функции для преобразования формата значений геометрических объектов с внутреннего в WKT- или WKB-формат и наоборот:
  1. AsBinary(д). Преобразует значение во внутреннем геометрическом формате в WKB-формат и возвращает двоичный результат.
  2. 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) |

  1. GeomFromText(wkt[,srid]). Преобразует строковое значение из WKT-формата во внутренний геометрический формат и возвращает результат. Также поддержива ется набор специальных для каждого типа функций, таких как PointFromText() и LineFromText(); см. раздел Создание геометрических значений с помощью WKT-функций
  2. 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 со связанной с ним пространственной ссылкой.
  • mysql> SET Ш = 'LineString(l 1,2 2,3 3)'; mysql> SELECT GLength(GeomFromText (@Is));

  • IsClosed(ls). Возвращает 1, если LineString-значения 25 является замкнутым (то есть значения StartPoint () и EnPoint () совпадают). Возвращает 0, если Is не является замкнутым, и -1, если Is соответствует NULL.
  • mysql> SET Sis - 'LineStringU 1,2 2,3 3)' ; mysql> SELECT IsClosed(GeoraFromText(61s));

  • 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 @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, в соответствии с его размерами в пространственной систе ме координат.
  • 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));

  • ExteriorRing(poly). Возвращает внешнее кольцо Polygon-объекта poly в виде
    LineString.
  • 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)));

  • InteriorRingN(poly,n). Возвращает л-ное внутреннее кольцо для Polygon значения poly в виде LineString. Нумерация колец начинается с 1.

  • 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));

  • NumlnteriorRings {poly). Возвращает количество внутренних колец в Polygon объекте poly.
  • 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
  • Area {mpoly). Возвращает в виде числа двойной точности область MultoPolygon объекта mpoly, в соответствии с его размерами в пространственной системе коор динат.
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.
  • mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2, 3 3))';
    mysql> SELECT AsText(GeometryN(GeomFromText(@gc),1));

  • NumGeometries(gc). Возвращает количество геометрических объектов в GeometryCollection-значении дс.
mysql> SET @gc = 'GeometryCollection(Point(1 1),LineString(2 2,3 3))'; mysql> SELECT NumGeometries(GeomFromText(@gc));

Функции для создания новых геометрий из существующих
Геометрические функции для создания новых геометрий
В разделе Геометрические функцииуже обсуждались некоторые функции, с помощью которых можно создавать новые геометрии из существующих:

  1. Envelope (gr)
  2. StartPoint(Is)
  3. EndPoint(Is)
  4. PointK(ls,n)
  5. ExteriorRing{poly)
  6. InteriorRingN{poly,n)
  7. 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.