BigQuery ST_DWITHIN 多点多点
BigQuery ST_DWITHIN multiple points with multiple points
所以我有N点考虑,M点参考。
我正在尝试过滤 N 中的所有点,这些点在任何 M 点的半径 R 内。
对于以下示例,my-table-1 是一个 table,具有 ID 和单个坐标 GEOGRAPHY 条目
目前我只能使用类似这样的方法使 N 到 1 Point 工作:
SELECT *
FROM 'my-table-1' as one
WHERE ST_DWITHIN(points, (SELECT points FROM 'my-table-1' WHERE id = '1234'), 10000)
所以基本上我想要完成的是相同的语句,但使用多个点进行比较。
我想要的基本上是这样的:
SELECT *
FROM 'my-table-1' as one
WHERE ST_DWITHIN(points, (SELECT points FROM 'my-table-1' WHERE id IN('1234', '2345', ...)), 10000)
但这会导致错误,因为ST_DWITHIN只能比较1点和N点。我尝试研究 BQ LOOPS 和 ARRAYS,但到目前为止还没有找到解决方案。
我在第二条语句中得到的确切错误是 Scalar subquery produced more than one element
基本上将所有点与同一组特定点进行比较 table 并检查它们是否在这些点周围的某个半径内
如果我理解正确,我可能会:
- 在M个点周围创建一个半径为R的缓冲区(ST_Buffer)
- 合并这些几何图形 (ST_Union)
- Select 来自 N 个点,在 N 个点上使用 ST_DWithin 和 union/buffer 几何
这是我的想法,虽然我无法在脑海中构建查询,但我认为一个查询应该可以完成,或者你可以在那里抛出一个 WITH 语句。
让我知道这是否适合您。我看到对于 BigQuery,您没有 ST_Buffer,但您可以使用 jslibs.turf.ST_BUFFER。
编辑:该死,我才意识到这不是PG问题,而是BQ问题...
我真丢人。这些功能在那里可用吗?
这是一个 PG 查询示例(已测试):
select n.id from "N_Points" as n, (select st_buffer(m.geom, 20000) as geom
from "M_Points" m where m.id < 10) as p
where st_dwithin(n.geom, p.geom, 0);
其中 20000 是以投影单位表示的半径 (R),geom 是 geometry/geography 列。
您可以将其替换为连接或使用“with”子句而不是那么长的 select st_buffer。
看起来您甚至不需要联合这些几何图形。 :)
您也可以使用 ST_Within:
ST_Within(n.geom, p.geom)
I'm trying to filter all the Points in N, that are within some radius R of any of the M points.
使用两个表的方法是通过 JOIN。您的查询
SELECT *
FROM 'my-table-1' as one
WHERE ST_DWITHIN(points, (SELECT points FROM 'my-table-1' WHERE id IN ...), 10000)
应该变成
SELECT one.id, one.points
FROM 'my-table-1' one JOIN 'my-table-1' two
ON ST_DWITHIN(one.points, two.points, 10000)
WHERE two.id IN ('1234', '2345', ...)
请注意,如果 one
中的某个点与 two
中的多个点的距离在 10 公里以内,这将产生重复点。所以你可能想要删除重复项,我会为此添加 GROUP BY
(假设我们有一些独特的列 id
):
SELECT id, ANY_VALUE(points) AS points
FROM (
SELECT one.id, one.points
FROM 'my-table-1' one JOIN 'my-table-1' two
ON ST_DWITHIN(one.points, two.points, 10000)
WHERE two.id IN ('1234', '2345', ...)
)
GROUP BY id
所以我有N点考虑,M点参考。 我正在尝试过滤 N 中的所有点,这些点在任何 M 点的半径 R 内。
对于以下示例,my-table-1 是一个 table,具有 ID 和单个坐标 GEOGRAPHY 条目
目前我只能使用类似这样的方法使 N 到 1 Point 工作:
SELECT *
FROM 'my-table-1' as one
WHERE ST_DWITHIN(points, (SELECT points FROM 'my-table-1' WHERE id = '1234'), 10000)
所以基本上我想要完成的是相同的语句,但使用多个点进行比较。 我想要的基本上是这样的:
SELECT *
FROM 'my-table-1' as one
WHERE ST_DWITHIN(points, (SELECT points FROM 'my-table-1' WHERE id IN('1234', '2345', ...)), 10000)
但这会导致错误,因为ST_DWITHIN只能比较1点和N点。我尝试研究 BQ LOOPS 和 ARRAYS,但到目前为止还没有找到解决方案。
我在第二条语句中得到的确切错误是 Scalar subquery produced more than one element
基本上将所有点与同一组特定点进行比较 table 并检查它们是否在这些点周围的某个半径内
如果我理解正确,我可能会:
- 在M个点周围创建一个半径为R的缓冲区(ST_Buffer)
- 合并这些几何图形 (ST_Union)
- Select 来自 N 个点,在 N 个点上使用 ST_DWithin 和 union/buffer 几何
这是我的想法,虽然我无法在脑海中构建查询,但我认为一个查询应该可以完成,或者你可以在那里抛出一个 WITH 语句。
让我知道这是否适合您。我看到对于 BigQuery,您没有 ST_Buffer,但您可以使用 jslibs.turf.ST_BUFFER。
编辑:该死,我才意识到这不是PG问题,而是BQ问题... 我真丢人。这些功能在那里可用吗?
这是一个 PG 查询示例(已测试):
select n.id from "N_Points" as n, (select st_buffer(m.geom, 20000) as geom
from "M_Points" m where m.id < 10) as p
where st_dwithin(n.geom, p.geom, 0);
其中 20000 是以投影单位表示的半径 (R),geom 是 geometry/geography 列。 您可以将其替换为连接或使用“with”子句而不是那么长的 select st_buffer。 看起来您甚至不需要联合这些几何图形。 :) 您也可以使用 ST_Within:
ST_Within(n.geom, p.geom)
I'm trying to filter all the Points in N, that are within some radius R of any of the M points.
使用两个表的方法是通过 JOIN。您的查询
SELECT *
FROM 'my-table-1' as one
WHERE ST_DWITHIN(points, (SELECT points FROM 'my-table-1' WHERE id IN ...), 10000)
应该变成
SELECT one.id, one.points
FROM 'my-table-1' one JOIN 'my-table-1' two
ON ST_DWITHIN(one.points, two.points, 10000)
WHERE two.id IN ('1234', '2345', ...)
请注意,如果 one
中的某个点与 two
中的多个点的距离在 10 公里以内,这将产生重复点。所以你可能想要删除重复项,我会为此添加 GROUP BY
(假设我们有一些独特的列 id
):
SELECT id, ANY_VALUE(points) AS points
FROM (
SELECT one.id, one.points
FROM 'my-table-1' one JOIN 'my-table-1' two
ON ST_DWITHIN(one.points, two.points, 10000)
WHERE two.id IN ('1234', '2345', ...)
)
GROUP BY id