geo_line_to_s2cells()
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Berechnet S2-Zelltoken, die eine Linie oder eine mehrzeilige Erde abdecken. Diese Funktion ist ein nützliches Geospatialbeitrittstool.
Weitere Informationen zur S2-Zellhierarchie.
Syntax
geo_line_to_s2cells(
lineString [,
level[ ,
radius]])
Erfahren Sie mehr über Syntaxkonventionen.
Parameter
Name | Type | Erforderlich | Beschreibung |
---|---|---|---|
lineString | dynamic |
✔️ | Linie oder mehrzeilige Linien im GeoJSON-Format. |
level | int |
Definiert die angeforderte Zellenebene. Unterstützte Werte befinden sich im Bereich [0, 30]. Wenn nichts angegeben wird, wird der Standardwert 11 verwendet. |
|
Radius | real |
Pufferradius in Metern. Wenn nichts angegeben wird, wird der Standardwert 0 verwendet. |
Gibt zurück
Array von S2-Zellentokenzeichenfolgen, die eine Linie oder eine mehrzeilige Linie abdecken. Wenn der Radius auf einen positiven Wert festgelegt ist, entspricht die Abdeckung sowohl dem Eingabe-Shape als auch allen Punkten innerhalb des Radius der Eingabegeometrie.
Wenn einer der folgenden Werte: Zeile, Ebene, Radius ungültig ist oder die Zellanzahl den Grenzwert überschreitet, erzeugt die Abfrage ein NULL-Ergebnis.
Hinweis
- Die Abdeckung der Linie mit S2-Zelltoken kann bei der Übereinstimmung von Koordinaten mit Linien hilfreich sein, wodurch Punkte in der Nähe gefunden werden.
- Die Zeilenüberdeckungstoken weisen die gleiche S2-Zellebene auf.
- Die maximale Anzahl von Token pro Zeile beträgt 65536.
- Das geodetische Datum , das zum Messen der Entfernung auf der Erde verwendet wird, ist eine Kugel. Linienränder sind geodätische Ränder auf der Kugel.
- Wenn Eingabelinien gerade kartesische Linien sind, sollten Sie geo_line_densify() verwenden, um planare Kanten in geodätische Ränder zu konvertieren.
Auswählen der S2-Zellenebene
- Im Idealfall möchten wir jede Zeile mit einer oder nur wenigen eindeutigen Zellen abdecken, sodass keine zwei Zeilen dieselbe Zelle gemeinsam nutzen.
- Versuchen Sie in der Praxis, nur wenige Zellen abzudecken, nicht mehr als ein Dutzend. Eine Abdeckung mit mehr als 10.000 Zellen führt möglicherweise nicht zu einer guten Leistung.
- Die Laufzeit der Abfrage und der Arbeitsspeicherverbrauch können sich aufgrund unterschiedlicher Werte auf S2-Zellebene erheblich unterscheiden.
Vorschläge zur Leistungsverbesserung
- Reduzieren Sie ggf. die Tabellengröße der Koordinaten vor der Verknüpfung, indem Sie Koordinaten gruppieren, die sich sehr nah beieinander befinden, indem Sie geospatiale Clustering verwenden oder unnötige Koordinaten aufgrund der Art der Daten oder geschäftlichen Anforderungen herausfiltern.
- Verringern Sie nach Möglichkeit die Zeilenanzahl aufgrund der Art der Daten oder geschäftlichen Anforderungen. Filtern Sie unnötige Zeilen vor dem Verbinden, bereichsbezogene Bereiche auf den Interessenbereich oder vereinheitlichen Sie Linien.
- Reduzieren Sie bei sehr großen Linien ihre Größe mithilfe von geo_line_simplify().
- Das Ändern der S2-Zellebene kann die Leistung und den Arbeitsspeicherverbrauch verbessern.
- Das Ändern der Verknüpfungsart und hinweise kann die Leistung und den Arbeitsspeicherverbrauch verbessern.
- Wenn ein positiver Radius festgelegt ist, kann das Wiederherstellen des Radius 0 für gepufferte Form mit geo_line_buffer() die Leistung verbessern.
Beispiele
Die folgende Abfrage findet alle Röhrenstationen innerhalb von 500 Metern Straßen und aggregiert Röhren nach Straßenname.
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 |
---|---|
Buckingham Palace | 1 |
London Bridge | 1 |
Bei ungültiger Zeile wird ein NULL-Ergebnis zurückgegeben.
let line = dynamic({"type":"LineString","coordinates":[[[0,0],[0,0]]]});
print isnull(geo_line_to_s2cells(line))
print_0 |
---|
True |