У меня есть следующая простая таблица:
CREATE TABLE tbl_test
(
id serial NOT NULL,
poly polygon NOT NULL
)
WITH (OIDS=FALSE);
Затем я пытаюсь вставить строку с многоугольником:
insert into tbl_test values(1, PolyFromText('POLYGON((0 0, 10 10, 10 0, 0 0))'))
И столкнуться с этой ошибкой:
столбец "poly" относится к типу polygon, но выражение имеет геометрию типа
Который хромает. Итак, мои первые вопросы:
- Мне действительно нужно разыграть?
Во всяком случае, после приведения это работает. И теперь я пытаюсь сделать простой запрос ST_Contains:
select id, poly from tbl_test where ST_Contains(poly, Point(GeomFromText('POINT(9 2)')))
Что выдает ошибку:
ERROR: function st_contains(polygon, point) does not exist
LINE 1: select id, poly from tbl_test where ST_Contains(poly, Point(...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Что я должен делать?
Следующие работы:
select st_contains(st_geomfromtext('POLYGON((0 0, 10 10, 10 0, 0 0))'), st_geomfromtext('POINT(0 0)'))
Но это, вероятно, потому, что оба аргумента имеют тип Geometry. Фактический запрос к данным таблицы не работает.
Ответ:
Doi! Проблема заключалась в том, что созданная мной БД не была основана на БД постгис-шаблона (и поэтому не имела соответствующих функций и таблиц столбцов геометрии и т. Д.).
Позвольте мне в заключение лишь отметить, что способ, которым PostGIS требует от вас добавления сотен функций, строк и нескольких таблиц в вашу БД, просто для того, чтобы у вас была поддержка ГИС, совершенно неэффективен. Это делает резервное копирование схемы намного более сложным и очень подверженным ошибкам (не дай бог, если вы пренебрегаете вызовом AddGeometryColumn и просто добавляете геометрический столбец самостоятельно).