如何在mysql中计算形状的周长?

cgfeq70w  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(460)

很简单的问题,很难找到一个又好又快的解决方法。
在mysql中,有没有实现如何计算保存为空间数据的形状的周长?
就目前而言,在5.7/8.0中有一个函数stu 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

在纯MySQL5.7+(过程/函数)或最终MySQLwith php中?
形状小到不需要任何球面距离,所以我假设,在这种情况下地球是平的:)
谢谢你的回答!

f8rj6qna

f8rj6qna1#

我认为最好的方法是用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);
}

它将字符串拆分为逗号分隔的对,然后在中间的空间上分离每一对。从那以后,它在reduce循环中使用了毕达哥拉斯定理。

bcs8qyzn

bcs8qyzn2#

您可以如下所示创建自己的函数并传递想要传递的参数。
假设你想计算长度为4的正方形的周长。
你可以得到如下值。

$$ 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');` 肯定会对你有帮助的。

相关问题