我正在尝试将点与 BigQuery 中的多边形匹配,并希望在 1) 点在多边形内和 2) 点在多边形边界内至少 2 米处进行匹配。目标是排除非常靠近多边形边缘的点(其中有一些错误)。
使用 ST_DWITHIN(point, polygon, 2)
可以轻松完成多边形附近的反向和匹配点(即使不在多边形内)。我基本上想实现 ST_DWITHIN(point, polygon, -2)
关于我如何实现这一目标的任何提示?
答案 0 :(得分:2)
您几乎可以按字面意思翻译要求:)
ST_WITHIN(point, poly)
或者,在点和多边形的情况下,ST_INTERSECTS(point, poly)
也有效并且可能更快
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)
如果您按原样运行上述查询 - 您将得到那些距离圣巴巴拉边界不超过 2000 米的 SB 商家(其中 457 个)