google-bigquery - GEOGRAPHY 字段不在一个表中工作,而在另一个表中工作?
问题描述
我有两个表,其中包含单个 GEOGRAPHY 列,其中包含 Polygon 的 WRT 字符串。一个表上的查询在其他表上运行良好,返回所有行而不是一个。
GEOGRAPHY 列中带有 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))"
}
]
表有 164K 行。
第一个查询返回单行非常快。
解决方案
我有一个合理的解释这是如何发生的。问题可能是多边形方向:
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
之后,您应该从更简单的查询中获得预期的结果。
推荐阅读
- flutter - Flutter:有多少听众?
- wordpress - AWS ELB 上的 Wordpress 错误 302
- ios - 在 UIDocumentInteractionController 中以编程方式滚动 pdf
- c++ - 当我使用 void 函数的返回值(通过转换函数指针)时,究竟会发生什么?
- typescript - 如何从接口中省略一个属性,而不是 TypeScript 中的类型?
- php - 使用 wp_set_object_terms 以编程方式创建和插入 wordpress 产品标签
- r - 使用 dplyr:count [R] 时考虑数据权重
- ios - 关系的实体的数据是
- python - 偏移现有日期值,其中值存在于数据框中的另一列中
- java - 如何使触摸通过覆盖中的空白布局区域?