powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Геометрические типы и функции, принадлежность точки полигону
18 сообщений из 18, страница 1 из 1
Геометрические типы и функции, принадлежность точки полигону
    #35434371
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

Есть база объектов с координатами. Возникает необходимость проверять принадлежность точки некоторой области. Область задается произвольным многоугольником.
Есть ли смысл использовать геометрические типы (polygon, point) для решения этой задачи?
Увидел функцию geometry_contain, обрадовался. Оказалось зря - при определении принадлежности, полигон "достраивается" до прямоугольника, и таким образом, функция возвращает неверный результат. Например:
Код: plaintext
1.
2.
3.
4.
5.
select geometry_contain('POLYGON((2 0, 0 2, 2 4, 4 2, 2 0)','POINT(0 0)');
 geometry_contain 
------------------
 t
( 1  запись)

Можно ли как-то обойти эту аппроксимацию какими-то стандартными средствами?
И еще, есть ли документация по использованию геометрических функций, а то может я коряво их использую?
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35434506
YuriyRusinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С геометрией в постгре работает расширение PostGIS , в твоем примере надо писать что-то типа
Код: plaintext
geometry_contain(GeomFromText('POLYGON((2 0, 0 2, 2 4, 4 2, 2 0)'), GeomFromText('POINT(0 0)'))
.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35434548
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может быть как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
seb=> select point( 0 ,  0 ) @ polygon('(2,0, 0,2, 2,4, 4,2, 2,0)');
 ?column?
----------
 f
( 1  запись)

seb=> select point( 2 ,  2 ) @ polygon('(2,0, 0,2, 2,4, 4,2, 2,0)');
 ?column?
----------
 t
( 1  запись)
pg 8.3


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35434562
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не суть, это ничего не изменит, типы воспринимаются адекватно и без явного преобразования. На посгисе искал, ничего толкового не нашел. Если ткнете - буду признателен.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35434615
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёш , здорово!
У меня 7.4.
Пробовал вот это:
Код: plaintext
1.
2.
3.
4.
5.
select 'POINT(4 4)'::geometry @ 'POLYGON((2 0, 0 2, 2 4, 4 2, 2 0)'::geometry;
?column? 
----------
 t
( 1  запись)
- не годилось; Ваше же работает, спасибо!
А для мультиполигонов есть такое?
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35435364
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
Про 7.4 не знаю, в 8.x (впрочем, может и в семерке есть) с геометрическими типами и оператором contains все хорошо и работает оно правильно. Что касается вопроса использовать PostGIS или нет, нужно знать больше деталей о задаче. Плоские данные или нет? Какие запросы кроме contains будут? Как много данных? Нужна индексная поддержка или нет? Какие еще геометрические функции будут востребованы?

Для большинства не очень сложных задач встроенных в PostgreSQL геометрических типов бывает достаточно.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35436362
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Iz ,
Ну то, что @ работает с геометрическими типами постгреса, Ёш наглядно показал, так что тут вопрос отпал. Собсно, неадекватно работает функция geometry_contain, а она, как я полагаю уже постгисовская. Кроме нее в базе создалось (при подключении библиотеки и последующем выполнении скрипта, как описано тут ) еще куча функций, описания которых мне найти, к сожалению, пока не удалось. Функцию geometry_contain предполагалось использовать для принадлежности точки постгивскому мультиполигону, аналога которого в геометрических типах постгреса, как я понял, нет. Вариант, конечно, проверять принадлежность точки каждому полигону из мультиполигона. Но если есть способ проще - логично бы его использовать.
Данные плоские, порядка 200 000 точек (точки, вершины полигонов, точки путей и тп), помимо contains еще будет необходимо, как минимум, находить точки пересечения.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35436572
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
Исходя из краткого описания ваших задач, я бы не стал использовать PostGIS, а ограничился бы встроенными геометрическими типами. Одна из моих инсталляций отлично работает с подобными вещами на размерах порядка нескольких миллионов точек. То есть задачи начального уровня легче решаются такими способами, по моему мнению.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35518813
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Послушав iz a, создал поле po_point геометрического постгресовкого типа point.
Написал функцию f_pol(varchar(5)), которая из точек собирает область, типа polygon.
Теперь надо, например, вывести все точки принадлежащие некоторой области OBL01:
Код: plaintext
select id from t_points where po_point @ f_pol('OBL01');
Запрос работает ну очень медленно. Индексов по полю нет, а, видимо, нужны.
Докуметацию я, конечно, почитываю, но пока толком не разобрался.
Если кто сталкивался, подскажите, как это все делается.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35533240
Quadrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
неадмин
Зачем так все сложно. В PostGISе все что вам нужно есть. Советую мануал:
postgis-manual-ru-1.3.4.pdf


Геометрическая библиотека GEOS. Библиотека GEOS используется в PostGIS для
проведения геометрических тестов (ST_Touches(), ST_Contains(), ST_Intersects()) и операций (ST_Buffer(),
ST_Union(), ST_Difference()). GEOS можно скачать с http://geos.refractions.net.

