Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
День добрый! Есть база объектов с координатами. Возникает необходимость проверять принадлежность точки некоторой области. Область задается произвольным многоугольником. Есть ли смысл использовать геометрические типы (polygon, point) для решения этой задачи? Увидел функцию geometry_contain, обрадовался. Оказалось зря - при определении принадлежности, полигон "достраивается" до прямоугольника, и таким образом, функция возвращает неверный результат. Например: Код: plaintext 1. 2. 3. 4. 5. Можно ли как-то обойти эту аппроксимацию какими-то стандартными средствами? И еще, есть ли документация по использованию геометрических функций, а то может я коряво их использую? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 16:32 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
С геометрией в постгре работает расширение PostGIS , в твоем примере надо писать что-то типа Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 16:56 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
может быть как-то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 17:05 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Не суть, это ничего не изменит, типы воспринимаются адекватно и без явного преобразования. На посгисе искал, ничего толкового не нашел. Если ткнете - буду признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 17:07 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Ёш , здорово! У меня 7.4. Пробовал вот это: Код: plaintext 1. 2. 3. 4. 5. А для мультиполигонов есть такое? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2008, 17:19 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Про 7.4 не знаю, в 8.x (впрочем, может и в семерке есть) с геометрическими типами и оператором contains все хорошо и работает оно правильно. Что касается вопроса использовать PostGIS или нет, нужно знать больше деталей о задаче. Плоские данные или нет? Какие запросы кроме contains будут? Как много данных? Нужна индексная поддержка или нет? Какие еще геометрические функции будут востребованы? Для большинства не очень сложных задач встроенных в PostgreSQL геометрических типов бывает достаточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2008, 01:28 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Iz , Ну то, что @ работает с геометрическими типами постгреса, Ёш наглядно показал, так что тут вопрос отпал. Собсно, неадекватно работает функция geometry_contain, а она, как я полагаю уже постгисовская. Кроме нее в базе создалось (при подключении библиотеки и последующем выполнении скрипта, как описано тут ) еще куча функций, описания которых мне найти, к сожалению, пока не удалось. Функцию geometry_contain предполагалось использовать для принадлежности точки постгивскому мультиполигону, аналога которого в геометрических типах постгреса, как я понял, нет. Вариант, конечно, проверять принадлежность точки каждому полигону из мультиполигона. Но если есть способ проще - логично бы его использовать. Данные плоские, порядка 200 000 точек (точки, вершины полигонов, точки путей и тп), помимо contains еще будет необходимо, как минимум, находить точки пересечения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2008, 12:39 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Исходя из краткого описания ваших задач, я бы не стал использовать PostGIS, а ограничился бы встроенными геометрическими типами. Одна из моих инсталляций отлично работает с подобными вещами на размерах порядка нескольких миллионов точек. То есть задачи начального уровня легче решаются такими способами, по моему мнению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2008, 13:22 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Послушав iz a, создал поле po_point геометрического постгресовкого типа point. Написал функцию f_pol(varchar(5)), которая из точек собирает область, типа polygon. Теперь надо, например, вывести все точки принадлежащие некоторой области OBL01: Код: plaintext Докуметацию я, конечно, почитываю, но пока толком не разобрался. Если кто сталкивался, подскажите, как это все делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2008, 18:03 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
неадмин Зачем так все сложно. В 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, но "качественнее". Их совместное использование позволит добиться желаемого результата по качеству и скорости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 08:54 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Quadrix, Спасибо, ту документацию я уже читал и на русском и на английском. И, насколько я понял, в последних версиях postgis+geos функция типа пересечения или принадлежности уже включает "обрамляемую" contains. Вот только собсно с функций постгиса и начался этот топик. Сейчас, все-таки пытаюсь разобраться с постгрисовскими геометрическими типами - их бы еще проиндексировать как-нить. А функцию я слегка изменил, добавив immutable - стало работать значительно быстрее, и, в общем-то, пока терпимо. А вот с индексами пока еще вопрос открыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2008, 11:41 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
неадминQuadrix, Спасибо, ту документацию я уже читал и на русском и на английском. И, насколько я понял, в последних версиях postgis+geos функция типа пересечения или принадлежности уже включает "обрамляемую" contains. Вот только собсно с функций постгиса и начался этот топик. Сейчас, все-таки пытаюсь разобраться с постгрисовскими геометрическими типами - их бы еще проиндексировать как-нить. А функцию я слегка изменил, добавив immutable - стало работать значительно быстрее, и, в общем-то, пока терпимо. А вот с индексами пока еще вопрос открыт. Сейчас я тоже занимаюсь объектами на плоскости и тоже чуть более 200 тысяч их. ... А функцию я слегка изменил, добавив immutable... Тут поподробнее, если можно? Может пример какой. ... их бы еще проиндексировать как-нить ... По какому критерию или чем не устраивают индексы типа r-tree или gist? Может быть Вы имеете в виду нечто вроде "доменных" индексов? Т.е. плоскость делится на участки (прямоугольники), с которыми сопоставляются объекты внутри них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.09.2008, 18:05 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2008, 12:31 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов. Приоритеты немного смещались - не успел разобраться, как это сделать. Так что буду благодарен, если объясните. Не пробовал, но смысла от геометрических индексов по point не вижу. Вот постгрес, наверное, и не строит. Какой смысл делать охват, когда охватывать нечего. Если в поле только поинты, то, на мой взгляд, надо вместо этого поля сделать два с координатами X и Y. И по ним уже сделать обычные негеометрические индексы. Про immutable - я так понял, это позволяет вычислять функцию один раз, и потом проводить сравнения с ее результатом, а не вычислять ее заново для каждой строчки. Ну это мое понимание, мб я и не прав, но работает, в моем случае, значительно быстрее. Понял, это когда свои функции пишешь. Я немного о другом думал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2008, 09:51 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
неадминБоже упаси, не надо пока никаких доменных индексов. ) Обычные бы построить. Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов.теоретический вопрос: для построения btree индекса по некоторому типу, для этого типа должны быть определены операции сравнения >, <, =. какая из точек больше: (1,3) или (2,2)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2008, 10:33 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat неадминБоже упаси, не надо пока никаких доменных индексов. ) Обычные бы построить. Не хочет постгрес строить чета индексы по полю типа point. Грит надо создать или указать класс операторов.теоретический вопрос: для построения btree индекса по некоторому типу, для этого типа должны быть определены операции сравнения >, <, =. какая из точек больше: (1,3) или (2,2)?теоретический ответ: говорят в нтм (наивной теории мн-в) построяема биекция плоскости на прямую. Я правда уже этого не помню, могабыть и врут. Но исходя из этого, таки можно построить отношение порядка на пл-ти :0) (только оно будет не гладким). извините за офтоп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2008, 11:57 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
assaтеоретический ответ: говорят в нтм (наивной теории мн-в) построяема биекция плоскости на прямую. Я правда уже этого не помню, могабыть и врут. Но исходя из этого, таки можно построить отношение порядка на пл-ти :0) (только оно будет не гладким).можно конечно "сравнить" точки, например по удаленности от начала координат: f(x,y)=x^2+y^2. практический вопрос: а нужно ли это автору для решения поставленной задачи? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2008, 12:04 |
|
||
|
Геометрические типы и функции, принадлежность точки полигону
|
|||
|---|---|---|---|
|
#18+
Ну вообще-то, я думал об индексах типа gist или r-tree. В postgis gist-овый индекс строится по типу geometry, в том числе, если в поле geometry содержатся точки. Думается, что это возможно и с геометрическими типами postgres'a. 8.3 без проблем строит gist-индекс по типу polygon, например (в 7.4 не хочет). Собственно, сравнения для координат и не нужны. Нужен, прежде всего, оператор принадлежности @. Сейчас из 200 000 точек, принадлежащие заданному полигону точки, перебором находятся за 2-4 секунды. Хотелось бы побыстрее. Если есть какие-то мысли - в студию, буду весьма признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2008, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35434506&tid=2004043]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 236ms |
| total: | 370ms |

| 0 / 0 |
