查找坐标之间的平均距离
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
【讨论】:
嗨,非常感谢,但我有点不清楚并编辑了我的问题。我试图找出从起点站到终点站的最高平均距离,终点站几乎总是与起点站不同。骑手基本上可以从起点站(公共)租一辆自行车,根据每个骑手/骑自行车的终点站目的地将其骑到不同的终点站。是否可以重新检查,因为它会在很大程度上有所帮助?以上是关于查找坐标之间的平均距离的主要内容,如果未能解决你的问题,请参考以下文章