RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Глава 4. Пространственные расширения

MySQL поддерживает пространственные расширения, чтобы позволить хранение и анализ географических свойств. Эти свойства доступны для таблиц типов MyISAM, InnoDB, NDB и ARCHIVE. Однако, тип ARCHIVE не поддерживает индексацию, так что пространственные столбцы в столбцах ARCHIVE не могут быть индексированы. MySQL Cluster также не поддерживает индексацию пространственных столбцов.

Хотя пространственные расширения обеспечиваются в таблицах InnoDB, использование пространственных индексов может вызывать аварийный отказ (Глюк #15860).

Эта глава покрывает следующие темы:

  • Основание этих пространственных расширений в модели геометрии OpenGIS.

  • Форматы для представления пространственных данных.

  • Как использовать пространственные данные в MySQL.

  • Использование индексации для пространственных данных.

  • Отличия MySQL от спецификации OpenGIS.

Дополнительные ресурсы

  • Open Geospatial Consortium издает OpenGIS Simple Features Specifications For SQL, документ, который предлагает несколько концептуальных способов для распространения SQL RDBMS, чтобы поддерживать пространственные данные. Эта спецификация доступна на http://www.opengis.org/docs/99-049.pdf.

  • Если Вы имеете вопросы или интересы относительно использования пространственных расширений MySQL, Вы можете обсуждать их на форуме GIS: http://forums.mysql.com/list.php?23.

4.1. Введение в пространственную поддержку MySQL

MySQL осуществляет пространственные расширения по спецификации Open Geospatial Consortium (OGC). Это международный консорциум более, чем 250 компаний, агентств и университетов, участвующих в разработке публично доступных концептуальных решений, которые могут быть полезны со всеми видами прикладных программ, которые управляют пространственными данными. OGC поддерживает Web-сайт http://www.opengis.org/.

В 1997 Open Geospatial Consortium опубликовал OpenGIS Simple Features Specifications For SQL. Эта спецификация доступна на http://www.opengis.org/docs/99-049.pdf.

MySQL осуществляет подмножество типов SQL with Geometry Types, среду, предложенную OGC. Этот термин относится к SQL-среде, которая была расширена с набором типов геометрии. Оцененный геометрией SQL столбец выполнен как столбец, который имеет тип геометрии. Спецификация описывает набор SQL-типов геометрии также, как функций на этих типах, чтобы создавать и анализировать значения геометрии.

Географическее свойство состоит в том, что есть что-нибудь в мире, имеющее расположение. Свойство может быть:

  • Объект. Например, гора, водоем, город.

  • Пустота. Например, область почтового индекса, тропики.

  • Определимое расположение. Например, дорога, как специфическое место, где два прохода пересекаются.

Некоторые документы используют термин geospatial feature, чтобы обратиться к географическим свойствам.

Geometry другое слово, которое обозначает географическее свойство. Первоначально геометрия означала измерение земли. Другое значение исходит от картографии, оно касается геометрических свойств, которые картографы используют, чтобы отобразить мир.

Эта глава использует все эти условия синонимично: geographic feature, geospatial feature, feature или geometry. Обычно используется геометрия, определенная как отметка или набор пунктов (точек), представляющих что-нибудь в мире, что имеет расположение.

4.2. Модель геометрии OpenGIS

Набор типов геометрии, предложенных окружением OGC SQL with Geometry Types основан на OpenGIS Geometry Model. В этой модели каждый геометрический объект имеет следующие общие реквизиты:

  • Это связано с пространственной системой ссылки, которая описывает координаты места, в котором объект определен.

  • Это принадлежит некоторому классу геометрии.

4.2.1. Иерархия класса геометрии

Классы геометрии определяют свою иерархию следующим образом:

  • Geometry (non-instantiable)

    • Point (instantiable)

    • Curve (non-instantiable)

      • LineString (instantiable)

        • Line

        • LinearRing

    • Surface (non-instantiable)

      • Polygon (instantiable)

    • GeometryCollection (instantiable)

      • MultiPoint (instantiable)

      • MultiCurve (non-instantiable)

        • MultiLineString (instantiable)

      • MultiSurface (non-instantiable)

        • MultiPolygon (instantiable)

Невозможно создать объекты в non-instantiable классах. Возможно создать объекты в классах instantiable. Все классы имеют реквизиты, и классы instantiable могут также иметь утверждения (правила, которые определяют допустимые образцы класса).

Geometry базовый класс. Это абстрактный класс. Подклассы Geometry ограничены нуль-, одно- и двумерными геометрическими объектами, которые существуют в двумерном координатном пространстве. Все instantiable классы геометрии определены так, чтобы допустимые образцы класса были закрытой топологии (то есть, все определенные конфигурации включают их границу).

Основной класс Geometry имеет подклассы для Point, Curve, Surface и GeometryCollection:

  • Point представляет нуль-мерные объекты.

  • Curve представляет одномерные объекты и имеет подкласс LineString с под-подклассами Line и LinearRing.

  • Surface разработан для двумерных объектов и имеет подкласс Polygon.

  • GeometryCollection имеет специальные коллекции для нуль-, одно- и двумерных объектов, известные как MultiPoint, MultiLineString и MultiPolygon для конфигураций моделирования, соответствующих совокупностям Points, LineStrings и Polygons, соответственно. MultiCurve и MultiSurface представляются как абстрактные суперклассы, которые обобщают интерфейсы совокупности, чтобы обработать Curves и Surfaces.

Geometry, Curve, Surface, MultiCurve и MultiSurface определены как non-instantiable классы. Они определяют общий набор методов для их подклассов и включены для расширяемости.

Point, LineString, Polygon, GeometryCollection, MultiPoint, MultiLineString и MultiPolygon instantiable классы.

4.2.2. Класс Geometry

Geometry представляет собой корневой класс иерархии. Это non-instantiable класс, но имеет ряд реквизитов, которые являются общими для всех значении геометрии, созданных любым из подклассов Geometry. Эти реквизиты описаны в следующем списке. Специфические подклассы имеют их собственные специфические реквизиты, описанные позже.

Реквизиты геометрии

Значение геометрии имеет следующие реквизиты:

  • type. Каждая геометрия принадлежит одному из instantiable классов в иерархии.

  • SRID или Spatial Reference Identifier (пространственный идентификатор ссылки). Это значение идентифицирует связанную пространственную систему ссылки геометрии, которая описывает координатное пространство, в котором объект геометрии определен. В MySQL значение SRID только целое число, связанное со значением геометрии. Все вычисления выполнены, принимая Евклидову (плоскую) геометрию.

  • Координата в пространственной системе ссылки, представляемая как числа двойной точности (с восьмью байтами). Все не пустые конфигурации включают по крайней мере одну пару координат (X,Y). Пустые конфигурации не содержат никаких координат.

    Координаты связаны со SRID. Например, в различных системах координат расстояние между двумя объектами может отличаться даже, когда объекты имеют те же самые координаты потому, что расстояние на плоской системе координат и расстояния на геоцентрической системе (на поверхности Земли) разные вещи.

  • Внутренний, граничный и внешний.

    Каждая геометрия занимает некоторую позицию. Внешнее, с точки зрения геометрии, это все место, не занятое геометрией. Внутреннее, соответственно, место, занятое геометрией. Граница находится между внутренним и внешним.

  • MBR (Minimum Bounding Rectangle) или Envelope (минимальный ограничительный прямоугольник, конверт). Это геометрия ограничения, сформированная минимумом и максимумом (X,Y):

    ((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    
  • Является ли значение простым или нет. Значения геометрии типов (LineString, MultiPoint, MultiLineString) являются простыми или не простыми. Каждый тип определяет собственные утверждения, будучи простым или не простым.

  • Закрыто ли значение или нет. Значения геометрии типов (LineString, MultiString) закрыты или не закрыты. Каждый тип определяет собственные утверждения.

  • Является ли значение пустым или не пустым: геометрия пуста, если не имеет никаких точек. Внешний, внутренний и граница пустой геометрии не определены (то есть они представляются значением NULL). Пустая геометрия определена, чтобы быть всегда простой и имеет область 0.

  • Размерность. Геометрия может иметь размерность 0, 1 или 2:

    • 0 для геометрии без длины и никакой области.

    • 1 для геометрии с ненулевой длиной и нулевой областью, а также для пустой геометрии.

    • 2 для геометрии с ненулевой областью.

    Объекты Point имеют размерность 0. Объекты LineString имеют размерность 1. Объекты Polygon имеют размерность 2. Размерности объектов MultiPoint, MultiLineString и MultiPolygon такие же, как размерности тех элементов, из которых они состоят.

4.2.3. Класс Point

Point геометрия, которая представляет одиночное расположение в координатном пространстве.

Примеры Point

  • Вообразите крупномасштабную карту мира с многими городами. Объект Point мог бы представлять каждый город.

  • На городской карте объект Point мог бы представлять автобусную остановку (Stylus советует "bus stop" писать как "останов шины", зараза с русскими программистами).

Свойства Point

  • Значение X.

  • Значение Y.

  • Point определена как нуль-мерная геометрия.

  • Границей Point является пустой набор.

4.2.4. Класс Curve

Curve одномерная геометрия, обычно представляемая последовательностью точек. Специфические подклассы Curve определяют тип интерполяции между пунктами (точками). Curve non-instantiable.

Свойства Curve

  • Curve имеет координаты пунктов.

  • Curve определена как одномерная геометрия.

  • Curve проста, если не проходит через ту же самую отметку дважды.

  • Curve закрыта, если отметка начала равна оконечной точке.

  • Граница закрытой Curve пуста.

  • Граница не закрытой Curve состоит из двух оконечных точек.

  • Curve, которая является простой и закрытой, LinearRing.

4.2.5. Класс LineString

LineString это Curve с линейной интерполяцией между пунктами (точками).

Примеры LineString:

  • На всемирной карте объекты LineString могли бы представлять реки.

  • В городской карте объекты LineString могли бы представлять любые проходы.

Свойства LineString

  • LineString имеет координаты сегментов, определенных каждой последовательной парой пунктов.

  • LineString является Line, если это состоит из точно двух пунктов.

  • LineString является LinearRing, если закрыта и проста.

4.2.6. Класс Surface

Surface двумерная геометрия. Это non-instantiable класс. Есть instantiable подкласс: Polygon.

Свойства Surface

  • Surface определен как двумерная геометрия.

  • OpenGIS определяет простой Surface как геометрию, которая состоит из одиночной заплаты, связанной с одной внешней границей и нулем или более внутренними границами.

  • Граница простого Surface представляет собой набор закрытых кривых, соответствующих внешним и внутренним границам.

4.2.7. Класс Polygon

Polygon плоский вариант Surface, представляющий многостороннюю геометрию. Это определено одиночной внешней границей и нулем или более внутренними границами, где каждая внутренняя граница определяет отверстие в Polygon.

Пример Polygon.

  • На карте области объекты Polygon могли бы представлять леса, районы и так далее.

Утверждения Polygon.

  • Граница Polygon состоит из набора объектов LinearRing (то есть, объектов LineString, которые являются простыми и закрытыми), которые составляют внешние и внутренние границы.

  • Polygon не имеет никаких пересечений. Кольца в границе Polygon могут пересекаться в Point, но только как тангенс.

  • Polygon не имеет никаких строк, выбросов или проколов.

  • Polygon имеет внутреннюю структуру, которая является связанным набором отметок.

  • Polygon может иметь отверстия. Внешний Polygon с отверстиями не связан. Каждое отверстие определяет связанный компонент внешних.

Предшествующие утверждения делают Polygon простой геометрией.

4.2.8. Класс GeometryCollection

GeometryCollection геометрия, которая является совокупностью одной или большего количества конфигураций любого класса.

Все элементы в GeometryCollection должны быть в той же самой пространственной системе ссылки (то есть, в той же самой системе координат). Не имеется никаких других ограничений на элементы GeometryCollection, хотя подклассы GeometryCollection, описанных в следующих разделах могут ограничивать членство. Ограничения могут быть основаны на:

  • Тип элемента (например, MultiPoint может содержать только элементы Point).

  • Размерность.

  • Ограничения на степень пространственного перекрытия между элементами.

4.2.9. Класс MultiPoint

MultiPoint совокупность геометрии, составленная из элементов Point. Пункты (точки) всегда не связаны или упорядочены.

Примеры MultiPoint:

  • На всемирной карте MultiPoint мог бы представлять цепочку маленьких изолированных островов.

  • На городской карте MultiPoint мог бы представлять выходы.

Свойства MultiPoint

  • MultiPoint нульмерная геометрия.

  • MultiPoint прост, если никакие два из значений Point не равны (имеют идентичные координатные значения).

  • Граница MultiPoint пустой набор.

4.2.10. Класс MultiCurve

MultiCurve совокупность геометрии, составленная из элементов Curve. MultiCurve non-instantiable класс.

Свойства MultiCurve

  • MultiCurve одномерная геометрия.

  • MultiCurve проста, если (и только если) все элементы просты. Единственные пересечения между любыми двумя элементами происходят в пунктах (точках), которые находятся на границах обоих элементов.

  • Граница MultiCurve получена, применяя правило mod 2 union (также известно как правило odd-even): точка находится в границе MultiCurve, если она находится в границах нечетного числа элементов MultiCurve.

  • MultiCurve закрыта, если все элементы закрыты.

  • Граница закрытой MultiCurve всегда пуста.

4.2.11. Класс MultiLineString

MultiLineString совокупность геометрии MultiCurve, составленная из элементов LineString.

Примеры MultiLineString

  • На карте области MultiLineString мог бы представлять систему рек или систему дорог.

4.2.12. Класс MultiSurface

MultiSurface совокупность геометрии, составленная из поверхностных элементов. MultiSurface non-instantiable класс. Есть только instantiable подкласс MultiPolygon.

Утверждения MultiSurface

  • Две поверхности MultiSurface не имеют никаких внутренностей, которые пересекаются.

  • Два элемента MultiSurface имеют границы, которые пересекаются в конечном числе пунктов (точек).

4.2.13. Класс MultiPolygon

MultiPolygon объект MultiSurface, составленный из элементов Polygon.

Примеры MultiPolygon

  • На карте области MultiPolygon мог бы представлять систему озер.

Утверждения MultiPolygon

  • MultiPolygon не имеет никаких двух элементов Polygon с внутренностями, которые пересекаются.

  • MultiPolygon не имеет никаких двух элементов Polygon, которые пересекаются (пересечение также запрещается предыдущим утверждением), или же касаются в бесконечном числе (точек).

  • MultiPolygon, возможно, имеет вырезы, выбросы или проколы. MultiPolygon регулярен, закрытый набор отметок.

  • MultiPolygon, который имеет больше чем один Polygon, имеет внутренности, которые не связаны. Число связанных внутренних компонентов MultiPolygon равно числу значений Polygon в MultiPolygon.

Свойства MultiPolygon

  • MultiPolygon двумерная геометрия.

  • Граница MultiPolygon набор закрытых кривых (значения LineString), соответствующих границам элементов Polygon.

  • Каждая Curve в границе MultiPolygon находится в границе точно одного элемента Polygon.

  • Каждая Curve в границе элемента Polygon находится в границе MultiPolygon.

4.3. Обеспечиваемые пространственные форматы данных

Этот раздел описывает стандартные пространственные форматы данных, которые используются, чтобы представить объекты геометрии в запросах. Это:

  • Well-Known Text (WKT).

  • Well-Known Binary (WKB).

Внутренне MySQL сохраняет значения геометрии в формате, который не идентичен любому формату WKT или WKB.

4.3.1. Well-Known Text (WKT)

Представление геометрии Well-Known Text (WKT) разработано, чтобы обмениваться данными геометрии в форме ASCII.

Примеры WKT представлений объектов геометрии:

  • Point:

    POINT(15 20)
    

    Обратите внимание, что отметка определена без отделения запятой.

  • LineString с четырьмя пунктами:

    LINESTRING(0 0, 10 10, 20 25, 50 60)
    

    Обратите внимание, что пары координат отделяются запятыми.

  • Polygon с одним внешним кольцом и одним внутренним кольцом:

    POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))
    
  • MultiPoint с тремя значениями Point:

    MULTIPOINT(0 0, 20 20, 60 60)
    
  • MultiLineString с двумя значениями LineString:

    MULTILINESTRING((10 10, 20 20), (15 15, 30 15))
    
  • MultiPolygon с двумя значениями Polygon:

    MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5)))
    
  • GeometryCollection, состоящий из двух значений Point и одного LineString:

    GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20))
    

