【问题标题】:Compare distance between each set of coordinates in Table A with all coordinates in Table B, keeping only those within X distance比较表 A 中每组坐标与表 B 中所有坐标之间的距离,仅保留 X 距离内的坐标
【发布时间】:2023-03-08 09:03:02
【问题描述】:

我有两个纬度/经度坐标表(表 A 约为 10,000 行,表 B 约为 100,000 行),并且正在努力计算表 A 和 B 之间的成对距离。

我想做的是从表 A 中获取每一组坐标,并将其与表 B 中的每一组坐标进行比较,然后计算表 B 中两者之间的距离为的坐标数小于 X 英里或公里。而且我想对表 A 中的 10,000 个坐标中的每一个都执行此操作。我什至要开始做这件事。

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

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

但这是我能做到的。任何将我推向正确方向的信息表示赞赏。

【问题讨论】:

    标签: sql google-bigquery gis


    【解决方案1】:

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

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

    注意:因为在下面的公共表中,lat 和 long 显示为字符串 - 我必须将它们转换为 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 
    

    以下是结果可视化的几个示例

    明尼苏达州

    格鲁吉亚

    华盛顿

    【讨论】:

    • 非常感谢!我要试试这个
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多