geo_line_to_s2cells()
Si applica a: ✅Microsoft Fabric✅Azure Esplora dati✅ Azure Monitor✅Microsoft 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 |