Грамматика Backus-Naur, которая определяет формальные правила вывода для записи значений WKT, может быть найдена в спецификации OpenGIS.

4.3.2. Well-Known Binary (WKB)

Представление геометрии Well-Known Binary (WKB) определено спецификацией OpenGIS. Это также определено в ISO SQL/MM Part 3: Spatial standard.

WKB используется, чтобы обмениваться данными геометрии как двоичными потоками, представляемыми значениями BLOB, содержащими геометрическую информацию WKB.

WKB использует однобайтовые целые числа без знака, целые числа без знака с четырьмя байтами и числа двойной точности с восемью байтами (IEEE 754). Байт равен восьми битам.

Например, значение WKB, которое соответствует POINT(1 1) состоит из этой последовательности 21 байтов (каждый представляется здесь двумя шестнадцатеричными цифрами):

0101000000000000000000F03F000000000000F03F

Последовательность может быть разделена на эти компоненты:

Byte order : 01
WKB type : 01000000
X: 000000000000F03F
Y: 000000000000F03F

Представление компонента следующее:

  • Byte order может быть 0 или 1, чтобы указать little-endian или big-endian формат хранения. little-endian и big-endian также известны как Network Data Representation (NDR) и External Data Representation (XDR), соответственно.

  • WKB type задает код, который указывает тип геометрии. Значения от 1 до 7 указывают Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon и GeometryCollection.

  • Значение Point имеет координаты X и Y, каждпя представляемая как значение двойной точности.

WKB-значения для более сложных значений геометрии представляются более сложными структурами данных, как детализировано в спецификации OpenGIS.

4.4. Создание пространственной базы данных MySQL

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

4.4.1. Пространственные типы данных в MySQL

MySQL имеет типы данных, которые соответствуют классам OpenGIS. Часть этих типов хранит одиночные значения геометрии:

  • GEOMETRY

  • POINT

  • LINESTRING

  • POLYGON

GEOMETRY может сохранять значения геометрии любого типа. Другие типы с одиночным значением (POINT, LINESTRING и POLYGON) ограничивают их значения специфическим типом геометрии.

Другие типы данных хранят совокупности значений:

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

GEOMETRYCOLLECTION может сохранять совокупность объектов любого типа. Другие типы совокупности (MULTIPOINT, MULTILINESTRING, MULTIPOLYGON и GEOMETRYCOLLECTION) ограничивают элементы совокупности имеющими специфический тип геометрии.

4.4.2. Создание пространственных значений

Этот раздел описывает, как создать пространственные значения, использующие функции Well-Known Text и Well-Known Binary, которые определены в стандарте OpenGIS, и применить MySQL-функции.

4.4.2.1. Создание значений геометрии через функции WKT

MySQL обеспечивает ряд функций, которые берут как входные параметры представление Well-Known Text и, факультативно, пространственный идентификатор системы ссылки (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(wkt[,srid])

    Создает значение MULTIPOLYGON, использующее WKT представление и SRID.

  • PointFromText(wkt[,srid])

    Создает значение POINT, использующее WKT представление и SRID.

  • PolyFromText(wkt[,srid]), PolygonFromText(wkt[,srid])

    Создает значение POLYGON, использующее WKT представление и SRID.

Спецификация OpenGIS также определяет следующие факультативные функции, которые MySQL не выполняет. Эти функции создают значения Polygon или MultiPolygon, основанные на WKT представлении совокупности колец или закрытых значений LineString. Эти значения могут пересекаться.

  • BdMPolyFromText(wkt,srid)

    Создает значение MultiPolygon из MultiLineString в формате WKT, содержащем произвольную совокупность закрытых значений LineString.

  • BdPolyFromText(wkt,srid)

    Создает значение Polygon из MultiLineString в формате WKT, содержащем произвольную совокупность закрытых значенийLineString.

4.4.2.2. Создание значенией геометрии с помощью функций WKB

MySQL обеспечивает ряд функций, которые берут как входные параметры BLOB, содержащий представление Well-Known Binary и, факультативно, пространственный идентификатор системы ссылки (SRID). Они возвращают соответствующую геометрию.

GeomFromWKB() принимает WKB любого типа геометрии как первый параметр. Реализация также обеспечивает специфические для типа функции для конструкции значений геометрии каждого типа геометрии.

  • GeomCollFromWKB(wkb[,srid]), GeometryCollectionFromWKB(wkb[,srid])

    Создает значение GEOMETRYCOLLECTION, использующее WKB представление и SRID.

  • GeomFromWKB(wkb[,srid]), GeometryFromWKB(wkb[,srid])

    Создает значение геометрии из любого типа, использующего WKB представление и SRID.

  • LineFromWKB(wkb[,srid]), LineStringFromWKB(wkb[,srid])

    Создает значение LINESTRING, использующее WKB представление и SRID.

  • MLineFromWKB(wkb[,srid]), MultiLineStringFromWKB(wkb[,srid])

    Создает значение MULTILINESTRING, использующее WKB представление и SRID.

  • MPointFromWKB(wkb[,srid]), MultiPointFromWKB(wkb[,srid])

    Создает значение MULTIPOINT, использующее WKB представление и SRID.

  • MPolyFromWKB(wkb[,srid]), MultiPolygonFromWKB(wkb[,srid])

    Создает значение MULTIPOLYGON, использующее WKB представление и SRID.

  • PointFromWKB(wkb[,srid])

    Создает значение POINT, использующее WKB представление и SRID.

  • PolyFromWKB(wkb[,srid]), PolygonFromWKB(wkb[,srid])

    Создает значение POLYGON, использующее WKB представление и SRID.

Спецификация OpenGIS также описывает факультативные функции для построения значений Polygon или MultiPolygon, основанных на WKB представлении совокупности колец или закрытых значений LineString. Эти значения могут пересекаться. MySQL не выполняет эти функции:

  • BdMPolyFromWKB(wkb,srid)

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

  • BdPolyFromWKB(wkb,srid)

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

4.4.2.3. Создание геометрии с использованием MySQL-специфических функций

MySQL обеспечивает набор полезных ненормативных функций для создания геометрии с WKB представлениями. Функции, описанные в этом разделе, MySQL-расширения спецификации OpenGIS. Результатами этих функций будут значения BLOB, содержащие WKB-представления значений геометрии без SRID. Результаты этих функций могут заменяться как первый параметр любой функции в функциональном семействе GeomFromWKB().

  • GeometryCollection(g1,g2,...)

    Создает значение WKB GeometryCollection. Если параметры не задают правильно построенное WKB представление геометрии, возвращаемое значение NULL.

  • LineString(pt1,pt2,...)

    Создает значение WKB LineString из ряда WKB параметров Point. Если любой аргумент не задает правильный WKB Point, вернется NULL. Если число параметров Point меньше чем два, возвращаемое значение NULL.

  • MultiLineString(ls1,ls2,...)

    Создает значение WKB MultiLineString, использующее WKB параметры LineString. Если любой параметр не WKB LineString, возвращаемое значение NULL.

  • MultiPoint(pt1,pt2,...)

    Создает значение WKB MultiPoint, использующее WKB параметры Point. Если любой параметр не WKB Point, возвращаемое значение NULL.

  • MultiPolygon(poly1,poly2,...)

    Создает значение WKB MultiPolygon из набора WKB параметров Polygon. Если любой параметр не WKB Polygon, возвращаемое значение NULL.

  • Point(x,y)

    Создает значение WKB Point, используя координаты.

  • Polygon(ls1,ls2,...)

    Создает значение WKB Polygon из ряда WKB параметров LineString. Если любой параметр не представляет WKB LinearRing (то есть не закрытый и простой LineString), возвращаемое значение NULL.

4.4.3. Создание пространственных столбцов

MySQL обеспечивает стандартный способ создания пространственных столбцов для типов геометрии, например, через CREATE TABLE или ALTER TABLE. В настоящее время пространственные столбцы обеспечиваются для таблиц типов MyISAM, InnoDB, NDB и ARCHIVE.

  • Используйте инструкцию CREATE TABLE, чтобы создать таблицу с пространственным столбцом:

    CREATE TABLE geom (g GEOMETRY);
    
  • Используйте инструкцию ALTER TABLE, чтобы добавлять или удалять пространственный столбец в существующей таблице:

    ALTER TABLE geom ADD pt POINT;
    ALTER TABLE geom DROP pt;
    

4.4.4. Начальная загрузка пространственных столбцов

После того, как Вы создали пространственные столбцы, Вы можете заполнять их пространственными данными.

Значения должны быть сохранены во внутреннем формате геометрии, но Вы можете преобразовывать их в этот формат из Well-Known Text (WKT) или из Well-Known Binary (WKB). Следующие примеры показывают, как вставить значения геометрии в таблицу, преобразуя значения WKT во внутренний формат геометрии:

  • Выполните преобразование непосредственно в инструкции INSERT:

    INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
    SET @g = 'POINT(1 1)';
    INSERT INTO geom VALUES (GeomFromText(@g));
    
  • Выполните преобразование до INSERT:

    SET @g = GeomFromText('POINT(1 1)');
    INSERT INTO geom VALUES (@g);
    

Следующие примеры вставляют более сложные конфигурации в таблицу:

SET @g = 'LINESTRING(0 0,1 1,2 2)';
INSERT INTO geom VALUES (GeomFromText(@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 (GeomFromText(@g));
SET @g = 'GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))';
INSERT INTO geom VALUES (GeomFromText(@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(?))
    

    Другие интерфейсы программирования могут поддерживать подобный механизм метки-заполнителя.

  • В программе на C Вы можете выходить из двоичного значения, используя mysql_real_escape_string() и включать результат в строку запроса, которая послана серверу.

4.4.5. Выборка пространственных данных

Значения геометрии, сохраненные в таблице, могут быть выбраны во внутреннем формате. Вы можете также преобразовывать их в формат WKT или WKB.

  • Выборка пространственных данных во внутреннем формате:

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

    CREATE TABLE geom2 (g GEOMETRY) SELECT g FROM geom;
    
  • Выборка пространственных данных в формате WKT:

    Функция AsText() преобразовывает геометрию из внутреннего формата в строку WKT.

    SELECT AsText(g) FROM geom;
    
  • Выборка пространственных данных в формате WKB:

    Функция AsBinary() преобразовывает геометрию из внутреннего формата в BLOB WKB.

    SELECT AsBinary(g) FROM geom;
    

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

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

  • Функции, которые преобразовывают конфигурации между различными форматами.

  • Функции, которые обеспечивают доступ к качественным или количественным реквизитам геометрии.

  • Функции, которые описывают отношения между двумя конфигурациями.

  • Функции, которые создают новые конфигурации из существующих.

Пространственные функции анализа могут использоваться во многих контекстах, типа:

  • Любая интерактивная программа SQL, типа mysql или MySQL Query Browser.

  • Прикладные программы, написанные на любом языке, который поддерживает клиентский MySQL API.

4.5.1. Функции преобразования формата геометрии

MySQL поддерживает следующие функции для преобразования значений геометрии между внутренним форматом и форматом WKT или WKB:

  • AsBinary(g)

    Преобразовывает значение во внутреннем формате геометрии к представлению WKB и возвращает двоичный результат.

    SELECT AsBinary(g) FROM geom;
    
  • AsText(g)

    Преобразовывает значение во внутреннем формате геометрии к представлению WKT и возвращает строковый результат.

    mysql> SET @g = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(GeomFromText(@g));
    +--------------------------+
    | AsText(GeomFromText(@g)) |
    +--------------------------+
    | LINESTRING(1 1,2 2,3 3)  |
    +--------------------------+
    
  • GeomFromText(wkt[,srid])

    Преобразовывает строковое значение из WKT-представления во внутренний формат геометрии и возвращает результат. Ряд специфических для типа функций также обеспечивается, типа PointFromText() и LineFromText().

  • GeomFromWKB(wkb[,srid])

    Преобразовывает двоичное значение из WKB-представления во внутренний формат геометрии и возвращает результат. Ряд специфических для типа функций также обеспечивается, типа PointFromWKB() и LineFromWKB().

Функции 4.5.2. Geometry

Каждая функция, которая принадлежит к этой группе, берет значение геометрии как параметр и возвращает некоторое количественное или качественное свойство геометрии. Некоторые функции ограничивают их тип параметра. Такие функции возвращают NULL, если параметр имеет неправильный тип геометрии. Например, Area() возвращает NULL, если тип объекта не является ни Polygon, ни MultiPolygon.

4.5.2.1. Общие функции геометрии

Функции, перечисленные в этом разделе, не ограничивают их параметр и принимают значение геометрии любого типа.

  • Dimension(g)

    Возвращается свойственная размерность геометрии g. Результат может быть 0, 1 или 2. Смысл этих значений дан в разделе " 4.2.2. Класс Geometry".

    mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));
    +------------------------------------------------+
    | Dimension(GeomFromText('LineString(1 1,2 2)')) |
    +------------------------------------------------+
    | 1                                              |
    +------------------------------------------------+
    
  • Envelope(g)

    Возвращается минимальный ограничительный прямоугольник (MBR) для геометрии g. Результат возвращен как значение Polygon.

    Многоугольник определен пунктами (точками) угла блока ограничения:

    POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)')));
    +-------------------------------------------------------+
    | AsText(Envelope(GeomFromText('LineString(1 1,2 2)'))) |
    +-------------------------------------------------------+
    | POLYGON((1 1,2 1,2 2,1 2,1 1))                        |
    +-------------------------------------------------------+
    
  • GeometryType(g)

    Возвращает как строку имя типа геометрии, образец которой является членом g. Имя соответствует одному из instantiable подклассов Geometry.

    mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
    +------------------------------------------+
    | GeometryType(GeomFromText('POINT(1 1)')) |
    +------------------------------------------+
    | POINT                                    |
    +------------------------------------------+
    
  • SRID(g)

    Возвращается целое число, указывающее пространственный ID системы ссылки для геометрии g.

    В MySQL значение SRID только целое число, связанное со значением геометрии. Все вычисления выполнены, принимая евклидову (плоскую) геометрию.

    mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)',101));
    +-----------------------------------------------+
    | SRID(GeomFromText('LineString(1 1,2 2)',101)) |
    +-----------------------------------------------+
    | 101                                           |
    +-----------------------------------------------+
    

Спецификация OpenGIS также определяет следующие функции, которые MySQL не выполняет:

  • Boundary(g)

    Возвращает геометрию, которая является замкнутым выражением комбинаторной границы геометрии g.

  • IsEmpty(g)

    Возвращается 1, если геометрия g пустая геометрия, 0, если это не пусто, и 1, если параметр NULL. Если геометрия пуста, это представляет пустой набор точек.

  • IsSimple(g)

    В настоящее время эта функция не должна использоваться. Если выполнено, поведение будет как описано в следующем параграфе.

    Возвращается 1, если геометрия g не имеет никаких аномальных геометрических пунктов (точек), типа самопересечения или самокасания. IsSimple() возвращает 0, если параметр не прост, и 1, если он NULL.

    Описание каждого instantiable геометрического класса, данного ранее в главе включает специфические условия, которые заставляют образец того класса быть классифицированными как не простой.

4.5.2.2. Функции Point

Point состоит из координат X и Y, которые могут быть получены, используя следующие функции:

  • X(p)

    Возвращает значение X-координаты для p как число двойной точности.

    mysql> SET @pt = 'Point(56.7 53.34)';
    mysql> SELECT X(GeomFromText(@pt));
    +----------------------+
    | X(GeomFromText(@pt)) |
    +----------------------+
    | 56.7                 |
    +----------------------+
    
  • Y(p)

    Возвращает значение Y-координаты для p как число двойной точности.

    mysql> SET @pt = 'Point(56.7 53.34)';
    mysql> SELECT Y(GeomFromText(@pt));
    +----------------------+
    | Y(GeomFromText(@pt)) |
    +----------------------+
    | 53.34                |
    +----------------------+
    

