BigQuery SQL / GIS:扩展半径直到计数大于/等于“N”

Posted

技术标签:

【中文标题】BigQuery SQL / GIS:扩展半径直到计数大于/等于“N”【英文标题】:BigQuery SQL / GIS: Extend Radius Until Count Is Greater Than / Equal To 'N' 【发布时间】:2020-09-21 19:14:38 【问题描述】:

我有一个非常特殊的查询要写。在 PostGIS / BigQuery 中,我有一个 point。我可以通过增量来缓冲这一点,并对属于这一点的唯一记录执行聚合查询,例如count(distinct())。一旦计数达到某个阈值,我想返回地理对象的输入值,即。它的半径或直径。这个问题可以表述为“在我点击 'n' [ids] 之前,我必须继续出去多远?”

精细地增加缓冲区或半径的值将非常缓慢且昂贵。谁能想到一个很好的方法来缩短它并提供一个快速提供很好答案的解决方案(用 BQ 或 PSQL 术语!)?

可用的 GIS 功能:

st_buffer() st_dwithin()

谢谢!

【问题讨论】:

【参考方案1】:

您必须按距离排序并保留 N 个最近的点。 <-> 运算符将使用空间索引。

SELECT *
FROM pointLayer p
ORDER BY p.geometry <-> st_makePoint(...)
LIMIT 10; --N

【讨论】:

【参考方案2】:

你不需要精细地增加半径——我宁愿把它加倍,或者甚至增加 10 倍,一旦你有足够多的不同记录,就取 N 个最近的记录。

我已经使用 BigQuery 脚本解决了类似的问题(N=1,但对于任何 N 都可以轻松修改,只需使用 LIMIT N 而不是 LIMIT 1 并修改停止条件): https://medium.com/@mentin/nearest-neighbor-using-bq-scripting-373241f5b2f5

【讨论】:

以上是关于BigQuery SQL / GIS:扩展半径直到计数大于/等于“N”的主要内容,如果未能解决你的问题,请参考以下文章

在gis Map上画一个圆圈

谷歌的云数据仓库将全球部署,GIS功能里程碑

SQL:动态扩展搜索条件

BigQuery:如何执行滚动时间戳窗口组计数,每天产生行

我们如何在 Cassandra 中进行空间查询? Cassandra 是不是有任何 GIS 扩展?

什么是gis核密度计算