geo_line_to_s2cells()
適用於:✅Microsoft網狀架構✅Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel
計算覆蓋地球上線條或多行的 S2 單元格標記。 此函式是實用的地理空間聯結工具。
深入瞭解 S2 單元格階層。
語法
geo_line_to_s2cells(
lineString [ level[ ,
,
radius]])
深入瞭解 語法慣例。
參數
姓名 | 類型 | 必要 | 描述 |
---|---|---|---|
lineString | dynamic |
✔️ | GeoJSON 格式的線條或多行。 |
level | int |
定義要求的數據格層級。 支援的值在 [0, 30] 範圍內。 如果未指定,則會使用預設值 11 。 |
|
半徑 | real |
以公尺為單位的緩衝區半徑。 如果未指定,則會使用預設值 0 。 |
傳回
涵蓋線條或多行的 S2 單元格標記字串數位。 如果半徑設定為正值,則涵蓋範圍會同時位於輸入圖形和輸入幾何半徑內的所有點。
如果下列任一項:行、層級、半徑無效,或單元格計數超過限制,則查詢會產生 Null 結果。
注意
- 使用 S2 單元格標記覆蓋線條,有助於比對座標與線條,從而尋找附近的線條點。
- 涵蓋標記的行與 S2 單元格層級相同。
- 每個行的令牌計數上限為 65536。
- 用來測量地球上距離的 地緣日期 是球體。 線條邊緣是 球體上的地理區域 。
- 如果輸入線邊緣是直線笛卡兒線,請考慮使用 geo_line_densify() 將平面邊緣轉換成地理座標。
選擇 S2 儲存格層級
- 在理想情況下,我們想要將每一行覆蓋一個或只有一些唯一的單元格,這樣就不會有兩行共用相同的單元格。
- 實際上,請嘗試只覆蓋幾個單元格,不超過十幾個。 覆蓋超過 10,000 個儲存格可能無法產生良好的效能。
- 查詢運行時間和記憶體耗用量可能會因為不同的 S2 數據格層級值而有很大的差異。
效能改進建議
- 如果可能的話,請藉由使用 地理空間叢集,或因為數據或商務需求本質而篩選掉不必要的座標,藉以將彼此非常接近的座標分組 ,來減少座標數據表大小。
- 可能的話,請因數據或商務需求的性質而減少行數。 在聯結之前篩選掉不必要的線條、範圍到感興趣的區域或統一線條。
- 如果是非常大的線條,請使用 geo_line_simplify()來減少其大小。
- 變更 S2 資料格層級可能會改善效能和記憶體耗用量。
- 變更 聯結種類和提示 可能會改善效能和記憶體耗用量。
- 如果已設定正半徑,則使用 geo_line_buffer() 在緩衝圖形上還原為半徑 0 可能會改善效能。
範例
下列查詢會尋找 500 公尺街道內的所有地鐵站,並依街道名稱匯總管計數。
let radius = 500;
let tube_stations = datatable(tube_station_name:string, lng:real, lat: real)
[
"St. James' Park", -0.13451078568013486, 51.49919145858172,
"London Bridge station", -0.08492752160134387, 51.504876316440914,
// more points
];
let streets = datatable(street_name:string, line:dynamic)
[
"Buckingham Palace", dynamic({"type":"LineString","coordinates":[[-0.1399656708283601,51.50190802248855],[-0.14088438832752104,51.50012082761452]]}),
"London Bridge", dynamic({"type":"LineString","coordinates":[[-0.087152,51.509596],[-0.088340,51.506110]]}),
// more lines
];
let join_level = 14;
let lines = materialize(streets | extend id = new_guid());
let res =
lines
| project id, covering = geo_line_to_s2cells(line, join_level, radius)
| mv-expand covering to typeof(string)
| join kind=inner hint.strategy=broadcast
(
tube_stations
| extend covering = geo_point_to_s2cell(lng, lat, join_level)
) on covering;
res | lookup lines on id
| where geo_distance_point_to_line(lng, lat, line) <= radius
| summarize count = count() by name = street_name
NAME | 計數 |
---|---|
白金漢宮 | 1 |
倫敦橋 | 1 |
如果行無效,則會傳回 Null 結果。
let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0 |
---|
True |