4.5.2.3. Функции LineString

LineString состоит из значений Point. Вы можете извлекать специфические пункты (точки) LineString, считать число точек объекта или получать длину.

  • EndPoint(ls)

    Возвращает Point, которая является оконечной точкой значения LineString ls.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(EndPoint(GeomFromText(@ls)));
    +-------------------------------------+
    | AsText(EndPoint(GeomFromText(@ls))) |
    +-------------------------------------+
    | POINT(3 3)                          |
    +-------------------------------------+
    
  • GLength(ls)

    Возвращает как число двойной точности длина значение LineString ls в связанной пространственной ссылке.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT GLength(GeomFromText(@ls));
    +----------------------------+
    | GLength(GeomFromText(@ls)) |
    +----------------------------+
    | 2.8284271247462            |
    +----------------------------+
    

    GLength() ненормативное имя. Это передает данные функции OpenGIS Length().

  • NumPoints(ls)

    Возвращает число объектов Point в the LineString ls.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT NumPoints(GeomFromText(@ls));
    +------------------------------+
    | NumPoints(GeomFromText(@ls)) |
    +------------------------------+
    | 3                            |
    +------------------------------+
    
  • PointN(ls,N)

    Возвращает N-ый Point в Linestring ls. Точки пронумерованы, начиная с 1.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(PointN(GeomFromText(@ls),2));
    +-------------------------------------+
    | AsText(PointN(GeomFromText(@ls),2)) |
    +-------------------------------------+
    | POINT(2 2)                          |
    +-------------------------------------+
    
  • StartPoint(ls)

    Возвращает Point, которая является отметкой начала значения point of the LineString ls.

    mysql> SET @ls = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(StartPoint(GeomFromText(@ls)));
    +---------------------------------------+
    | AsText(StartPoint(GeomFromText(@ls))) |
    +---------------------------------------+
    | POINT(1 1)                            |
    +---------------------------------------+
    

