2009-06-18 13 views
7

У меня есть следующая простая таблица:SQL запрос для точки в многоугольнике с использованием PostgreSQL

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

Какая хрома. Поэтому мои первые вопросы:

  1. Нужно ли мне бросать?

В любом случае, после литья он работает. И теперь я пытаюсь сделать простой 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)')) 

Но это, вероятно, потому, что оба аргумента типа геометрии. Фактический запрос к данным таблицы не работает.

Ответ:

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

+0

Если поли в полигонах, почему бы не сделать многоугольник «1-гон» с точкой, которую вы пытаетесь найти? –

+0

Я не уверен, что в postgres поддерживаются полигоны с 1 точкой. Кроме того, это обходной путь для проблемы, я не уверен, существует. –

ответ

8

Полигон - это фундаментальный тип Postgres, который PostGIS строит поверх. Вы включаете столбцы геометрии с функцией PostGIS select 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) 

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

+0

Есть ли страница, которая суммирует разницу между PostGIS и встроенной поддержкой геометрических данных в PG? Данные, которые я храню, являются географическими (2D), и я не уверен, действительно ли мне нужен PostGIS. –

+0

Мне очень нравится PostGIS, конечно, это даст вам больше возможностей в долгосрочной перспективе, позволит вам взаимодействовать с qgis или даже esri и реализует миллионы функций (специальные правила для финских и шведских данных правительства и т. Д.). Что касается того, как PostGIS использует и расходится с другими типами Postgres, это звучит как вопрос для SO. Не удалось найти четкое объяснение по поиску в Google или прямо сейчас через источник postgis. – unmounted

+0

спросил: http://stackoverflow.com/questions/1023229/spatial-data-in-postgresql –

4

Хорошо, странно, я узнал следующее гораздо проще синтаксис работы:

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

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

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

+0

Я знаю его очень старый вопрос ... но, похоже, у вас есть очень хорошая идея об opengis и postgre .... можете ли вы сказать мне, могу ли я запросить как найти, если точка находится в «любом» из многоугольников. например 'select poly from poly_table, где точка (x, y)' –

+0

@JigarShah, две вещи. 1, это «postgres», а во-вторых, это именно то, что делает запрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^