2015-07-19 5 views
0

Если у меня есть MBC, который выглядит как следующий запрос:Определение радиуса или диаметра минимальный ограничительный круг

SELECT ST_AsText(ST_MinimumBoundingCircle(geom)::geometry) AS Circle 
FROM "Regions" 

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

Спасибо.

ответ

1

ST_MinimumBoundingCircle - пользовательская функция с источником, написанным в PL/pgSQL. Вы можете modify the source как переименованная функция ST_MinimumBoundingRadius(inputgeom geometry) с этими изменениями:

  • только требуется один аргумент inputgeom geometry
  • Изменить тип возврата (около сверху) от geometry к double precision
  • Для типов POINT, изменить RETURN hull; к RETURN 0;
  • Снимите инструкцию ST_Buffer рядом с концом и просто верните radius.

Должно быть легко. Имейте в виду, что есть некоторые проблемы с алгоритмом, например ticket #2996.

0

Я разработал решение, которое просто, но, возможно, не очень эффективно. Для моих целей это работает хорошо.

SELECT 
    ROUND(
     ST_Distance_Sphere(
      ST_Centroid(ST_MinimumBoundingCircle(geom)), 
      ST_PointN(ST_Boundary(ST_MinimumBoundingCircle(geom)), 1) 
     )/1000 
    ) AS radius, 
    ST_AsGeoJSON(ST_Centroid(geom)) AS center 
FROM 
    "Regions" 

Результат: радиус в км и центр тяжести.

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