計算上下筆的座標距離
发布于 7 个月前 作者 eddie0226 522 次浏览 来自 问答

資料包含經緯度座標跟時間,請問該如何計算上下筆的經緯度距離? 我查了文件,計算經緯度可以透過greatCircleDistance做計算,計算上下筆某一個欄位的差值,可以用runningDifference 但想不到要怎麼把這兩個功能結合在一起 想請有處理經驗的人分享該怎麼下Query 感謝~

5 回复

可以把这个问题描述清楚嘛?最好可以给点测试数据

資料大致上如下圖,想計算每個人跟自己的下一筆紀錄移動距離。 如果有不清楚的部分,我再補充 謝謝~ sample.PNG 附上其中三筆在clickhouse計算的函數 418=SELECT floor(greatCircleDistance(121.533,25.064,121.537,25.063)) AS distance 1157=SELECT floor(greatCircleDistance(121.522,25.067,121.533,25.064)) AS distance 2449=SELECT floor(greatCircleDistance(121.523,25.089,121.522,25.067)) AS distance

@eddie0226

  1. table: CREATE TABLE IF NOT EXISTS move ( ts DateTime, person String, x Float64, y Float64 ) Engine = MergeTree PARTITION BY toDate(ts) ORDER BY (person, ts) SETTINGS index_granularity = 8192);

  2. data: INSERT INTO move VALUES (‘2018-05-14 11:38:00’, ‘tom’, 1.0,2.0 ); INSERT INTO move VALUES (‘2018-05-14 11:38:01’, ‘tom’, 2.0,3.0 );

  3. query: select person, px, py, x,y, greatCircleDistance(x,y,px,py) from (select rowNumberInAllBlocks() as pr, person, x as px, y as py from move order by ts asc) prev ALL INNER JOIN (select rowNumberInAllBlocks() as r, person, x, y from move order by ts asc) cur USING person WHERE pr + 1 = r;

查询的关键是,用 rowNumberInAllBlocks() of previous row + 1 = rowNumberInAllBlocks() of current row,来匹配出当前行和上一行。 这种JOIN可能性能不佳,建议测试下。

謝謝你的回覆,晚點我來試試看效能。 之後會再提供測試的資料量,跟執行的時間。

@eddie0226 楼主测试完了吗?

回到顶部