Вы можете использовать параметр quad_seg
, равный st_buffer
, чтобы указать количество сегментов на четверть круга. То есть общее число сегментов в выходных данных будет в четыре раза больше.
Для получения квадрата:
select st_asText(st_buffer(st_geomFromText('Point(10 10)'), 1, 'quad_segs=1'));
st_astext
------------------------------------------------------
POLYGON((11 10,10 9,9 10,9.99999999999999 11,11 10))
(1 row)
Восьмиугольник:
select st_asText(st_buffer(st_geomFromText('Point(10 10)'), 1, 'quad_segs=2'));
st_astext
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((11 10,10.7071067811865 9.29289321881345,10 9,9.29289321881345 9.29289321881345,9 10,9.29289321881345 10.7071067811865,9.99999999999999 11,10.7071067811865 10.7071067811866,11 10))
(1 row)
Так какВы хотите работать в метрах, но у вас есть непроецированные координаты, вы можете привести свою геометрию к географии, применить буфер в метрах и вернуть к геометрии. Отметим, что st_buffer
в географии будет внутренне приведен к геометрии в UTM, выполнит буфер, затем приведёт обратно к географии (много приведений, но это удобно!)
При этом квадратне круг, и это звучит очень и очень неправильно, если предположить обратное. Ориентация квадрата не очевидна: угол должен быть на севере? или сегмент должен быть обращен к norht? или квадрат должен быть повернут? На сколько?
Вы избавите себя от множества проблем, используя реальный круг. В этом случае вообще не используйте st_buffer
и st_distance
, а скорее st_dwithin
, который может использовать пространственные индексы