Intereting Posts
Плохо ли для производительности выбирать все столбцы? Как я могу сделать среднее число дат в MySQL? Oracle ProC INSERT INTO VALUES ((выберите …)) Подсчет количества вхождений подстроки внутри строки в PostgreSQL SQLite3 Имитировать ПРАВИЛЬНУЮ ВЗАИМОДЕЙСТВУЮЩУЮ ПОСЛЕДУЮЩУЮ С ЛЕВЫМИ СПОСОБАМИ И СОЮЗОМ Получить декодированное двоичное изображение из SQL и вставить в PDF через iTextsharp asp.net c # Ограничение XOR в Mysql Что представляет собой знак вопроса в SQL-запросах? Обновление отдельной таблицы на основе данных из нескольких таблиц SQL Server 2005,2008 Выберите foo с событиями в баре только после определенной даты Как повысить скорость записи InnoDB в секунду MySQL DB Хэмминг Расстояние / сходство в базе данных Могу ли я использовать MERGE INTO для имитации «upsert» в Apache Derby? Типы полей, доступные для использования с «CREATE TABLE» в Microsoft Access Mysql Вставить несколько строк с значениями, разделенными запятыми, только с помощью оператора sql

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" имеет тип polygon, но выражение имеет тип геометрии

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

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

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

Ответ:

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

Многоугольник является основным типом 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) 

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

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

 insert into tbl_test (poly) values ('(0,0),(0,10),(10, 10), (0, 0)') select * from tbl_test where poly @> '(2, 8)' 

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