Sdílet prostřednictvím


geo_line_to_s2cells()

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Vypočítá tokeny buněk S2, které pokrývají čáru nebo víceřádkový spojnic na Zemi. Tato funkce je užitečný nástroj pro geoprostorové spojení.

Přečtěte si další informace o hierarchii buněk S2.

Syntaxe

geo_line_to_s2cells(lineString [, level[ , radius]])

Přečtěte si další informace o konvencích syntaxe.

Parametry

Název Type Požadováno Popis
lineString dynamic ✔️ Čára nebo víceřádkový formát GeoJSON
úroveň int Definuje požadovanou úroveň buňky. Podporované hodnoty jsou v rozsahu [0, 30]. Pokud není zadáno, použije se výchozí hodnota 11 .
poloměr real Poloměr vyrovnávací paměti v metrech. Pokud není zadáno, použije se výchozí hodnota 0 .

Návraty

Pole řetězců tokenu buňky S2, které pokrývají řádek nebo víceřádkový. Pokud je poloměr nastaven na kladnou hodnotu, kryt bude vstupní obrazec i všechny body v poloměru vstupní geometrie.

Pokud některý z následujících způsobů: řádek, úroveň, poloměr je neplatný nebo počet buněk překročí limit, dotaz vytvoří výsledek null.

Poznámka:

  • Zakrývání čáry s tokeny buněk S2 může být užitečné při porovnávání souřadnic s spojnicemi, takže vyhledáte body v blízkosti čar.
  • Spojnicové kryté tokeny mají stejnou úroveň buněk S2.
  • Maximální počet tokenů na řádek je 65536.
  • Geodetické datum použité k měření vzdálenosti na Zemi je sféra. Hrany čar jsou geodesics na kouli.
  • Pokud jsou hrany vstupní čáry rovné kartézské čáry, zvažte použití geo_line_densify() k převodu planárních hran na geodesické čáry.

Výběr úrovně buňky S2

  • V ideálním případě bychom chtěli pokrýt každý řádek jedním nebo jen několika jedinečnými buňkami tak, aby žádné dva řádky nesdílely stejnou buňku.
  • V praxi zkuste zakrýt jen s několika buňkami, ne více než tucet. Pokrytí s více než 10 000 buňkami nemusí přinést dobrý výkon.
  • Doba běhu dotazu a spotřeba paměti se můžou výrazně lišit kvůli různým hodnotám na úrovni buněk S2.

Návrhy vylepšení výkonu

  • Pokud je to možné, zmenšete velikost tabulky před spojením tak, že seskupíte souřadnice, které jsou velmi blízko sebe, pomocí geoprostorového clusteringu nebo vyfiltrováním zbytečných souřadnic z důvodu povahy dat nebo obchodních potřeb.
  • Pokud je to možné, snižte počet řádků z důvodu povahy dat nebo obchodních potřeb. Vyfiltrujte nepotřebné čáry před spojením, rozsah oblasti zájmu nebo sjednocení čar.
  • V případě velmi velkých čar zmenšete jejich velikost pomocí geo_line_simplify().
  • Změna úrovně buněk S2 může zvýšit výkon a spotřebu paměti.
  • Změna typu spojení a rady může zvýšit výkon a spotřebu paměti.
  • V případě, že je nastavený kladný poloměr, může návrat k poloměru 0 u obrazce ve vyrovnávací paměti pomocí geo_line_buffer() zlepšit výkon.

Příklady

Následující dotaz najde všechny stanice metra v okruhu 500 metrů od ulic a agreguje počet trubek podle názvu ulice.

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 count
Buckinghamský palác 0
Londýn Bridge 0

V případě neplatného řádku se vrátí výsledek null.

let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0
Pravda