比较 Table A 中每组坐标与 Table B 中所有坐标之间的距离,仅保留 X 距离内的坐标

Compare distance between each set of coordinates in Table A with all coordinates in Table B, keeping only those within X distance

我有两个 Lat/Long 坐标表(Table A 大约有 10,000 行,Table B 大约有 100,000 行),我正在努力计算 [=] 之间的成对距离=22=]A和B.

我想做的是从 Table A 中获取每一组单独的坐标,并将其与 Table B 中的每一组坐标进行比较,并计算坐标的数量来自 Table B,两者之间的距离小于 X 英里或公里。我想对 Table A 中的 10,000 个坐标中的每一个都执行此操作。我什至很难开始这样做。

我尝试了以下几种不同的变体:

SELECT ST_DISTANCE(
  ST_GEOGPOINT(Table_A_Long, Table_A_Lat), 
  ST_GEOGPOINT(Table_B_Long, Table_B_Lat)
) AS Distance 

但这是我所能得到的。任何将我推向正确方向的信息都将受到赞赏。

请参阅下面的绝对虚拟但希望足够简单的示例,让您获得高层次的想法

它的作用是模仿您的两个表格,并为每个州 10 个距离州内点小于 100 公里的城市进行您想要的比较

注意:因为在下面的 public 表中经纬度显示为字符串 - 我不得不将它们转换为 float64

with table1 as (
  select state_name, ST_GEOGPOINT(
      cast(internal_point_lon as float64), 
      cast(internal_point_lat as float64)
    ) table1_point
  from `bigquery-public-data.utility_us.us_states_area`
), table2 as (
  select name, ST_GEOGPOINT(
      cast(int_point_lon as float64), 
      cast(int_point_lat as float64)
    ) table2_point
  from `bigquery-public-data.utility_us.us_cities_area`
)
select state_name, 
  ARRAY_AGG(name order by ST_DISTANCE(table1_point, table2_point) limit 10) cities 
from table1
cross join table2
where ST_DISTANCE(table1_point, table2_point) < 100000
group by state_name     

有输出

使用相同的 CTE,但保留地理数据以便可视化

select 
  state_name, 
  any_value(table1_point) as state, 
  ST_UNION_AGG(table2_point) cities
from table1
cross join table2
where ST_DISTANCE(table1_point, table2_point) < 100000
group by state_name 

下面是结果可视化的几个例子

明尼苏达

格鲁吉亚

华盛顿