Condividi tramite


geo_line_to_s2cells()

Si applica a: ✅Microsoft Fabric✅Azure Esplora dati Azure MonitorMicrosoft Sentinel

Calcola i token di cella S2 che coprono una linea o una multilinea sulla Terra. Questa funzione è uno strumento di join geospaziale utile.

Altre informazioni sulla gerarchia di celle S2.

Sintassi

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

Altre informazioni sulle convenzioni di sintassi.

Parametri

Nome Digita Obbligatorio Descrizione
lineString dynamic ✔️ Riga o multilinea nel formato GeoJSON.
level int Definisce il livello di cella richiesto. I valori supportati sono compresi nell'intervallo [0, 30]. Se non specificato, viene usato il valore predefinito 11.
raggio real Raggio del buffer in metri. Se non specificato, viene usato il valore predefinito 0.

Valori restituiti

Matrice di stringhe di token di cella S2 che coprono una riga o una multilinea. Se il raggio è impostato su un valore positivo, la copertura sarà sia della forma di input che di tutti i punti all'interno del raggio della geometria di input.

Se una delle righe, il livello, il raggio non è valido o il numero di celle supera il limite, la query genererà un risultato Null.

Nota

  • Coprire la linea con i token di cella S2 può essere utile nella corrispondenza delle coordinate alle linee, trovando così punti nelle vicinanze.
  • I token di copertura linea sono dello stesso livello di cella S2.
  • Il numero massimo di token per riga è 65536.
  • Il datum geodetico usato per misurare la distanza sulla Terra è una sfera. I bordi delle linee sono geodesici sulla sfera.
  • Se i bordi della linea di input sono linee cartesiane dritte, è consigliabile usare geo_line_densify() per convertire i bordi planari in geodesici.

Scelta del livello di cella S2

  • Idealmente, si vuole coprire ogni linea con una o solo poche celle uniche in modo che nessuna due righe convida la stessa cella.
  • In pratica, provare a coprire con poche cellule, non più di una dozzina. La copertura con più di 10.000 celle potrebbe non produrre buone prestazioni.
  • Il tempo di esecuzione delle query e il consumo di memoria potrebbero variare notevolmente a causa di valori diversi a livello di cella S2.

Suggerimenti per il miglioramento delle prestazioni

  • Se possibile, ridurre le dimensioni della tabella prima del join, raggruppando le coordinate molto vicine tra loro usando il clustering geospaziale o filtrando le coordinate non necessarie a causa della natura dei dati o delle esigenze aziendali.
  • Se possibile, ridurre il numero di righe a causa della natura dei dati o delle esigenze aziendali. Filtrare le righe non necessarie prima del join, definire l'ambito per l'area di interesse o unificare le righe.
  • In caso di linee molto grandi, ridurre le dimensioni usando geo_line_simplify().
  • La modifica del livello di cella S2 può migliorare le prestazioni e il consumo di memoria.
  • La modifica del tipo di join e l'hint possono migliorare le prestazioni e il consumo di memoria.
  • Nel caso in cui il raggio positivo sia impostato, il ripristino al raggio 0 sulla forma memorizzata nel buffer tramite geo_line_buffer() può migliorare le prestazioni.

Esempi

La query seguente trova tutte le stazioni ferroviarie entro 500 metri di strade e aggrega i tubi conteggiati in base al nome della strada.

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 numero
Palace Di Palace 1
Ponte di Londra 1

In caso di riga non valida, verrà restituito un risultato Null.

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