Спецификация OpenGIS также определяет следующую функцию, которую MySQL не выполняет:

  • IsRing(ls)

    Возвращает 1, если значение LineString value ls закрыто (то есть, значения StartPoint() и EndPoint() те же самые) и просто (не проходит через ту же самую точку больше, чем один раз). Возвращается 0, если ls не кольцо, и 1, если это NULL.

4.5.2.4. Функции MultiLineString

  • GLength(mls)

    Возвращает как число двойной точности длину значения MultiLineString mls. Длина mls равна сумме длин элементов.

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    mysql> SELECT GLength(GeomFromText(@mls));
    +-----------------------------+
    | GLength(GeomFromText(@mls)) |
    +-----------------------------+
    | 4.2426406871193             |
    +-----------------------------+
    

    GLength() ненормативное имя. Это передает данные функции OpenGIS Length().

  • IsClosed(mls)

    Возвращает 1, если значение MultiLineString mls закрыто (то есть, значения StartPoint() и EndPoint() равны для каждого LineString в mls). Возвращает 0, если mls не закрыт, и 1, если это NULL.

    mysql> SET @mls = 'MultiLineString((1 1,2 2,3 3),(4 4,5 5))';
    mysql> SELECT IsClosed(GeomFromText(@mls));
    +------------------------------+
    | IsClosed(GeomFromText(@mls)) |
    +------------------------------+
    | 0                            |
    +------------------------------+
    

