Могу ли я хранить круг и многоугольник в одном столбце с пространственной индексацией в postgis?

По их документации пространственные объекты могут быть следующих видов:

POINT(0 0)

LINESTRING(0 0,1 1,1 2)

POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))

MULTIPOINT(0 0,1 2)

MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))

MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))

GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

Однако нет типа круга, где я могу просто хранить точку и ее радиус. И у меня есть та же функция, когда я могу получить ограничивающую рамку для этого круга, когда я запрашиваю, существует ли точка внутри него.


person user1493786    schedule 27.01.2015    source источник
comment
Почему бы не преобразовать круг в многоугольник с большим или меньшим количеством узлов в соответствии с требуемой точностью?   -  person Lorenz Meyer    schedule 27.01.2015
comment
разве это не будет просто приблизительным, как я пытаюсь реализовать простой сервер поиска геозоны, который сообщает, находится ли точка в пределах этой геозоны, которая может быть либо многоугольником, либо кругом. Хотя я думал, что круг был бы проще, но оказалось, что PostGIS используется для типов полигонов. Какая функция преобразует круг в многоугольник?   -  person user1493786    schedule 27.01.2015
comment
Вы можете сделать st_buffer(mypoint,radius), чтобы получить круговую геометрию вокруг этой точки.   -  person mlinth    schedule 27.01.2015
comment
@mlinth Учитывая мою точку зрения, я хочу проверить все круговые геозоны (точка и радиус), это не сработает, если я использую для запроса, поскольку мне нужно заранее знать радиус. Однако, если я сохраняю свои круговые геозоны с помощью st_buffer, то какой тип пространственного объекта будет в моем столбце?   -  person user1493786    schedule 27.01.2015
comment
Тип - геометрия. Но я думал, что некоторые из ваших заборов были круглыми, и ваша проблема была в том, что вы не знали, как их хранить?   -  person mlinth    schedule 27.01.2015
comment
Когда вы говорите, что это геометрический тип, это как в геометрической коллекции, потому что я хочу использовать эту функцию postgis.net/docs/manual-1.5/ST_Contains.html и если это коллекция геометрии типов, но если это преобразует ее в коллекцию геометрии типов. Я не могу его использовать.   -  person user1493786    schedule 27.01.2015
comment
Итак, я снова посмотрел на ST_buffer. Он возвращает все точки, которые меньше или равны расстоянию вокруг точки и имеют тип геометрии. Итак, он возвращает коллекцию POINTS ?. Затем, если бы я сделал столбец с пространственной индексацией для приема пространственных объектов типа multipolygon, это все равно было бы разрешено или оно должно быть в GeoCollection. :П   -  person user1493786    schedule 27.01.2015
comment
Подождите - я думаю, у вас есть фундаментальное непонимание. Ваша цитата из документации относится к представлениям WKT; WKT — это не то же самое, что тип геометрии PostGIS. Вам нужен столбец геометрии и для работы с геометрией — я не думаю, что вам нужно беспокоиться о коллекциях, мультиполигонах или чем-то подобном. Лучше всего было бы найти руководство по началу работы с PostGIS через Google.   -  person mlinth    schedule 27.01.2015
comment
Так что я думаю, что у меня есть лучшее понимание после прочтения немного больше. В этом postgis.net/docs/ . Мое замешательство все еще в силе, так как я спросил, настроен ли столбец для принятия типа, будет ли это «GEOMETRYCOLLECTION» или «GEOMETRY». Посмотрите на характеристики столбца «Тип».   -  person user1493786    schedule 28.01.2015
comment
Коллекции геометрии не имеют ничего общего с кругами, а состоят из любой комбинации (многоточечной), линейной или многоугольной. Как правило, их следует избегать — некоторые функции плохо работают с ними, и они плохо поддерживаются ГИС. Тип геометрии, с другой стороны, означает любой из вышеперечисленных, но не все вместе в одной записи, как в случае с коллекцией.   -  person John Powell    schedule 28.01.2015


Ответы (2)


