如何在Snowflake中将MultiPoint转换为LineString并计算长度?
问题描述
我有一个名为multipoint的geography列,其数据示例如下:
{ "coordinates": [ [ -8.734592000000001e+01, 4.146811000000000e+01 ], [ -8.734592000000001e+01, 4.146811000000000e+01 ], [ -8.734592000000001e+01, 4.146811000000000e+01 ], [ -8.734592000000001e+01, 4.146811000000000e+01 ], [ -8.734592000000001e+01, 4.146811000000000e+01 ] ], "type": "MultiPoint" }
我尝试用ST_MAKELINE将其转为LineString以用ST_LENGTH计算长度,但这个函数需要恰好两个geography参数,而我每行只有一个地理对象。请问该如何转换,或者有没有其他方法计算这些点组成的线条长度?
解决方案
方法一:拆分多点后聚合生成线串
通过ST_Dump把MultiPoint拆分成单个Point,再用聚合版的ST_MakeLine按原始顺序连接成LineString,最后计算长度:
SELECT ST_Length( ST_MakeLine( (ST_Dump(multipoint)).geom )::geography ) AS line_length FROM your_table;
ST_Dump会返回一组几何对象,聚合版的ST_MakeLine可接收这组对象生成线串,转成geography类型后计算的是球面长度。
方法二:直接转换为线串
PostGIS提供ST_LineFromMultiPoint函数,可直接将MultiPoint转为LineString,操作更简洁:
SELECT ST_Length( ST_LineFromMultiPoint(multipoint)::geography ) AS line_length FROM your_table;
该函数会严格遵循MultiPoint中点的顺序生成对应线串。
注意事项
- 若MultiPoint内的点坐标重复(如示例中所有点坐标一致),计算出的长度会是0,符合实际情况。
- 确保PostGIS版本支持上述函数,
ST_LineFromMultiPoint在多数新版本中均可正常使用。
内容的提问来源于stack exchange,提问作者numbers are fun
相关产品推荐
相关产品推荐

