【问题标题】:How to calculate perimeter of shape in MySQL?如何在 MySQL 中计算形状的周长?
【发布时间】:2018-10-22 14:56:43
【问题描述】:

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

有没有实现如何在 MySQL 中计算保存为空间数据的形状周长?

目前在 5.7/8.0 中有一个函数 ST_Area、Centroid 等,但没有像 e.g. 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 中?

形状小到不能使用任何球面距离,所以我假设在这种情况下地球是平的 :)

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

【问题讨论】:

    标签: mysql gis geospatial


    【解决方案1】:

    我认为最好的方法是在 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 循环中使用了毕达哥拉斯定理。

    【讨论】:

      【解决方案2】:

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

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

      肯定会对你有所帮助。

      【讨论】:

      • 方块不同。从三角形(3 个节点)到相当复杂的(数百个节点)。抱歉,我没有提到,但没有意识到这很重要。
      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多