非常简单的问题,很难找到一个好的快速解决方案。
有什么实现方法可以计算在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?
形状足够小,不能使用任何球面距离,因此我假设在这种情况下,地球是平坦的:)
感谢您提供任何有用的答案!
答案 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');
绝对可以帮助您。