В постгисе реализован индекс по геометрическим объектам на основе обрамляющих прямоугольников, поэтому обычно используют для грубой оценки функцию Contains, которая очень быстро работает по ним. Затем добавляют условие Intersects для окончательной проверки результата. Функция Intersects "тяжелее" чем Contains, но "качественнее". Их совместное использование позволит добиться желаемого результата по качеству и скорости.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35533597
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Quadrix,
Спасибо, ту документацию я уже читал и на русском и на английском. И, насколько я понял, в последних версиях postgis+geos функция типа пересечения или принадлежности уже включает "обрамляемую" contains. Вот только собсно с функций постгиса и начался этот топик. Сейчас, все-таки пытаюсь разобраться с постгрисовскими геометрическими типами - их бы еще проиндексировать как-нить. А функцию я слегка изменил, добавив immutable - стало работать значительно быстрее, и, в общем-то, пока терпимо.
А вот с индексами пока еще вопрос открыт.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35538352
Quadrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
неадминQuadrix,
Спасибо, ту документацию я уже читал и на русском и на английском. И, насколько я понял, в последних версиях postgis+geos функция типа пересечения или принадлежности уже включает "обрамляемую" contains. Вот только собсно с функций постгиса и начался этот топик. Сейчас, все-таки пытаюсь разобраться с постгрисовскими геометрическими типами - их бы еще проиндексировать как-нить. А функцию я слегка изменил, добавив immutable - стало работать значительно быстрее, и, в общем-то, пока терпимо.
А вот с индексами пока еще вопрос открыт.

Сейчас я тоже занимаюсь объектами на плоскости и тоже чуть более 200 тысяч их.

... А функцию я слегка изменил, добавив immutable...
Тут поподробнее, если можно? Может пример какой.

... их бы еще проиндексировать как-нить ...
По какому критерию или чем не устраивают индексы типа r-tree или gist? Может быть Вы имеете в виду нечто вроде "доменных" индексов? Т.е. плоскость делится на участки (прямоугольники), с которыми сопоставляются объекты внутри них.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35539295
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
QuadrixПо какому критерию или чем не устраивают индексы типа r-tree или gist? Может быть Вы имеете в виду нечто вроде "доменных" индексов? Т.е. плоскость делится на участки (прямоугольники), с которыми сопоставляются объекты внутри них.
Боже упаси, не надо пока никаких доменных индексов. ) Обычные бы построить. Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов. Приоритеты немного смещались - не успел разобраться, как это сделать. Так что буду благодарен, если объясните.

Про immutable - я так понял, это позволяет вычислять функцию один раз, и потом проводить сравнения с ее результатом, а не вычислять ее заново для каждой строчки. Ну это мое понимание, мб я и не прав, но работает, в моем случае, значительно быстрее.

IMMUTABLE indicates that the function always returns the same result when given the same argument values; that is, it does not do database lookups or otherwise use information not directly present in its argument list. If this option is given, any call of the function with all-constant arguments can be immediately replaced with the function value.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35541175
Quadrix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов. Приоритеты немного смещались - не успел разобраться, как это сделать. Так что буду благодарен, если объясните.
Не пробовал, но смысла от геометрических индексов по point не вижу. Вот постгрес, наверное, и не строит. Какой смысл делать охват, когда охватывать нечего. Если в поле только поинты, то, на мой взгляд, надо вместо этого поля сделать два с координатами X и Y. И по ним уже сделать обычные негеометрические индексы.

Про immutable - я так понял, это позволяет вычислять функцию один раз, и потом проводить сравнения с ее результатом, а не вычислять ее заново для каждой строчки. Ну это мое понимание, мб я и не прав, но работает, в моем случае, значительно быстрее.
Понял, это когда свои функции пишешь. Я немного о другом думал.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35543559
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неадминБоже упаси, не надо пока никаких доменных индексов. ) Обычные бы построить. Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов.теоретический вопрос: для построения btree индекса по некоторому типу, для этого типа должны быть определены операции сравнения >, <, =. какая из точек больше: (1,3) или (2,2)?
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35543863
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat неадминБоже упаси, не надо пока никаких доменных индексов. ) Обычные бы построить. Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов.теоретический вопрос: для построения btree индекса по некоторому типу, для этого типа должны быть определены операции сравнения >, <, =. какая из точек больше: (1,3) или (2,2)?теоретический ответ:

говорят в нтм (наивной теории мн-в) построяема биекция плоскости на прямую. Я правда уже этого не помню, могабыть и врут. Но исходя из этого, таки можно построить отношение порядка на пл-ти :0) (только оно будет не гладким).


извините за офтоп.
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35543897
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assaтеоретический ответ:

говорят в нтм (наивной теории мн-в) построяема биекция плоскости на прямую. Я правда уже этого не помню, могабыть и врут. Но исходя из этого, таки можно построить отношение порядка на пл-ти :0) (только оно будет не гладким).можно конечно "сравнить" точки, например по удаленности от начала координат: f(x,y)=x^2+y^2.

практический вопрос: а нужно ли это автору для решения поставленной задачи? :)
...
Рейтинг: 0 / 0
Геометрические типы и функции, принадлежность точки полигону
    #35546040
неадмин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вообще-то, я думал об индексах типа gist или r-tree. В postgis gist-овый индекс строится по типу geometry, в том числе, если в поле geometry содержатся точки. Думается, что это возможно и с геометрическими типами postgres'a. 8.3 без проблем строит gist-индекс по типу polygon, например (в 7.4 не хочет).
Собственно, сравнения для координат и не нужны. Нужен, прежде всего, оператор принадлежности @.
Сейчас из 200 000 точек, принадлежащие заданному полигону точки, перебором находятся за 2-4 секунды. Хотелось бы побыстрее. Если есть какие-то мысли - в студию, буду весьма признателен.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Геометрические типы и функции, принадлежность точки полигону
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]