查找坐标之间的平均距离

Posted

技术标签:

【中文标题】查找坐标之间的平均距离【英文标题】:Finding the average distance between coordinates 【发布时间】:2020-03-18 23:16:22 【问题描述】:

我有两个公共数据集,分别是 1) 自行车旅行和 2) 车站,我需要在其中找到平均旅行距离最长的车站。我已经加入了来自两个数据集的表格

bigquery-public-data.london_bicycles.cycle_hire bigquery-public-data.london_bicycles.cycle_stations

每次旅行都有一个起点站和一个终点站。旅行的终点站通常与起点站不同,因此每次的距离都不同。想知道哪个起点站到终点站的平均行程/距离最长,这意味着对于骑自行车的人来说,平均而言,哪些行程到最远的终点站。

我希望 1) 输出是这样的:

Trip  Start_station_coordinate  start_st_name  end_station_coordinate  end_st_name   km_dist
 1    POINT(-0.123 51.123)      A-station      POINT(-0.123 51.123)     B-station      ??
 2    POINT(-0.123 51.123)      C-station      POINT(-0.123 51.123)     D-station      ??
 3    POINT(-0.123 51.123)      D-station      POINT(-0.123 51.123)     F-station      ?? 

...和 ​​2) 按每次行程的平均 km_distance 最高的 start_station 分组。所以是这样的:

start_station   average_distance_descending

  A-station     20 km      
  B-station     15 km 
  C-station     3  km

我的代码是一个 JOIN,我无法将上述内容合并到我的查询中(因为我对 sql 完全陌生)。我在最后尝试了以下有问题的行:

 `SELECT ST_GeogPoint(stations1.longitude, stations1.latitude) as WKT1
   ,stations1.id
   ,ST_GeogPoint(stations2.longitude, stations2.latitude) as WKT2
   ,stations2.id as id_2  
   ,trips.end_station_id
   ,trips.start_station_id
   from bigquery-public-data.london_bicycles.cycle_hire as trips
   Inner JOIN bigquery-public-data.london_bicycles.cycle_stations as stations1
   ON trips.start_station_id = stations1.id 
   Inner JOIN bigquery-public-data.london_bicycles.cycle_stations as stations2
   ON trips.end_station_id = stations2.id
   order by AVG(st_distance(WKT1, WKT2))`

BigQuery 表示“ORDER BY 子句仅在 [22:5] 出现 GROUP BY 或 SELECT 列表聚合时才允许聚合”,参考最后一行。我一直在思考如何找到最高的平均距离(如果可能的话)以及如何将它结合到我的 JOIN 操作中。

如何以正确的方式编写此代码以找到正确的距离? 这是一项极其重要的任务,我在最后期限内没有希望,希望尽快得到帮助

【问题讨论】:

非常重要的一点是,您要制定出您想到的确切逻辑以及简化示例和预期输出示例。仅仅显示有问题的查询通常是行不通的! 很高兴知道 - 我已经重新制定了一点 - 请检查它现在是否更有意义,或者不要犹豫让我知道(这是我的第一篇文章) 【参考方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
WITH output_1 AS (
  SELECT 
    ST_GEOGPOINT(stations1.longitude, stations1.latitude) AS WKT1,
    stations1.name AS start_st_name,
    ST_GEOGPOINT(stations2.longitude, stations2.latitude) AS WKT2,
    stations2.name AS end_st_name,
    ST_DISTANCE(ST_GEOGPOINT(stations1.longitude, stations1.latitude), ST_GEOGPOINT(stations2.longitude, stations2.latitude)) AS dist
  FROM bigquery-public-data.london_bicycles.cycle_hire AS trips
  INNER JOIN bigquery-public-data.london_bicycles.cycle_stations AS stations1
    ON trips.start_station_id = stations1.id 
  INNER JOIN bigquery-public-data.london_bicycles.cycle_stations AS stations2
    ON trips.end_station_id = stations2.id
), output_2 AS (
  SELECT 
    start_st_name AS start_station, 
    ROUND(AVG(dist), 2) AS average_distance
  FROM output_1
  GROUP BY start_st_name
)
SELECT *
FROM output_2
ORDER BY average_distance DESC
LIMIT 10   

有输出

Row start_station                               average_distance     
1   Blackfriars Station, St. Paul's             5895.44  
2   Bonner Gate, Victoria Park                  4105.8   
3   Walworth Square, Walworth                   3751.54  
4   Bourne Street, Belgravia                    3681.56  
5   Clarence Walk, Stockwell                    3351.18  
6   Clapham Road, Lingham Street, Stockwell     3293.93  
7   Clapham Common North Side, Clapham Common   3268.38  
8   Limburg Road, Clapham Junction              3156.89  
9   Wandsworth Rd, Isley Court, Wandsworth Road 3148.16  
10  Sugden Road, Clapham    3107.68  

【讨论】:

这是不久前的事了,但非常感谢您的帮助!它非常有用,希望您以后继续使用【参考方案2】:

我认为您不需要站点之间的“平均距离”。 2 个站点之间的距离将始终相同。

让我们首先创建一个表,其中包含所有可能的电台组合的JOIN

CREATE TABLE temp_eu.stations AS (
   SELECT station1, station2
     , ST_DISTANCE(
         ST_GeogPoint(station1.longitude, station1.latitude)
         , ST_GeogPoint(station2.longitude, station2.latitude)) distance
   FROM `bigquery-public-data.london_bicycles.cycle_stations` station1
   JOIN `bigquery-public-data.london_bicycles.cycle_stations` station2
   USING(id)
); 
# 1.4 sec elapsed, 76.1 KB processed

现在您可以使用这些数据扩充原始表格 - 并按距离排序,如果您想要的话:

SELECT
 distance, station1, station2
 ,hire.duration
 ,hire.bike_id
 ,hire.end_date
 ,hire.end_station_id
 ,hire.end_station_name
 ,hire.start_date
 ,hire.start_station_id
 ,hire.start_station_name
 from `bigquery-public-data.london_bicycles.cycle_hire` as hire
JOIN temp_eu.stations
ON hire.start_station_id = station1.id 
AND hire.end_station_id = station2.id
ORDER BY distance
LIMIT 100

【讨论】:

嗨,非常感谢,但我有点不清楚并编辑了我的问题。我试图找出从起点站到终点站的最高平均距离,终点站几乎总是与起点站不同。骑手基本上可以从起点站(公共)租一辆自行车,根据每个骑手/骑自行车的终点站目的地将其骑到不同的终点站。是否可以重新检查,因为它会在很大程度上有所帮助?

以上是关于查找坐标之间的平均距离的主要内容,如果未能解决你的问题,请参考以下文章

计算两个经纬度之间的距离

计算两个纬度和经度坐标之间的距离

我有一个列表,我想计算列表中每个项目与列表中所有其他项目的平均距离

查找用户是不是在给定坐标的给定距离内

通过距离和方位从已知位置查找点坐标的地理算法

获取画布中两点之间的距离