MySQL中用GROUP_CONCAT生成POLYGON报错3037的解决方法
修复ST_GeometryFromText无效GIS数据错误的方案
首先,你的核心思路是对的:通过分组拼接坐标并补充起点来闭合多边形,这个方向没问题。报错的根源是WKT格式拼接错误,具体有两个关键问题:
1. 多余的单引号和错误的括号数量
你的原SQL里,CONCAT("'POLYGON((", GROUP_CONCAT(...), ")))'") 做了两个错误操作:
- 给整个WKT字符串套了一层单引号:
ST_GeometryFromText直接接受WKT文本作为参数,不需要额外用单引号包裹,嵌套单引号会让函数识别到无效的字符串开头; - 最后多写了一个右括号:正确的POLYGON WKT格式是
POLYGON((x1 y1, x2 y2, ..., x1 y1)),你的拼接会变成POLYGON((...))),多了一个闭合括号,导致格式非法。
2. 修正后的SQL语句
把拼接逻辑调整正确,同时保留你补充起点闭合多边形的思路,修正后的代码如下:
SELECT t0.zone, ST_GeometryFromText(CONCAT('POLYGON((', GROUP_CONCAT(t0.coordinate ORDER BY t0.logical_order SEPARATOR ','), '))')) AS polygon FROM ( -- 原坐标数据 SELECT zone, CONCAT(longitude, ' ', latitude) AS coordinate, logical_order FROM zones UNION ALL -- 补充每个zone的起点作为最后一个点,确保多边形闭合 SELECT zone, CONCAT(longitude, ' ', latitude) AS coordinate, MAX(logical_order) + 1 AS logical_order FROM zones WHERE logical_order = 1 GROUP BY zone -- 避免同一个zone重复添加起点(如果logical_order=1有重复行) ) t0 GROUP BY t0.zone;
额外优化点
- 把原来固定的
1000改成MAX(logical_order)+1,这样即使某个zone的logical_order超过1000,也能保证补充的点排在最后,避免排序错误; - 给补充起点的子查询加
GROUP BY zone,防止如果同一个zone存在多条logical_order=1的重复数据时,重复添加起点。
验证修正效果
用示例数据测试,拼接后的WKT会是标准格式:
POLYGON((77.506835 -11.49079098,179.736328 -11.49079098,179.736328 -60,77.506835 -60,77.506835 -11.49079098))
这个格式符合WKT规范,ST_GeometryFromText可以正常解析生成多边形。
内容的提问来源于stack exchange,提问作者kovac
相关产品推荐
相关产品推荐