4.5.2.5. Функции Polygon

  • Area(poly)

    Возвращает как число двойной точности область значения Polygon poly, как измеряется в пространственной системе ссылки.

    mysql> SET @poly = 'Polygon((0 0,0 3,3 0,0 0),(1 1,1 2,2 1,1 1))';
    mysql> SELECT Area(GeomFromText(@poly));
    +---------------------------+
    | Area(GeomFromText(@poly)) |
    +---------------------------+
    | 4                         |
    +---------------------------+
    
  • 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 1))';
    mysql> SELECT AsText(ExteriorRing(GeomFromText(@poly)));
    +-------------------------------------------+
    | AsText(ExteriorRing(GeomFromText(@poly))) |
    +-------------------------------------------+
    | LINESTRING(0 0,0 3,3 3,3 0,0 0)           |
    +-------------------------------------------+
    
  • InteriorRingN(poly,N)

    Возвращает 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 1))';
    mysql> SELECT AsText(InteriorRingN(GeomFromText(@poly),1));
    +----------------------------------------------+
    | AsText(InteriorRingN(GeomFromText(@poly),1)) |
    +----------------------------------------------+
    | LINESTRING(1 1,1 2,2 2,2 1,1 1)              |
    +----------------------------------------------+
    
  • NumInteriorRings(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 NumInteriorRings(GeomFromText(@poly));
    +---------------------------------------+
    | NumInteriorRings(GeomFromText(@poly)) |
    +---------------------------------------+
    | 1                                     |
    +---------------------------------------+
    

4.5.2.6. Функции MultiPolygon

  • Area(mpoly)

    Возвращает как число двойной точности область значения MultiPolygon mpoly, как измеряется в пространственной системе ссылки.

    mysql> SET @mpoly =
        ->     'MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))';
    mysql> SELECT Area(GeomFromText(@mpoly));
    +----------------------------+
    | Area(GeomFromText(@mpoly)) |
    +----------------------------+
    | 8                          |
    +----------------------------+
    

Спецификация OpenGIS также определяет следующие функции, которые MySQL не выполняет:

  • Centroid(mpoly)

    Возвращает математический центр для значения MultiPolygon mpoly как Point. Не гарантируется, что результат будет в MultiPolygon.

  • PointOnSurface(mpoly)

    Возвращает значение Point, которое гарантированно будет в значении MultiPolygon mpoly.

4.5.2.7. Функции GeometryCollection

  • GeometryN(gc,N)

    Возвращает N-ую геометрию в значении GeometryCollection gc. Конфигурации пронумерованы, начиная с 1.

    mysql> SET @gc = 'GeometryCollection(Point(1 1), LineString(2 2, 3 3))';
    mysql> SELECT AsText(GeometryN(GeomFromText(@gc), 1));
    +----------------------------------------+
    | AsText(GeometryN(GeomFromText(@gc), 1))|
    +----------------------------------------+
    | POINT(1 1)                             |
    +----------------------------------------+
    
  • NumGeometries(gc)

    Возвращает число конфигураций в значении GeometryCollection gc.

    mysql> SET @gc = 'GeometryCollection(Point(1 1), LineString(2 2, 3 3))';
    mysql> SELECT NumGeometries(GeomFromText(@gc));
    +----------------------------------+
    | NumGeometries(GeomFromText(@gc)) |
    +----------------------------------+
    | 2                                |
    +----------------------------------+
    

4.5.3. Функции, которые создают новые конфигурации из существующих

4.5.3.1. Функции геометрии, которые производят новые конфигурации

Раздел "4.5.2. Функции Geometry" обсуждает несколько функций, которые создают новые конфигурации из существующих.

  • Envelope(g)

  • StartPoint(ls)

  • EndPoint(ls)

  • PointN(ls,N)

  • ExteriorRing(poly)

  • InteriorRingN(poly,N )

  • GeometryN(gc,N)

4.5.3.2. Пространственные операторы

OpenGIS предлагает ряд других функций, которые могут производить конфигурации. Они разработаны, чтобы выполнить пространственные операторы.

Эти функции не выполнены в MySQL. Они могут появляться в будущих выпусках.

  • Buffer(g,d)

    Возвращает геометрию, которая представляет все пункты (точки), чьи расстояния от геометрии g меньше или равны расстоянию d.

  • ConvexHull(g)

    Возвращает геометрию, которая представляет выпуклую оболочку геометрии g.

  • Difference(g1,g2)

    Возвращает геометрию, которая представляет разность множеств точек значения геометрий g1 и g2.

  • Intersection(g1,g2)

    Возвращает геометрию, которая представляет пересечение набора точек геометрий g1 и g2.

  • SymDifference(g1,g2)

    Возвращает геометрию, которая представляет набор точек, симметричных разнице значений геометрий g1 и g2.

  • Union(g1,g2)

    Возвращает геометрию, которая представляет объединение набора точек значений геометрии g1 и g2.

4.5.4. Функции для тестирования пространственных отношений между геометрическими объектами

Функции, описанные в этих разделах, берут две конфигурации как входные параметры и возвращают качественное или количественное отношение между ними.

4.5.5. Отношения на геометрии: минимальные ограничительные прямоугольники (MBR)

MySQL обеспечивает несколько функций, которые проверяют отношения между минимальными ограничительными прямоугольниками двух конфигураций g1 и g2. Возвращаемые значения 1 и 0 указывают истину и ложь соответственно.

  • MBRContains(g1,g2)

    Возвращает 1 или 0, чтобы указать, содержит ли минимальный ограничительный прямоугольник g1 минимальный ограничительный прямоугольник g2.

    mysql> SET @g1 = GeomFromText('Polygon((0 0, 0 3, 3 3, 3 0, 0 0))');
    mysql> SET @g2 = GeomFromText('Point(1 1)');
    mysql> SELECT MBRContains(@g1, @g2), MBRContains(@g2, @g1);
    +----------------------+----------------------+
    | MBRContains(@g1, @g2)| MBRContains(@g2, @g1)|
    +----------------------+----------------------+
    | 1                    | 0                    |
    +----------------------+----------------------+
    
  • MBRDisjoint(g1,g2)

    Возвращает 1 или 0, чтобы указать, являются ли минимальные ограничительные прямоугольники двух конфигураций g1 и g2 непересекающимися.

  • MBREqual(g1,g2)

    Возвращает 1 или 0, чтобы указать, являются ли минимальные ограничительные прямоугольники двух конфигураций g1 и g2 тем же самым.

  • MBRIntersects(g1,g2)

    Возвращает 1 или 0, чтобы указать, пересекаются ли минимальные ограничительные прямоугольники двух конфигураций g1 и g2.

  • MBROverlaps(g1,g2)

    Возвращает 1 или 0, чтобы указать, накладываются ли минимальные ограничительные прямоугольники g1 и g2.

  • MBRTouches(g1,g2)

    Возвращает 1 или 0, чтобы указать, касаются ли минимальные ограничительные прямоугольники g1 и g2.

  • MBRWithin(g1,g2)

    Возвращает 1 или 0, чтобы указать, является ли минимальный ограничительный прямоугольник g1 внутренним для минимального ограничительного прямоугольника g2.

    mysql> SET @g1 = 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(@g1, @g2), MBRWithin(@g2, @g1);
    +--------------------+--------------------+
    | MBRWithin(@g1, @g2)| MBRWithin(@g2, @g1)|
    +--------------------+--------------------+
    | 1                  | 0                  |
    +--------------------+--------------------+
    

4.5.6. Функции, которые проверяют пространственные связи между конфигурациями

Спецификация OpenGIS определяет следующие функции. Они проверяют связь между двумя значениями геометрии g1 и g2.

В настоящее время MySQL не выполняет эти функции согласно спецификации. Которые выполнены, возвратят тот же самый результат, что и соответствующие MBR-функции. Это включает функции в следующем списке. Эти функции могут быть выполнены в будущих выпусках с полной поддержкой для пространственного анализа, а не только MBR-поддержки.

  • Contains(g1,g2)

    Возвращает 1 или 0, чтобы указать, содержит ли g1 полностью g2.

  • Crosses(g1,g2)

    Возвращает 1, если g1 пространственно пересекает g2. Возвращает NULL, если g1 Polygon или MultiPolygon, либо если g2 Point или MultiPoint. Иначе возвращает 0.

    Термин "пространственно пересекается", обозначает пространственное отношение между двумя данными конфигурациями, которые имеют следующие реквизиты:

    • Две конфигурации пересекаются.

    • Их пересечение приводит к геометрии, которая имеет размерность, которая на единицу меньше, чем максимальная размерность двух данных конфигураций.

    • Их пересечение не равно любой из двух данных конфигураций.

  • Disjoint(g1,g2)

    Возвращается 1 или 0, чтобы указать, является ли g1 пространственно непересекающейся с g2.

  • Distance(g1,g2)

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

  • Equals(g1,g2)

    Возвращает 1 или 0, чтобы указать, является ли g1 пространственно равной g2.

  • Intersects(g1,g2)

    Возвращает 1 или 0, чтобы указать, пересекает ли g1 пространственно g2.

  • Overlaps(g1,g2)

    Возвращает 1 или 0, чтобы указать, накладывается ли g1 пространственно на g2. Термин "пространственно накладывается" используется, если две конфигурации пересекаются, и их пересечение приводит к геометрии той же самой размерности, но не равной любой из данных конфигураций.

  • Related(g1,g2,pattern_matrix )

    Возвращает 1 или 0, чтобы указать, существует ли пространственная связь, определенная pattern_matrix между g1 и g2. Возвращает 1, если параметры NULL. Матрица образцов является строкой. Спецификация будет отмечена здесь, если эта функция выполнена.

  • Touches(g1,g2)

    Возвращается 1 или 0, чтобы указать, касается ли g1 пространственно g2. Две конфигурации пространственно касаются, если внутренности конфигураций не пересекаются, но граница одной из конфигураций пересекает границу или внутренность другой.

  • Within(g1,g2)

    Возвращается 1 или 0, чтобы указать, является ли g1 пространственно внутри g2.

4.6. Оптимизация пространственного анализа

Операции поиска в непространственных базах данных могут быть оптимизированы, используя индексы. Это также истинно для пространственных баз данных. С помощью большого разнообразия многомерных методов индексации, которые предварительно были разработаны, возможно оптимизировать пространственные поиски. Наиболее типично для них:

  • Запросы точки, которые ищут все объекты, которые содержат данную точку.

  • Запросы области, которые ищут все объекты, которые накладываются на данную область.

MySQL использует R-деревья с квадратным разбиением, чтобы индексировать пространственные столбцы. Пространственный индекс сформирован, используя MBR геометрии. Для большинства конфигураций MBR минимальный прямоугольник, который окружает конфигурацию. Для горизонтальных или вертикальных linestring MBR прямоугольник, вырождающийся в linestring. Для point MBR является точкой.

Также возможно создать нормальные индексы на пространственных столбцах. Вам надо объявить префикс для любого непространственного индекса на пространственном столбце, кроме столбцов POINT.

4.6.1. Создание пространственных индексов

MySQL может создавать пространственные индексы, использующие синтаксис, подобный аналогичному для создания регулярных индексов, но расширенный с ключевым словом SPATIAL. В настоящее время пространственные столбцы, которые индексированы, должны быть объявлены как NOT NULL. Следующие примеры показывают, как создавать пространственные индексы:

  • С CREATE TABLE:

    CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g));
    
  • С ALTER TABLE:

    ALTER TABLE geom ADD SPATIAL INDEX(g);
    
  • С CREATE INDEX:

    CREATE SPATIAL INDEX sp_index ON geom (g);
    

Для таблиц MyISAM SPATIAL INDEX создает индекс R-tree. Для других типов памяти, которые поддерживают пространственную индексацию, SPATIAL INDEX создает индекс B-tree. B-tree на пространственных значениях будет полезен для поисковых таблиц с точным значением, но не для диапазона.

Для удаления пространственного индекса, используйте ALTER TABLE или DROP INDEX:

  • С ALTER TABLE:

    ALTER TABLE geom DROP INDEX g;
    
  • С DROP INDEX:

    DROP INDEX sp_index ON geom;
    

