Вопрос по sql, postgresql – SQL-запрос для многоугольника с использованием PostgreSQL

7

У меня есть следующая простая таблица:

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))'))

И столкнуться с этой ошибкой:

column "poly" is of type polygon but expression is of type geometry

Который хромает. Итак, мои первые вопросы:

Do I really have to cast?

Во всяком случае, после кастинга это работает. А сейчас я пытаюсь выполнить простой запрос 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. Фактический запрос к данным таблицы не работает.

Answer:

Doi! Проблема заключалась в том, что созданная мной БД не была основана на БД постгис-шаблона (и поэтому не имела соответствующих функций и таблиц столбцов геометрии и т. Д.). Позвольте мне в заключение лишь отметить, что способ, которым PostGIS требует от вас добавления сотен функций, строк и нескольких таблиц в вашу БД, просто для того, чтобы у вас была поддержка ГИС, совершенно неэффективен. Это делает резервное копирование схемы намного более сложным и очень подверженным ошибкам (не дай бог, если вы пренебрегаете вызовом AddGeometryColumn и просто добавляете столбец геометрии самостоятельно).

Я не уверен, что полигоны с 1 точкой поддерживаются в postgres. Кроме того, это обходной путь для проблемы, в которой я не уверен ... Assaf Lavie
Если поли в поли работает, почему бы не сделать "1-гон"? полигон с точкой, которую вы пытаетесь найти? Paul Tomblin

Ваш Ответ

2   ответа
4

Хорошо, странно, я обнаружил, что следующий намного более простой синтаксис работает:

insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)')

select * from tbl_test where poly @> '(2, 8)'

Но я изо всех сил пытаюсь выяснить разницу между этими наборами функций и операторов. Использует ли этот более короткий синтаксис (который на самом деле не соответствует OpenGIS) те же пространственные индексы и т. Д.?

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
8

Многоугольник - это фундаментальный тип Postgres, который PostGIS строит поверх него. Вы включаете геометрические столбцы с помощью функции PostGISselect AddGeometryColumn(...), В противном случае вы работаете с прямыми полигонами:

=> create table gt (id int, space polygon);
=> insert into gt values (1, '((2,2),(3,4),(3,6),(1,1))');
INSERT 0 1
=> select point(space) from gt where id = 1;
    point    
-------------
 (2.25,3.25)
(1 row)

Это центральная точка многоугольника

=> select circle(space) from gt where id = 1;
             circle             
--------------------------------
 <(2.25,3.25),1.93994028704315>
(1 row)

Это минимальная ограничивающая окружность многоугольника, выраженная в виде Postgrescircle тип. Все геометрические операторы документированыздесь: http://www.postgresql.org/docs/8.3/interactive/functions-geometry.html  Базовый полигон не имеет никаких проекционных данных, SRID и т. Д., Поэтому, если он работает с PostGIS, он, вероятно, просто использует предустановки и получает удачу. Но, конечно, есть множество случаев, когда вам просто нужна геометрия в суб-геопространственном масштабе.

Error: User Rate Limit Exceededpostgresql.org/docs/8.3/static/datatype-geometric.htmlError: User Rate Limit Exceededpostgresql.org/docs/8.3/static/functions-geometry.htmlError: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/1023229/spatial-data-in-postgresql Assaf Lavie
Error: User Rate Limit Exceeded Assaf Lavie
Error: User Rate Limit Exceeded

Похожие вопросы