我有两个带有单个GEOGRAPHY列的表,其中包含用于Polygon的WRT字符串。在一个表上查询可以在其他表上很好地返回所有行而不是一行。
在“地理”列中包含POLYGON的表。用ST_CONTAINS查询时,单点返回所有行而不是单行。如果我将字段内容转换为字符串,然后又转换回GEO,则可以正常运行,但速度很慢。我还有另一个类似的表,它在更多记录上的运行速度非常快。
查询返回所有记录:
SELECT count(1) FROM pur.sections WHERE ST_CONTAINS((POLYGON), ST_GEOGPOINT(-121.253763, 38.354874))
查询有效但很慢-23秒!:
SELECT polygon FROM pur.sections WHERE ST_CONTAINS(ST_GEOGFROMTEXT(ST_ASTEXT(POLYGON)), ST_GEOGPOINT(-121.253763, 38.354874))
返回:
[
{
"polygon": "POLYGON((-121.241934066695 38.3649672043987, -121.241834795711 38.350891363934, -121.260351761597 38.3508607773966, -121.260367162138 38.3649633106378, -121.241934066695 38.3649672043987))"
}
]
表有16.4万行。
第一个查询可以非常快速地返回单行。
答案 0 :(得分:1)
我对此有一个合理的解释。问题可能是多边形方向:
https://cloud.google.com/bigquery/docs/gis-data#polygon_orientation
如果数据是从文件加载到表中的,则BigQuery假定多边形是根据此链接中描述的规则进行定位的:
如果按照输入顶点的顺序遍历多边形的边界,则多边形的内部在左侧
就像多边形的方向错误一样,因此BigQuery将它们解释为巨大的互补多边形,因此现在ST_Contains大多数时候返回true。
在第二个查询中,先打印多边形,然后调用不带ST_GEOGFROMTEXT
参数的oriented
,此处BigQuery会将WKT解释为描述面积较小的多边形,因此可以得到预期的结果。
您可以通过运行以下命令来修复表格(假设所有多边形都小于半球,可能是这种情况)
CREATE OR REPLACE pur.sections AS
SELECT * EXCEPT(POLYGON), ST_GEOGFROMTEXT(ST_ASTEXT(POLYGON)) AS POLYGON
FROM pur.sections
之后,您应该从更简单的查询中获得预期结果。