Пример: Предположите, что таблица geom содержит больше, чем 32000 конфигурации, которые сохранены в столбце g типа GEOMETRY. Таблица также имеет столбец AUTO_INCREMENT fid для сохранения значений объекта ID.

mysql> DESCRIBE geom;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| fid   | int(11)  |      | PRI | NULL    | auto_increment |
| g     | geometry |      |     |         |                |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> SELECT COUNT(*) FROM geom;
+----------+
| count(*) |
+----------+
| 32376    |
+----------+
1 row in set (0.00 sec)

Чтобы добавлять пространственный индекс на столбце g, используйте эту инструкцию:

mysql> ALTER TABLE geom ADD SPATIAL INDEX(g);
Query OK, 32376 rows affected (4.05 sec)
Records: 32376 Duplicates: 0 Warnings: 0

4.6.2. Использование пространственного индекса

Оптимизатор исследует, могут ли доступные пространственные индексы включаться в поиск для запросов, которые используют функцию типа MBRContains() или MBRWithin() в предложении WHERE. Следующий запрос находит все объекты, которые находятся в данном прямоугольнике:

mysql> SET @poly = 'Polygon((30000 15000, 31000 15000, 31000 16000,
    ->                       30000 16000, 30000 15000))';
mysql> SELECT fid, AsText(g) FROM geom WHERE
    ->        MBRContains(GeomFromText(@poly), g);
+-----+---------------------------------------------------------------+
| fid | AsText(g)                                                     |
+-----+---------------------------------------------------------------+
|  21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30 ... |
|  22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8, ... |
|  23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4, ... |
|  24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4, ... |
|  25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882. ... |
|  26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4, ... |
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946. ... |
|   1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136. ... |
|   2 | LINESTRING(30220.2 15122.8,3024.2 15137.8,30207.6 15136, ... |
|   3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,3016 ... |
|   4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30 ... |
|   5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4, ... |
|   6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,3024 ... |
|   7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8, ... |
|  10 | LINESTRING(30179.6 1504.8,30181 15002.8,30190.8 15003.6, ... |
|  11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2, ... |
|  13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,3011 ... |
| 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30 ... |
| 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30 ... |
| 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4, ... |
+-----+---------------------------------------------------------------+
20 rows in set (0.00 sec)

Использование EXPLAIN показывает, каким способом этот запрос выполнен:

mysql> SET @poly = 'Polygon((30000 15000, 31000 15000,
    ->                       31000 16000, 30000 16000, 30000 15000))';
mysql> EXPLAIN SELECT fid, AsText(g) FROM geom WHERE
    ->         MBRContains(GeomFromText(@poly), g)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: geom
type: range
possible_keys: g
key: g
key_len: 32
ref: NULL
rows: 50
Extra: Using where
1 row in set (0.00 sec)

Проверьте, что случилось бы без пространственного индекса:

mysql> SET @poly = 'Polygon((30000 15000, 31000 15000,
    ->                       31000 16000, 30000 16000, 30000 15000))';
mysql> EXPLAIN SELECT fid,AsText(g) FROM g IGNORE INDEX (g) WHERE
    ->         MBRContains(GeomFromText(@poly), g)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: geom
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 32376
Extra: Using where
1 row in set (0.00 sec)

Выполнение инструкции SELECT без пространственного индекса выдает тот же самый результат, но заставляет время выполнения повышаться с 0.00 до 0.46 секунды:

mysql> SET @poly = 'Polygon((30000 15000, 31000 15000,
    ->                       31000 16000, 30000 16000, 30000 15000))';
mysql> SELECT fid, AsText(g) FROM geom IGNORE INDEX (g) WHERE
    ->        MBRContains(GeomFromText(@poly), g);
+-----+---------------------------------------------------------------+
| fid | AsText(g)                                                     |
+-----+---------------------------------------------------------------+
|   1 | LINESTRING(30250.4 15129.2,30248.8 15138.4,30238.2 15136. ... |
|   2 | LINESTRING(30220.2 15122.8,3024.2 15137.8,30207.6 15136, ... |
|   3 | LINESTRING(30179 15114.4,30176.6 15129.4,30167 15128,3016 ... |
|   4 | LINESTRING(30155.2 15121.4,30140.4 15118.6,30142 15109,30 ... |
|   5 | LINESTRING(30192.4 15085,30177.6 15082.2,30179.2 15072.4, ... |
|   6 | LINESTRING(30244 15087,30229 15086.2,30229.4 15076.4,3024 ... |
|   7 | LINESTRING(30200.6 15059.4,30185.6 15058.6,30186 15048.8, ... |
|  10 | LINESTRING(30179.6 1504.8,30181 15002.8,30190.8 15003.6, ... |
|  11 | LINESTRING(30154.2 15000.4,30168.6 15004.8,30166 15014.2, ... |
|  13 | LINESTRING(30105 15065.8,30108.4 15050.8,30118 15053,3011 ... |
|  21 | LINESTRING(30350.4 15828.8,30350.6 15845,30333.8 15845,30 ... |
|  22 | LINESTRING(30350.6 15871.4,30350.6 15887.8,30334 15887.8, ... |
|  23 | LINESTRING(30350.6 15914.2,30350.6 15930.4,30334 15930.4, ... |
|  24 | LINESTRING(30290.2 15823,30290.2 15839.4,30273.4 15839.4, ... |
|  25 | LINESTRING(30291.4 15866.2,30291.6 15882.4,30274.8 15882. ... |
|  26 | LINESTRING(30291.6 15918.2,30291.6 15934.4,30275 15934.4, ... |
| 154 | LINESTRING(30276.2 15143.8,30261.4 15141,30263 15131.4,30 ... |
| 155 | LINESTRING(30269.8 15084,30269.4 15093.4,30258.6 15093,30 ... |
| 157 | LINESTRING(30128.2 15011,30113.2 15010.2,30113.6 15000.4, ... |
| 249 | LINESTRING(30337.8 15938.6,30337.8 15946.8,30320.4 15946. ... |
+-----+---------------------------------------------------------------+
20 rows in set (0.46 sec)

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

4.7. MySQL: согласованность и совместимость

MySQL еще не выполняет следующие свойства GIS:

  • Дополнительные просмотры метаданных.

    Спецификация OpenGIS предлагает несколько дополнительных просмотров метаданных. Например, просмотр системы GEOMETRY_COLUMNS содержит описание столбцов геометрии, одна строка для каждого столбца геометрии в базе данных.

  • Функция OpenGIS Length() на LineString и MultiLineString в настоящее время должна быть вызвана в MySQL как GLength()

    Проблема в том, что имеется существующая SQL-функция Length(), которая вычисляет длину строковых значений, и иногда невозможно различить, вызвана ли функция в текстовом или пространственном контексте. Это будет со временем как-то решаться.

Поиск

 

Найди своих коллег!