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

时间:2018-10-22 14:56:44

标签: mysql gis geospatial

非常简单的问题,很难找到一个好的快速解决方案。

有什么实现方法可以计算在MySQL中另存为空间数据的形状的周长吗?

就目前而言,在5.7 / 8.0中,功能为ST_Area,Centroid等,但没有周长,例如QGis / ArcGIS /其他。如何计算另存为的形状的周长:

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+(过程/函数)中还是最终在PHP中使用MySQL?

形状足够小,不能使用任何球面距离,因此我假设在这种情况下,地球是平坦的:)

感谢您提供任何有用的答案!

2 个答案:

答案 0 :(得分:0)

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

它将字符串分成逗号分隔的对,然后在中间的空格处将每个对分开。从那里开始,它在归约循环中使用毕达哥拉斯定理。

答案 1 :(得分:0)

您可以如下创建自己的函数,并传递要传递的参数。

假设您要计算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');

绝对可以帮助您。