共用方式為


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 數據格層級值而有很大的差異。

效能改進建議

範例

下列查詢會尋找 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