2

В соответствии с их документацией пространственные объекты могут иметь следующийМогу ли я хранить круг и многоугольник внутри одного и того же пространственно индексированного столбца в 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)) 

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

+0

Почему бы вам не преобразовать круг в многоугольник с более или менее узлами в соответствии с требуемым prcision? –

+0

не будет таким приблизительным, как, например, я пытаюсь реализовать простой сервер поиска геозонности, который сообщает, находится ли точка в пределах этого геозонности, которая может быть либо полигоном, либо кругом. Хотя я думал, что кружок был бы проще, но, оказывается, PostGIS используется для типов многоугольников. Какая функция преобразует круг в многоугольник? – user1493786

+0

Вы можете сделать st_buffer (mypoint, radius), чтобы получить круговую геометрию вокруг этой точки. – mlinth

ответ

5

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

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

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

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

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

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

+0

Спасибо, Джон, ваш ответ действительно помог. Я потратил время, чтобы перечитать всю документацию снова, и теперь многое из этого имеет смысл. УРА ! – user1493786

+0

Добро пожаловать. Это очень разумный вопрос. Надеюсь, вы согласитесь, что есть смысл в том, что у вас нет типа пространственного круга. –

+0

Я все еще не совсем понимаю, зачем им нужно преобразовать круг обратно в многоугольник. Это похоже на менее точную версию. Все, что им нужно сделать, это сохранить радиус и точку, и, возможно, если бы она была пространственно проиндексирована, у нее была только ограничивающая рамка. Просто вычислить, является ли точка внутри круга математически простой, просто сравнивая, если расстояние между точкой и центральной точкой круга меньше радиуса круга. – user1493786

0

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

Если это ваш прецедент, это обсуждение круга полигонов v. Не имеет значения. Буферизация всегда будет иметь небольшую ошибку, поскольку она сложна (например, количество сегментов и другие параметры). ST_Buffer - это всего лишь приближение истинного, точного буфера. Буферизация также вычислительно намного дороже. См. a good discussion on gis.SE и useful tip for newbies.

+0

Поскольку круги могут храниться в формате геометрии, как они создают на нем поле ограничения, когда оно пространственно индексируется? – user1493786

+0

Геометрия имеет пространственный индекс, который может использоваться с операторами расстояний, такими как ST_DWithin, что по существу совпадает с использованием кругов (круги - это не что иное, как расстояние от точки). ST_DWithin является наиболее эффективным и точным методом. –

+0

Что я имею в виду, когда вы храните круг в столбце геометрии, что невозможно. Тогда вы даже не можете его проиндексировать. Если только одна точка была сохранена как тип геометрии, мы не можем использовать пространственную индексацию, потому что для точки нет ограничивающей рамки. – user1493786

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

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