Как рассчитать периметр фигуры в MySQL? - PullRequest
0 голосов
/ 22 октября 2018

Очень простой вопрос, очень трудно найти хорошее и быстрое решение.

Есть ли какая-либо реализация, как вычислять периметр формы, сохраняемой как пространственные данные в MySQL?

Как сейчас в5.7 / 8.0 есть функция ST_Area, Centroid и т. Д., Но нет периметра, как, например, в QGis / ArcGIS / other.Как рассчитать периметр фигур, сохраненных как:

POLYGON((-0.064064467695394 51.517842990224,-0.064052072253155   51.517846382663,-0.064060161846309 51.517859555443,-0.064067607477908 51.517870919076,-0.064150020271406 51.518000873356,-0.064212111950441 51.517981215205,-0.064106051285605 51.517831086958,...etc

в PURE MySQL 5.7+ (процедура / функция) или в конечном итоге MySQL с PHP?

Фигуры достаточно малы, чтобы не использовать какие-либо сферическиерасстояние, поэтому я предполагаю, что в этом случае Земля плоская:)

Спасибо за любой полезный ответ!

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Вы можете создать свою собственную функцию, как показано ниже, и передать параметр, который хотите передать.

Предположим, вы хотите вычислить периметр квадрата длиной 4 *. 1003 *

Вы можете получить значение, как показано ниже.

$$ delimiter 
DROP FUNCTION IF EXISTS `schema_name`.`perimeter` ;
$$ delimiter 
CREATE FUNCTION `schema_name`.`perimeter` (radius_length INT,shape_name varchar(255)) RETURNS VARCHAR(32)
BEGIN
  DECLARE RETURN_VAL INT;
  IF shape_name = 'SQUARE' THEN
   SET RETURN_VAL = 4*radius_length;
  END IF;
  IF shape_name = 'CIRCLE' THEN
   SET RETURN_VAL = PI()*radius_length*radius_length;
  END IF;
RETURN RETURN_VAL;
END;

select schema_name.perimeter(4,'SQUARE');

определенно это поможет вам.

0 голосов
/ 22 октября 2018

Я думаю, что лучшим способом было бы сделать это на PHP.Конечно, нельзя сказать, что это невозможно сделать в MySQL.

Это мое PHP-решение:

function perimeterFromValue($value) {
    $points = array_map(
        function($pair) {
            return preg_split('#\\s+#', $pair, -1, PREG_SPLIT_NO_EMPTY);
        },
        explode(',', $value)
    );
    $start  = array_shift($points);
    // Make the perimeter close onto itself (if it is already, remove this line)
    $points[] = $start;
    return array_reduce($points, function($carry, $item) use(&$start) {
        $carry += hypot($item[0]-$start[0], $item[1]-$start[1]);
        $start = $item;
        return $carry;
    }, 0);
}

Он разбивает строку на пары, разделенные запятыми, а затем разделяет каждую паруна пространстве (ах) в середине.С этого момента он использует теорему Пифагора в цикле редукции.

...