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

Matching a point to a polygon in SQL/BigQuery so that the point is at least N meters within the polygon borders (i.e. not near the border)

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

使用 ST_DWITHIN(point, polygon, 2) 进行反转和匹配多边形附近的点(即使不在多边形内)会很容易。我基本上想实现 ST_DWITHIN(point, polygon, -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)

想用一些虚拟示例跟进 Michael 的回答

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 评论行,您将获得圣巴巴拉的所有商家 (2980)

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