Snowflake中GEOGRAPHY计算多边形面积返回0问题排查
问题描述
我拥有四个作为多边形边界的经纬度点:
- ne_lat: 40.485866
- ne_lng: -3.648877
- sw_lat: 40.427200
- sw_lng: -3.708161
我尝试将其转换为GEOMETRY类型,使用如下表达式计算得到面积值为0.003477955144000122:
ST_MAKEPOLYGON(TO_GEOMETRY('LINESTRING(' || bounds_ne_lng || ' ' || bounds_ne_lat || ',' || bounds_ne_lng || ' ' || bounds_sw_lat || ',' || bounds_sw_lng || ' ' || bounds_sw_lat || ',' || bounds_sw_lng || ' ' || bounds_ne_lat || ',' || bounds_ne_lng || ' ' || bounds_ne_lat || ')')) AS box, ST_AREA(box)
但有人告诉我若要以米/平方公里为单位需切换为GEOGRAPHY类型,然而替换TO_GEOMETRY为TO_GEOGRAPHY后,ST_AREA仅返回0,请问我遗漏了什么?
问题原因与解决方法
核心问题
- ST_MAKEPOLYGON不支持GEOGRAPHY类型输入:该函数仅能处理GEOMETRY类型的线串,直接传入TO_GEOGRAPHY生成的GEOGRAPHY线串会触发隐式转换,导致多边形构造异常,最终面积计算为0。
- 顶点顺序不符合GEOGRAPHY规则:GEOGRAPHY类型要求多边形环遵循右手定则,北半球的小多边形需按逆时针顺序排列顶点;原代码中的顶点顺序是顺时针,可能导致解析异常。
解决方法
方法一:先构造GEOMETRY多边形再转GEOGRAPHY
ST_AREA( ST_MAKEPOLYGON( TO_GEOMETRY('LINESTRING(' || bounds_ne_lng || ' ' || bounds_ne_lat || ',' || bounds_sw_lng || ' ' || bounds_ne_lat || ',' || -- 调整为逆时针顺序:NE → NW → SW → SE → NE bounds_sw_lng || ' ' || bounds_sw_lat || ',' || bounds_ne_lng || ' ' || bounds_sw_lat || ',' || bounds_ne_lng || ' ' || bounds_ne_lat || ')', 4326) )::GEOGRAPHY ) AS area_sq_meters
方法二:直接用ST_GeogFromText构造GEOGRAPHY多边形(推荐)
ST_AREA( ST_GeogFromText('POLYGON((' || bounds_ne_lng || ' ' || bounds_ne_lat || ',' || bounds_sw_lng || ' ' || bounds_ne_lat || ',' || bounds_sw_lng || ' ' || bounds_sw_lat || ',' || bounds_ne_lng || ' ' || bounds_sw_lat || ',' || bounds_ne_lng || ' ' || bounds_ne_lat || '))') ) AS area_sq_meters
说明
- 调整后的顶点顺序为东北(NE) → 西北(NW) → 西南(SW) → 东南(SE) → 东北(NE),符合北半球小多边形的逆时针要求,避免GEOGRAPHY解析异常。
- 计算结果单位为平方米,若需转换为平方公里,只需将结果除以
1000000即可。
内容的提问来源于stack exchange,提问作者Moseleyi
相关产品推荐
相关产品推荐

