Проблема с оператором пересечений в Postgres - PullRequest
1 голос
/ 13 февраля 2020

У меня есть эта таблица ниже

CREATE TABLE public.geometry_polyline_volume (
    id          serial not null primary key,
    distance    float not null,
    height      float not null,
    coordinates path not null );

Я пытаюсь сделать этот запрос:

SELECT id 
    FROM public.geometry_polyline_volume 
    WHERE box'((15,47),(16,48))' ?# coordinates;

Я получаю эту ошибку:

ERROR:  operator does not exist: box ?# path
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

Как я могу найти, если путь пересекается с полем?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Я не знаком с типами Postgres 'geometryri c, но похоже, что оператор ?# не допускает прямого сравнения между значениями box и path, и, кажется, нет быть автоматическими c, чтобы помочь с этим.

Однако вы можете явно преобразовать box в polygon, а затем преобразовать polygon в path, что вы можете проверить наличие пересечений с другим path:

SELECT id 
  FROM public.geometry_polyline_volume 
  WHERE path(polygon(box'((15,47),(16,48))')) ?# coordinates;

Для справки вы можете проверить поддерживаемые типы ввода для оператора, используя:

select oprleft::regtype::text, oprright::regtype::text
from pg_operator
where oprname = '?#'

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

0 голосов
/ 13 февраля 2020

Я решил это с помощью запроса выше:

SELECT *   FROM public.geometry_polyline_volume    WHERE path(polygon(box'((15,47),(16,48))')) ?# popen(coordinates) or polygon(box'((15,47),(16,48))') @> polygon(coordinates);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...