簡體   English   中英

bigquery geojson 將來自同一用戶的多行連接到單行

[英]bigquery geojson concat multiple rows from same user to a single row

正如標題所說,我如何將來自同一用戶的多行合並到一個 geojson 格式的行中,我嘗試按順序排序,但沒有運氣。 這是我正在使用的示例代碼,我也只能在這個數據庫上選擇

SELECT rh.routeid, st_asgeojson(st_geogpoint(locs.lon, locs.lat)   
FROM demo.routebatches RB, demo.route R
cross join UNNEST(locations) as locs
where EXTRACT (date FROM TIMESTAMP_MILLIS (CAST(locs.date as INT64))) =  "2017-03-10" and rh.cycleID = 'aff9bb7b-3b92-4620-bc50-1152edefe04c'
order by routeID
limit 100

這給出了這個結果,其中來自同一 routeid 的多個 long 和 lats 不是按 routeid 排序的。 我該如何解決這個問題?

geojson 會工作,但我也會采用這種格式,它來自超集中的deck.gl 路徑

超集deck.gl 路徑

大查詢結果

這里有兩個問題:

  1. 如何對路線內的位置進行排序。 你寫下where multiple long and lats from the same routeid are not ordered by routeid - 但這是一個令人困惑的陳述。 所有這些點( same routeid )都具有相同的 routeid,那么如何by routeid它們進行排序? 您可能希望它們在 routeid 組內排序,但您需要一個不同的字段來排序它們。

  2. 您需要將 routeid 內的所有點組合成一個線串,而不是將每個點分開。

此外,目前尚不清楚實際輸入架構是什么,以及 routebatches 表與路由表的關系,如果您澄清會有所幫助。 locations字段屬於 RB 還是 R 表? 在沒有任何謂詞的情況下連接 RB 和 R 表的方式使每個 RB 行與每個 R 行交叉連接。

看起來locations記錄有一個以毫秒為單位的date字段 - 如果我們可以按這個字段排序,我會使用類似的東西

SELECT 
  rh.routeid, 
  st_asgeojson(st_makeline(
    array_agg(st_geogpoint(locs.lon, locs.lat) order by locs.date)))
FROM demo.route R cross join UNNEST(locations) as locs
where 
  EXTRACT (date FROM TIMESTAMP_MILLIS (CAST(locs.date as INT64))) =  "2017-03-10" 
  and rh.cycleID = 'aff9bb7b-3b92-4620-bc50-1152edefe04c'
GROUP BY routeID
order by routeID
limit 100

首先,我們按 routeId 分組,然后聚合( array_agg )這條路線中的所有點,創建一個包含按時間戳排序的所有點的數組。 st_makeline從此數組構建線串,然后您可以將其轉換為 geojson。

另外,請參閱這篇從公開 NOAA 數據創建類似線串的文章: https : //mentin.medium.com/longest-hurricane-eeb6844d65ed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM