将点与 SQL/BigQuery 中的多边形匹配,使点在多边形边界内至少 N 米(即不在边界附近)

时间:2021-04-15 00:31:54

标签: sql google-bigquery gis

我正在尝试将点与 BigQuery 中的多边形匹配,并希望在 1) 点在多边形内和 2) 点在多边形边界内至少 2 米处进行匹配。目标是排除非常靠近多边形边缘的点(其中有一些错误)。

使用 ST_DWITHIN(point, polygon, 2) 可以轻松完成多边形附近的反向和匹配点(即使不在多边形内)。我基本上想实现 ST_DWITHIN(point, polygon, -2)

关于我如何实现这一目标的任何提示?

2 个答案:

答案 0 :(得分:2)

您几乎可以按字面意思翻译要求:)

  1. 点在多边形内

ST_WITHIN(point, poly) 或者,在点和多边形的情况下,ST_INTERSECTS(point, poly) 也有效并且可能更快

  1. 点距多边形边界至少 2 米,我们将其拼写为点距多边形边界至少 2 米(我们已经知道它在多边形内部):

ST_DISTANCE(point, ST_BOUNDARY(poly)) >= 2。如果写成 NOT ST_DWITHIN(point, ST_BOUNDARY(poly), 2),这个条件可能会更快。

所以我们得到

ST_INTERSECTS(point, poly) AND NOT ST_DWITHIN(point, ST_BOUNDARY(poly), 2)

答案 1 :(得分:2)

想通过一些虚拟示例来跟进迈克尔的回答

SELECT merchant_name, 
  ST_GEOGPOINT(Merchant_GP_Longitude, Merchant_GP_Latitude) geo,
FROM `utilities.Google_Places_Details` m
JOIN `bigquery-public-data.utility_us.us_cities_area` c
ON ST_WITHIN(ST_GEOGPOINT(Merchant_GP_Longitude, Merchant_GP_Latitude), city_geom)
AND ST_DISTANCE(ST_GEOGPOINT(Merchant_GP_Longitude, Merchant_GP_Latitude), ST_BOUNDARY(city_geom)) > 2000
WHERE name = 'Santa Barbara, CA' 
UNION ALL
SELECT 'city', city_geom
FROM `bigquery-public-data.utility_us.us_cities_area`
WHERE name = 'Santa Barbara, CA'  

如果您注释带有 ST_DISTANCE(...) > 2000 的行,您将获得 Santa Barbara 的所有商家 (2980)

enter image description here

如果您按原样运行上述查询 - 您将得到那些距离圣巴巴拉边界不超过 2000 米的 SB 商家(其中 457 个)

enter image description here