Не существует типа Postgis для представления окружности со 100% точностью, т. е. с центральной точкой и радиусом, как в дуги окружности. Как указано в комментариях, вы можете аппроксимировать круг второй формой ST_Buffer, т. е. ST_Buffer(point, distance, num_seg_quarter_circle). По мере увеличения третьего параметра вы приближаетесь к реальному кругу за счет большего времени вычислений и места для хранения. Возвращаемый тип буферизации точки будет Polygon, как видно из запуска, что-то вроде:

SELECT ST_GeometryType(ST_Buffer(ST_MakePoint(0,0),100));

Мое личное мнение состоит в том, что, хотя учет типа дуги может повысить точность вычислений с использованием окружностей, он также усложняет ситуацию, поскольку вы больше не имеете дело с геометрическими объектами, полностью состоящими из точек, линий и многоугольников (последние два также состоят из точек, линий и многоугольников). баллов).

Вы всегда можете запускать тесты, увеличивая 3-й параметр ST_Buffer, пока не получите приемлемый результат, но, учитывая другие неточности, присущие пространству, такие как аппроксимация земли геоидом, я думаю, что проблемы, вызванные аппроксимацией геозоны, например это было бы редко. Если вы бежите,

SELECT ST_Area(ST_Buffer(ST_MakePoint(0, 0), 1, num_segments));

для разных значений num_seg_quarter_circle и сравнения с PI вы можете понять, насколько вы близки к истинному кругу.

person John Powell    schedule 27.01.2015
comment
Спасибо, Джон, твой ответ действительно помог. Я потратил время, чтобы еще раз перечитать всю документацию, и теперь многое из нее имеет смысл. УРА ! - person user1493786; 28.01.2015
comment
Пожалуйста. Это очень разумный вопрос. Надеюсь, вы согласитесь, что есть некоторый смысл в том, чтобы не использовать тип пространственного круга. - person John Powell; 28.01.2015
comment
Я до сих пор не совсем понимаю, зачем им нужно конвертировать круг обратно в многоугольник. Это как иметь менее точную версию. Все, что им нужно сделать, это сохранить радиус и точку, и, возможно, если бы она была пространственно индексирована, просто поместите на нее ограничивающую рамку. Просто вычислить, находится ли точка внутри круга, математически просто, просто сравнив, меньше ли расстояние между точкой и центральной точкой круга, чем радиус круга. - person user1493786; 28.01.2015

Если все, что вам нужно, чтобы определить, находится ли что-то на расстоянии от другого, используйте ST_DWithin. Вы даже можете сделать это быстрее, используя пространственный индекс.

Если это ваш вариант использования, это обсуждение полигона и круга не имеет значения. Буферизация всегда будет иметь небольшую ошибку, поскольку она сложная (например, количество сегментов и другие параметры). ST_Buffer — это только приближение к истинному точному буферу. Буферизация также намного дороже в вычислительном отношении. См. хорошее обсуждение gis.SE и полезный совет для новичков.

person Mike T    schedule 29.01.2015
comment
Поскольку круги не могут быть сохранены в формате геометрии, как они создают на нем ограничивающий прямоугольник, когда он пространственно индексирован? - person user1493786; 29.01.2015
comment
Геометрии имеют пространственный индекс, который можно использовать с операторами расстояния, такими как ST_DWithin, что по сути является тем же подходом, что и использование кругов (окружности — это не что иное, как расстояние от точки). ST_DWithin на сегодняшний день является наиболее эффективным и точным методом. - person Mike T; 29.01.2015
comment
Я имею в виду, когда вы сохраняете круг в столбце геометрии, что невозможно. Тогда вы не сможете даже пространственно индексировать его. Если только точка была сохранена как тип геометрии, мы не можем использовать пространственную индексацию, потому что для точки нет ограничивающей рамки. - person user1493786; 29.01.2015
comment
На самом деле можно напрямую сохранить окружность: используйте геометрию CURVEPOLYGON, но я бы не советовал использовать ее, поскольку она редко поддерживается внутри и с другим программным обеспечением. Пространственные индексы могут работать со всеми типами геометрии. - person Mike T; 29.01.2015