| |
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.
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. Обычно используется геометрия, определенная как отметка или набор пунктов (точек), представляющих что-нибудь в мире, что имеет расположение.
Набор типов геометрии, предложенных окружением OGC SQL with Geometry Types основан на OpenGIS Geometry Model. В этой модели каждый геометрический объект имеет следующие общие реквизиты:
Это связано с пространственной системой ссылки, которая описывает координаты места, в котором объект определен.
Это принадлежит некоторому классу геометрии.
Классы геометрии определяют свою иерархию следующим образом:
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 классы.
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
такие же, как
размерности тех элементов, из которых они состоят.
Point
Point
геометрия, которая представляет одиночное
расположение в координатном пространстве.
Примеры Point
Вообразите крупномасштабную карту мира с многими
городами. Объект Point
мог бы представлять каждый город.
На городской карте объект Point
мог бы представлять
автобусную остановку (Stylus советует "bus stop" писать как "останов шины",
зараза с русскими программистами).
Свойства Point
Значение X.
Значение Y.
Point
определена как нуль-мерная геометрия.
Границей Point
является пустой набор.
Curve
Curve
одномерная геометрия, обычно представляемая
последовательностью точек. Специфические подклассы Curve
определяют тип интерполяции между пунктами (точками).
Curve
non-instantiable.
Свойства Curve
Curve
имеет координаты пунктов.
Curve
определена как одномерная геометрия.
Curve
проста, если не проходит через ту же
самую отметку дважды.
Curve
закрыта, если отметка начала равна оконечной точке.
Граница закрытой Curve
пуста.
Граница не закрытой Curve
состоит из
двух оконечных точек.
Curve
, которая является простой и закрытой,
LinearRing
.
LineString
LineString
это Curve
с линейной интерполяцией
между пунктами (точками).
Примеры LineString:
На всемирной карте объекты
LineString
могли бы представлять реки.
В городской карте объекты LineString
могли бы
представлять любые проходы.
Свойства LineString
LineString
имеет координаты сегментов,
определенных каждой последовательной парой пунктов.
LineString
является Line
, если это состоит
из точно двух пунктов.
LineString
является LinearRing
,
если закрыта и проста.
Surface
Surface
двумерная геометрия. Это non-instantiable класс. Есть
instantiable подкласс: Polygon
.
Свойства Surface
Surface
определен как двумерная геометрия.
OpenGIS определяет простой Surface
как геометрию, которая
состоит из одиночной заплаты, связанной с одной внешней границей и нулем или
более внутренними границами.
Граница простого Surface
представляет собой набор
закрытых кривых, соответствующих внешним и внутренним границам.
Polygon
Polygon
плоский вариант Surface
, представляющий
многостороннюю геометрию. Это определено одиночной внешней границей и нулем
или более внутренними границами, где каждая внутренняя граница
определяет отверстие в Polygon
.
Пример Polygon.
На карте области объекты Polygon
могли бы
представлять леса, районы и так далее.
Утверждения Polygon.
Граница Polygon
состоит из набора
объектов LinearRing
(то есть, объектов LineString
,
которые являются простыми и закрытыми), которые составляют
внешние и внутренние границы.
Polygon
не имеет никаких пересечений. Кольца в границе
Polygon
могут пересекаться в Point
, но
только как тангенс.
Polygon
не имеет никаких строк, выбросов или проколов.
Polygon
имеет внутреннюю структуру, которая является
связанным набором отметок.
Polygon
может иметь отверстия. Внешний
Polygon
с отверстиями не связан. Каждое отверстие определяет
связанный компонент внешних.
Предшествующие утверждения делают Polygon
простой геометрией.
GeometryCollection
GeometryCollection
геометрия, которая является совокупностью
одной или большего количества конфигураций любого класса.
Все элементы в GeometryCollection
должны быть в той же самой
пространственной системе ссылки (то есть, в той же самой системе координат).
Не имеется никаких других ограничений на элементы
GeometryCollection
, хотя подклассы
GeometryCollection
, описанных в следующих разделах могут
ограничивать членство. Ограничения могут быть основаны на:
Тип элемента (например, MultiPoint
может содержать только элементы Point
).
Размерность.
Ограничения на степень пространственного перекрытия между элементами.
MultiPoint
MultiPoint
совокупность геометрии, составленная из элементов
Point
. Пункты (точки) всегда не связаны или упорядочены.
Примеры MultiPoint:
На всемирной карте MultiPoint
мог бы
представлять цепочку маленьких изолированных островов.
На городской карте MultiPoint
мог бы представлять выходы.
Свойства MultiPoint
MultiPoint
нульмерная геометрия.
MultiPoint
прост, если никакие два из значений
Point
не равны (имеют идентичные координатные значения).
Граница MultiPoint
пустой набор.
MultiCurve
MultiCurve
совокупность геометрии, составленная из элементов
Curve
. MultiCurve
non-instantiable класс.
Свойства MultiCurve
MultiCurve
одномерная геометрия.
MultiCurve
проста, если (и только если) все элементы
просты. Единственные пересечения между любыми двумя элементами происходят в
пунктах (точках), которые находятся на границах обоих элементов.
Граница MultiCurve
получена, применяя правило
mod 2 union (также известно как правило
odd-even): точка находится в границе
MultiCurve
, если она находится в границах нечетного
числа элементов MultiCurve
.
MultiCurve
закрыта, если все элементы закрыты.
Граница закрытой MultiCurve
всегда пуста.
MultiLineString
MultiLineString
совокупность геометрии
MultiCurve
, составленная из элементов LineString
.
Примеры MultiLineString
На карте области MultiLineString
мог бы
представлять систему рек или систему дорог.
MultiSurface
MultiSurface
совокупность геометрии, составленная из
поверхностных элементов. MultiSurface
non-instantiable класс.
Есть только instantiable подкласс MultiPolygon
.
Утверждения MultiSurface
Две поверхности MultiSurface
не имеют
никаких внутренностей, которые пересекаются.
Два элемента MultiSurface
имеют границы, которые
пересекаются в конечном числе пунктов (точек).
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
.
Этот раздел описывает стандартные пространственные форматы данных, которые используются, чтобы представить объекты геометрии в запросах. Это:
Well-Known Text (WKT).
Well-Known Binary (WKB).
Внутренне MySQL сохраняет значения геометрии в формате, который не идентичен любому формату WKT или WKB.
Представление геометрии 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.
Представление геометрии 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.
Этот раздел описывает типы данных, которые Вы можете использовать для представления пространственных данных в MySQL и функции, доступные для создания и поиска пространственных значений.
MySQL имеет типы данных, которые соответствуют классам OpenGIS. Часть этих типов хранит одиночные значения геометрии:
GEOMETRY
POINT
LINESTRING
POLYGON
GEOMETRY
может сохранять значения геометрии любого типа.
Другие типы с одиночным значением (POINT
,
LINESTRING
и POLYGON
) ограничивают их значения
специфическим типом геометрии.
Другие типы данных хранят совокупности значений:
MULTIPOINT
MULTILINESTRING
MULTIPOLYGON
GEOMETRYCOLLECTION
GEOMETRYCOLLECTION
может сохранять совокупность объектов
любого типа. Другие типы совокупности (MULTIPOINT
,
MULTILINESTRING
, MULTIPOLYGON
и
GEOMETRYCOLLECTION
) ограничивают элементы совокупности
имеющими специфический тип геометрии.
Этот раздел описывает, как создать пространственные значения, использующие функции Well-Known Text и Well-Known Binary, которые определены в стандарте OpenGIS, и применить MySQL-функции.
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
.
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
.
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
.
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;
После того, как Вы создали пространственные столбцы, Вы можете заполнять их пространственными данными.
Значения должны быть сохранены во внутреннем формате геометрии, но Вы можете преобразовывать их в этот формат из 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()
и включать результат в строку
запроса, которая послана серверу.
Значения геометрии, сохраненные в таблице, могут быть выбраны во внутреннем формате. Вы можете также преобразовывать их в формат 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;
После начальной загрузки пространственных столбцов со значениями, Вы готовы сделать запрос и анализировать их. MySQL обеспечивает набор функций, чтобы выполнить различные операции на пространственных данных. Эти функции могут быть сгруппированы в четыре главных категории согласно типу операции, которую они выполняют:
Функции, которые преобразовывают конфигурации между различными форматами.
Функции, которые обеспечивают доступ к качественным или количественным реквизитам геометрии.
Функции, которые описывают отношения между двумя конфигурациями.
Функции, которые создают новые конфигурации из существующих.
Пространственные функции анализа могут использоваться во многих контекстах, типа:
Любая интерактивная программа SQL, типа mysql или MySQL Query Browser.
Прикладные программы, написанные на любом языке, который поддерживает клиентский MySQL API.
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()
.
Geometry
Каждая функция, которая принадлежит к этой группе, берет значение
геометрии как параметр и возвращает некоторое количественное или качественное
свойство геометрии. Некоторые функции ограничивают их тип параметра. Такие
функции возвращают NULL
, если параметр имеет неправильный тип
геометрии. Например, Area()
возвращает NULL
, если
тип объекта не является ни Polygon
, ни MultiPolygon
.
Функции, перечисленные в этом разделе, не ограничивают их параметр и принимают значение геометрии любого типа.
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 геометрического класса, данного ранее в главе включает специфические условия, которые заставляют образец того класса быть классифицированными как не простой.
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 | +----------------------+
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
.
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 | +------------------------------+
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 | +---------------------------------------+
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
.
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.2. Функции Geometry
" обсуждает несколько функций,
которые создают новые конфигурации из существующих.
Envelope(
g
)
StartPoint(
ls
)
EndPoint(
ls
)
PointN(
ls
,N
)
ExteriorRing(
poly
)
InteriorRingN(
poly
,N
)
GeometryN(
gc
,N
)
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
.
Функции, описанные в этих разделах, берут две конфигурации как входные параметры и возвращают качественное или количественное отношение между ними.
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 | +--------------------+--------------------+
Спецификация 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
.
Операции поиска в непространственных базах данных могут быть оптимизированы, используя индексы. Это также истинно для пространственных баз данных. С помощью большого разнообразия многомерных методов индексации, которые предварительно были разработаны, возможно оптимизировать пространственные поиски. Наиболее типично для них:
Запросы точки, которые ищут все объекты, которые содержат данную точку.
Запросы области, которые ищут все объекты, которые накладываются на данную область.
MySQL использует R-деревья с квадратным разбиением, чтобы индексировать пространственные столбцы. Пространственный индекс сформирован, используя MBR геометрии. Для большинства конфигураций MBR минимальный прямоугольник, который окружает конфигурацию. Для горизонтальных или вертикальных linestring MBR прямоугольник, вырождающийся в linestring. Для point MBR является точкой.
Также возможно создать нормальные индексы на пространственных столбцах.
Вам надо объявить префикс для любого непространственного индекса на
пространственном столбце, кроме столбцов POINT
.
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
Оптимизатор исследует, могут ли доступные пространственные индексы
включаться в поиск для запросов, которые используют функцию типа
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)
В будущих выпусках пространственные индексы могут также использоваться для оптимизации других функций.
MySQL еще не выполняет следующие свойства GIS:
Дополнительные просмотры метаданных.
Спецификация OpenGIS предлагает несколько дополнительных просмотров
метаданных. Например, просмотр системы GEOMETRY_COLUMNS
содержит описание столбцов геометрии, одна строка для каждого столбца
геометрии в базе данных.
Функция OpenGIS Length()
на LineString
и
MultiLineString
в настоящее время должна быть вызвана в
MySQL как GLength()
Проблема в том, что имеется существующая SQL-функция
Length()
, которая вычисляет длину строковых значений, и иногда
невозможно различить, вызвана ли функция в текстовом или пространственном
контексте. Это будет со временем как-то решаться.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |