Postgis - Как определить, перекрываются ли два круга на основе двух точек? - PullRequest
0 голосов
/ 26 октября 2019

Я могу рассчитать расстояние между двумя точками, используя:

SELECT ST_Distance(
  ST_GeomFromText('SRID=4326;POINT(54.5972850 -5.930119)')
, ST_GeomFromText('SRID=4326;POINT(54.516827 -5.958130)'),
false);

Однако моя цель - создать грубую круглую зону (это может быть квадрат, шестиугольник, восьмиугольник и т. Д.) Вокруг каждой точки, а затемпроверьте, перекрываются ли зоны.

Я рассматриваю ST_Overlaps как возможное решение, но я не уверен, как преобразовать эти точки в полигоны для сравнения. Мой идеальный результат будет выглядеть примерно так:

SELECT ST_Overlaps(
  ST_CreateCircularPolygon(geom1, 1000, 6)
  ST_CreateCircularPolygon(geom2, 10000, 4)
);

Где:

ST_CreateCircularPolygon(geomerty, metreRadius, numberOfRadialPoints (e.g. 6 creates a hexagonal polygon))

Любое руководство будет высоко ценится!

1 Ответ

1 голос
/ 26 октября 2019

Вы можете использовать параметр 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, который может использовать пространственные индексы

...