google-bigquery - 如何在大查询中使用 ST_CONTAINS 加入地理列

标签 google-bigquery gis

我有一个 BigQuery 表,其中包含地址,包括 Lat/Lng 和其他 BQ 表,其中包含从人口普查 shapefile 导入的工作几何定义。对于地址表中的每一行,我试图查找包含它的几何行。

以下查询是我查找的 INDIVIDUAL lat/lng 工作正常:

SELECT SLDLST FROM `geographies.tl_2018_sldl_*` sldl WHERE ST_CONTAINS(sldl.geom, ST_GEOGPOINT(-95.221080, 38.974500));

但是当我尝试抽象成一个连接时

SELECT 
  address_id,
  SLDLST
FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample` ssgolden
LEFT JOIN `geographies.tl_2018_sldl_*` sldl ON ST_CONTAINS(sldl.geom, ST_GEOGPOINT(ssgolden.longitude, ssgolden.latitude));

我得到一个错误: “如果连接两侧的字段相等,则不能使用 LEFT OUTER JOIN。”

如何重组我的连接查询以便能够为每个地址提取匹配的地理位置?

最佳答案

以下是 BigQuery 标准 SQL

如果你想在输出中保留不匹配的地址——你可以使用下面的

#standardSQL
WITH matched_addresses AS (
  SELECT 
    address_id,
    SLDLST
  FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample` ssgolden
  JOIN `geographies.tl_2018_sldl_X` sldl 
  ON ST_CONTAINS(sldl.geom, ST_GEOGPOINT(ssgolden.longitude, ssgolden.latitude)) 
)
SELECT * FROM matched_addresses UNION ALL 
SELECT address_id, NULL 
FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample`
WHERE NOT address_id IN (SELECT address_id FROM matched_addresses)   

但是如果你只对匹配的感兴趣——使用下面的一个

#standardSQL
WITH matched_addresses AS (
  SELECT 
    address_id,
    SLDLST
  FROM `launchpad-239920.address_standardization.temp_delete_geo_match_sample` ssgolden
  JOIN `geographies.tl_2018_sldl_X` sldl 
  ON ST_CONTAINS(sldl.geom, ST_GEOGPOINT(ssgolden.longitude, ssgolden.latitude)) 
)
SELECT * FROM matched_addresses  

关于google-bigquery - 如何在大查询中使用 ST_CONTAINS 加入地理列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398694/

相关文章:

google-bigquery - BigQuery 反斜杠/的非法转义序列

language-agnostic - 如何计算球体上点到线段的距离?

mysql - 打开mysql数据库中的 "shape"属性

相当于 OpenLayers 的 Java

sql - 如何使用 ST_DWithin 查找近点?

java - GoogleJsonResponseException : 400 Bad Request "Invalid query parameter type"

google-bigquery - BigQuery - 可以查询列数据类型

google-bigquery - 从地理点 BigQuery 创建多边形

sql - 如何根据创建日期查找两个表中最接近的记录?

python - Django 地理信息系统 : Using location__dwithin gives "Only numeric values of degree units are allowed" however location__distance_lte works fine