Операторы геометрииCompatible with Milvus 2.6.4+

Milvus поддерживает набор операторов для пространственной фильтрации по полям GEOMETRY, которые необходимы для управления и анализа геометрических данных. Эти операторы позволяют извлекать сущности на основе геометрических отношений между объектами.

Все операторы геометрии принимают два геометрических аргумента: имя поля GEOMETRY, определенное в схеме вашей коллекции, и целевой геометрический объект, представленный в формате Well-Known Text (WKT).

Синтаксис использования

Для фильтрации по полю GEOMETRY используйте геометрический оператор в выражении:

  • Общие: {operator}(geo_field, '{wkt}')

  • На основе расстояния: ST_DWITHIN(geo_field, '{wkt}', distance)

Где:

  • operator один из поддерживаемых геометрических операторов (например, ST_CONTAINS, ST_INTERSECTS). Имена операторов должны быть полностью прописными или полностью строчными. Список поддерживаемых операторов см. в разделе Поддерживаемые операторы геометрии.

  • geo_field это имя вашего поля GEOMETRY.

  • '{wkt}' WKT-представление геометрии для запроса.

  • distance порог специально для ST_DWITHIN.

Чтобы узнать больше о полях GEOMETRY в Milvus, обратитесь к разделу Поле геометрии.

Поддерживаемые операторы геометрии

В следующей таблице перечислены операторы геометрии, доступные в Milvus.

Имена операторов должны быть полностью прописными или полностью строчными. Не смешивайте регистры в имени одного оператора.

Оператор

Описание

Пример

ST_EQUALS(A, B) / st_equals(A, B)

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

Являются ли две геометрии (A и B) абсолютно одинаковыми в пространстве?

ST_CONTAINS(A, B) / st_contains(A, B)

Возвращает TRUE, если геометрия A полностью содержит геометрию B, причем их внутренности имеют хотя бы одну общую точку.

Содержит ли городская черта (A) определенный парк (B)?

ST_CROSSES(A, B) / st_crosses(A, B)

Возвращает TRUE, если геометрии A и B частично пересекаются, но не полностью содержат друг друга.

Пересекаются ли две дороги (A и B) на перекрестке?

ST_INTERSECTS(A, B) / st_intersects(A, B)

Возвращает TRUE, если геометрии A и B имеют хотя бы одну общую точку. Это наиболее общий и широко используемый пространственный запрос.

Пересекается ли область поиска (A) с любым из мест расположения магазинов (B)?

ST_OVERLAPS(A, B) / st_overlaps(A, B)

Возвращает TRUE, если геометрии A и B имеют одинаковое измерение, частично пересекаются и ни одна из них полностью не содержит другую.

Пересекаются ли два земельных участка (A и B)?

ST_TOUCHES(A, B) / st_touches(A, B)

Возвращает TRUE, если геометрии A и B имеют общую границу, но их внутренности не пересекаются.

Имеют ли две соседние недвижимости (A и B) общую границу?

ST_WITHIN(A, B) / st_within(A, B)

Возвращает TRUE, если геометрия A полностью содержится в геометрии B, а их интерьеры имеют хотя бы одну общую точку. Это обратная функция ST_Contains(B, A).

Находится ли определенная точка интереса (A) в пределах заданного радиуса поиска (B)?

ST_DWITHIN(A, B, distance) / st_dwithin(A, B, distance)

Возвращает TRUE, если расстояние между геометрией A и геометрией B меньше или равно указанному расстоянию.

Примечание: Геометрия B в настоящее время поддерживает только точки. Единицей измерения расстояния являются метры.

Найти все точки в пределах 5000 метров от определенной точки (B).

ST_EQUALS / st_equals

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

Пример

Предположим, вам нужно проверить, является ли сохраненная геометрия (например, точка или многоугольник) точно такой же, как целевая геометрия. Например, можно сравнить сохраненную точку с конкретной точкой интереса.

# The filter expression to check if a geometry matches a specific point
filter = "ST_EQUALS(geo_field, 'POINT(10 20)')"

ST_CONTAINS / st_contains

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

Пример

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

# The filter expression to find geometries completely within a specific polygon.
filter = "ST_CONTAINS(geo_field, 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')"

ST_CROSSES / st_crosses

Оператор ST_CROSSES возвращает TRUE, если пересечение двух геометрий образует геометрию с меньшей размерностью, чем исходные геометрии. Обычно это относится к линии, пересекающей многоугольник или другую линию.

Пример

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

# The filter expression to find geometries that cross a line string.
filter = "ST_CROSSES(geo_field, 'LINESTRING(5 0, 5 10)')"

ST_INTERSECTS / st_intersects

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

Пример

Если у вас есть коллекция дорог, и вы хотите найти все дороги, которые пересекают или касаются определенной строки, представляющей предлагаемую новую дорогу, вы можете использовать ST_INTERSECTS.

# The filter expression to find geometries that intersect with a specific line string.
filter = "ST_INTERSECTS(geo_field, 'LINESTRING (1 1, 2 2)')"

ST_OVERLAPS / st_overlaps

Оператор ST_OVERLAPS возвращает TRUE, если две геометрии одной размерности имеют частичное пересечение, где само пересечение имеет ту же размерность, что и исходные геометрии, но не равно ни одной из них.

Пример

У вас есть набор пересекающихся регионов продаж, и вы хотите найти все регионы, которые частично пересекаются с новой предлагаемой зоной продаж.

# The filter expression to find geometries that partially overlap with a polygon.
filter = "ST_OVERLAPS(geo_field, 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')"

ST_TOUCHES / st_touches

Оператор ST_TOUCHES возвращает TRUE, если границы двух геометрий соприкасаются, но их внутренности не пересекаются. Это полезно для определения смежности.

Пример

Если у вас есть карта участков недвижимости и вы хотите найти все участки, которые непосредственно примыкают к общественному парку без каких-либо пересечений.

# The filter expression to find geometries that only touch a line string at their boundaries.
filter = "ST_TOUCHES(geo_field, 'LINESTRING(0 0, 1 1)')"

ST_WITHIN / st_within

Оператор ST_WITHIN возвращает TRUE, если первая геометрия полностью находится внутри или на границе второй геометрии. Он является обратным оператору ST_CONTAINS.

Пример

Вам нужно найти все небольшие жилые районы, которые полностью расположены в пределах более крупной парковой зоны.

# The filter expression to find geometries that are completely within a larger polygon.
filter = "ST_WITHIN(geo_field, 'POLYGON((110 38, 115 38, 115 42, 110 42, 110 38))')"

Дополнительные сведения о том, как использовать поле GEOMETRY, см. в разделе Поле геометрии.

ST_DWITHIN / st_dwithin

Оператор ST_DWITHIN возвращает TRUE, если расстояние между геометрией A и геометрией B меньше или равно заданному значению (в метрах). В настоящее время геометрия B должна быть точкой.

Пример

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

# Find all stores within 5000 meters of the point (120 30)
filter = "ST_DWITHIN(geo_field, 'POINT(120 30)', 5000)"

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?