地理字段不能在一个表中工作而在另一个表中工作?

时间:2019-07-11 15:28:13

标签: google-bigquery

我有两个带有单个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万行。

第一个查询可以非常快速地返回单行。

1 个答案:

答案 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

之后,您应该从更简单的查询中获得预期结果。