2017-10-07 36 views
0

的给定一个表像这样的蜂巢累积距离:计算由一系列纬度,经度点

latitude longitude 

我们希望将第三列添加到该表,该表将存储的行驶距离

latitude longitude odometer 

其中用于第i行的里程表计算如下:

odometer_i = odometer_{i-1} + distance(lat_i, lon_i, lat_{i-1}, lon_{i-1}) 

distance(x1, y1, x2, y2) = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) 

odometer_0 = 0 (first row) 

如何才能做到这一点?

回答

0

解决这个问题的关键是使用hive - lag和sum的窗口函数。

第1步:第一步是枚举以前的经纬度,除了当前的纬度经度,long。这是使用滞后函数完成,关键是解决这个问题:

SELECT *, 
        lag(latitude, 1) over (order by timestamp) as previous_latitude, 
        lag(longitude, 1) over (order by timestamp) as previous_longitude 
        from table 

,我们假定一个timestamp柱的存在性纬度订购,多头在时间顺序。

步骤2:下一步骤是度转换成弧度

   select *, 
       radians(previous_latitude) as lat1, 
       radians(previous_longitude) as lon1, 
       radians(latitude) as lat2, 
       radians(longitude) as lon2 
       from step1 

步骤3:接下来,我们计算使用haversine公式的第一阶近似(lat1, lon1)(lat2, lon2)之间的距离:

select *, 
        6378137.0 * sqrt(pow(lat1 - lat2, 2) + cos(lat1) * cos(lat2) * pow(lon1 - lon2, 2)) as distance 
       from step2 

第4步:最后我们计算distance列的运行总和:

select *, sum(distance) over (order by timestamp) as odometer from step3 
相关问题