Google BigQuery中ST_Contains返回FALSE但点在多边形内的问题排查
问题原因及解决方案
核心问题:多边形顶点顺序+参数调用错误导致判定异常
多边形内部区域判定逻辑不符预期
BigQuery地理空间函数遵循右手定则判断多边形内部:沿顶点顺序移动时,内部区域位于你的左侧。你定义的多边形顶点顺序是从东经100度向北→西经166度→向南→回到起点,这个顺序实际将太平洋区域判定为多边形内部,而美国所在的美洲大陆处于外部,因此ST_Contains返回FALSE。ST_Within参数顺序错误
ST_Within的正确调用格式是ST_Within(待判断的几何对象, 包含它的几何对象),即ST_Within(点, 多边形),你原查询中写反了参数顺序,这也会导致结果异常。
解决方案
方案1:手动修正多边形顶点顺序
调整顶点顺序,让内部区域覆盖美洲:
WITH bounds AS ( SELECT ST_GeogFromText('POLYGON((100.1953125 18.972632184382203, -166.9921875 18.972632184382203, -166.9921875 72.49968929857847, 100.1953125 72.49968929857847, 100.1953125 18.972632184382203))') AS polygon ) SELECT ST_Contains(bounds.polygon, ST_GeogPoint(-95.712891, 37.09024)) AS does_bounds_contains, ST_Within(ST_GeogPoint(-95.712891, 37.09024), bounds.polygon) AS is_within_bounds FROM bounds;
方案2:用ST_FlipOrientation翻转多边形内部判定
无需手动修改顶点,直接通过内置函数修正内部区域:
WITH bounds AS ( SELECT ST_FlipOrientation(ST_GeogFromText('POLYGON((100.1953125 18.972632184382203, 100.1953125 72.49968929857847, -166.9921875 72.49968929857847, -166.9921875 18.972632184382203, 100.1953125 18.972632184382203))')) AS polygon ) SELECT ST_Contains(bounds.polygon, ST_GeogPoint(-95.712891, 37.09024)) AS does_bounds_contains, ST_Within(ST_GeogPoint(-95.712891, 37.09024), bounds.polygon) AS is_within_bounds FROM bounds;
执行任意方案后,两个字段都会返回TRUE,符合预期。
内容的提问来源于stack exchange,提问作者Pradeep Bobal
相关产品推荐
相关产品推荐

