将一个点与 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)
关于如何完成此操作的任何提示?
您几乎可以按字面意思翻译要求:)
- 点在多边形内
ST_WITHIN(point, poly)
或者,对于点和多边形,ST_INTERSECTS(point, poly)
也可以工作并且可能更快
- 点在多边形边界内至少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 个)
我正在尝试将点与 BigQuery 中的多边形进行匹配,并希望匹配 1) 点在多边形内和 2) 点在多边形边界内至少 2 米处。目标是排除非常靠近多边形边缘的点(其中有一些错误)。
使用 ST_DWITHIN(point, polygon, 2)
进行反转和匹配多边形附近的点(即使不在多边形内)会很容易。我基本上想实现 ST_DWITHIN(point, polygon, -2)
关于如何完成此操作的任何提示?
您几乎可以按字面意思翻译要求:)
- 点在多边形内
ST_WITHIN(point, poly)
或者,对于点和多边形,ST_INTERSECTS(point, poly)
也可以工作并且可能更快
- 点在多边形边界内至少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 个)