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

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

很简单的问题,很难找到一个又好又快的解决方法。
在mysql中,有没有实现如何计算保存为空间数据的形状的周长?
就目前而言,在5.7/8.0中有一个函数stu area、centroid等,但没有像qgis/arcgis/other中那样的周长。如何计算保存为的形状的周长:

  1. 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解决方案:

  1. function perimeterFromValue($value) {
  2. $points = array_map(
  3. function($pair) {
  4. return preg_split('#\\s+#', $pair, -1, PREG_SPLIT_NO_EMPTY);
  5. },
  6. explode(',', $value)
  7. );
  8. $start = array_shift($points);
  9. // Make the perimeter close onto itself (if it is already, remove this line)
  10. $points[] = $start;
  11. return array_reduce($points, function($carry, $item) use(&$start) {
  12. $carry += hypot($item[0]-$start[0], $item[1]-$start[1]);
  13. $start = $item;
  14. return $carry;
  15. }, 0);
  16. }

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

展开查看全部
bcs8qyzn

bcs8qyzn2#

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

  1. $$ delimiter
  2. DROP FUNCTION IF EXISTS `schema_name`.`perimeter` ;
  3. $$ delimiter
  4. CREATE FUNCTION `schema_name`.`perimeter` (radius_length INT,shape_name varchar(255)) RETURNS VARCHAR(32)
  5. BEGIN
  6. DECLARE RETURN_VAL INT;
  7. IF shape_name = 'SQUARE' THEN
  8. SET RETURN_VAL = 4*radius_length;
  9. END IF;
  10. IF shape_name = 'CIRCLE' THEN
  11. SET RETURN_VAL = PI()*radius_length*radius_length;
  12. END IF;
  13. RETURN RETURN_VAL;
  14. END;
  15. ``` `select schema_name.perimeter(4,'SQUARE');` 肯定会对你有帮助的。
展开查看全部

相关问题