Lernprogramm: Erstellen von geospatialen Visualisierungen
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Dieses Lernprogramm richtet sich an diejenigen, die Kusto-Abfragesprache (KQL) für geospatiale Visualisierung verwenden möchten. Geospatialclustering ist eine Möglichkeit, Daten basierend auf geografischem Standort zu organisieren und zu analysieren. KQL bietet mehrere Methoden zum Ausführen von Geospatialclustering und Tools für geospatiale Visualisierungen.
In diesem Tutorial lernen Sie Folgendes:
- Zeichnen von Punkten auf einer Karte
- Zeichnen mehrerer Punktreihen
- Verwenden von GeoJSON-Werten zum Zeichnen von Punkten auf einer Karte
- Darstellen von Datenpunkten mit blasenvariabler Größe
- Anzeigen von Punkten innerhalb eines bestimmten Bereichs
- Anzeigen von in der Nähe befindlichen Punkten in einem LineString
- Anzeigen von in der Nähe befindlichen Punkten in einem Polygon
- Suchen von Anomalien basierend auf geospatialen Daten
Voraussetzungen
Zum Ausführen der folgenden Abfragen benötigen Sie eine Abfrageumgebung mit Zugriff auf die Beispieldaten. Sie können eine der folgenden Anwendungen verwenden:
- Ein Microsoft-Konto oder eine Microsoft Entra-Benutzeridentität, um sich beim Hilfecluster anzumelden
- Ein Microsoft-Konto oder eine Microsoft Entra-Benutzeridentität
- Ein Fabric-Arbeitsbereich mit einer Microsoft Fabric-fähigen Kapazität
Zeichnen von Punkten auf einer Karte
Um Punkte auf einer Karte zu visualisieren, verwenden Sie das Projekt , um die Spalte auszuwählen, die den Längengrad und dann die Spalte mit dem Breitengrad enthält. Verwenden Sie dann rendern , um Die Ergebnisse in einem Punktdiagramm anzuzeigen, auf das kind
map
festgelegt ist.
StormEvents
| take 100
| project BeginLon, BeginLat
| render scatterchart with (kind = map)
Zeichnen mehrerer Punktreihen
Um mehrere Punktreihen zu visualisieren, verwenden Sie das Projekt , um den Längengrad und den Breitengrad zusammen mit einer dritten Spalte auszuwählen, die die Datenreihe definiert.
In der folgenden Abfrage ist EventType
die Datenreihe . Die Punkte werden entsprechend ihrer EventType
Farbe unterschiedlich gefärbt, und wenn ausgewählt, wird der Inhalt der EventType
Spalte angezeigt.
StormEvents
| take 100
| project BeginLon, BeginLat, EventType
| render scatterchart with (kind = map)
Sie können auch explizit die xcolumn
(Längengrad), ycolumn
(Breitengrad) und series
bei der Ausführung der render
. Diese Spezifikation ist erforderlich, wenn es mehr Spalten im Ergebnis gibt als nur die Längen-, Breiten- und Reihenspalten.
StormEvents
| take 100
| render scatterchart with (kind = map, xcolumn = BeginLon, ycolumns = BeginLat, series = EventType)
Verwenden von GeoJSON-Werten zum Zeichnen von Punkten auf einer Karte
Ein dynamischer GeoJSON-Wert kann sich ändern oder aktualisieren und wird häufig für Echtzeitzuordnungsanwendungen verwendet. Zuordnungspunkte mit dynamischen GeoJSON-Werten ermöglichen mehr Flexibilität und Kontrolle über die Darstellung der Daten auf der Karte, die möglicherweise nicht mit einfachen Breiten- und Längengradwerten möglich sind.
Die folgende Abfrage verwendet die geo_point_to_s2cell und geo_s2cell_to_central_point , um Sturmereignisse in einem Punktdiagramm zuzuordnen.
StormEvents
| project BeginLon, BeginLat
| summarize by hash=geo_point_to_s2cell(BeginLon, BeginLat, 5)
| project point = geo_s2cell_to_central_point(hash)
| project lng = toreal(point.coordinates[0]), lat = toreal(point.coordinates[1])
| render scatterchart with (kind = map)
Darstellen von Datenpunkten mit blasenvariabler Größe
Visualisieren Sie die Verteilung von Datenpunkten, indem Sie eine Aggregation in jedem Cluster durchführen und dann den zentralen Punkt des Clusters darstellen.
Beispielsweise filtert die folgende Abfrage nach allen Sturmereignissen des Ereignistyps "Tornado". Anschließend werden die Ereignisse basierend auf Längengrad und Breitengrad in Cluster gruppiert, die Anzahl der Ereignisse in jedem Cluster gezählt und der zentrale Punkt des Clusters projiziert und eine Karte gerendert, um das Ergebnis zu visualisieren. Die Regionen mit den meisten Tornados werden anhand ihrer großen Blasengröße deutlich erkannt.
StormEvents
| where EventType == "Tornado"
| project BeginLon, BeginLat
| where isnotnull(BeginLat) and isnotnull(BeginLon)
| summarize count_summary=count() by hash = geo_point_to_s2cell(BeginLon, BeginLat, 4)
| project geo_s2cell_to_central_point(hash), count_summary
| extend Events = "count"
| render piechart with (kind = map)
Anzeigen von Punkten innerhalb eines bestimmten Bereichs
Verwenden Sie ein Polygon, um den Bereich und die geo_point_in_polygon-Funktion zu definieren, um nach Ereignissen zu filtern, die innerhalb dieses Bereichs auftreten.
Die folgende Abfrage definiert ein Polygon, das die Region Südkalifornien darstellt, und filtert nach Sturmereignissen innerhalb dieser Region. Anschließend werden die Ereignisse in Cluster gruppiert, die Anzahl der Ereignisse in jedem Cluster gezählt, der zentrale Punkt des Clusters projiziert und eine Karte gerendert, um die Cluster zu visualisieren.
let southern_california = dynamic({
"type": "Polygon",
"coordinates": [[[-119.5, 34.5], [-115.5, 34.5], [-115.5, 32.5], [-119.5, 32.5], [-119.5, 34.5]]
]});
StormEvents
| where geo_point_in_polygon(BeginLon, BeginLat, southern_california)
| project BeginLon, BeginLat
| summarize count_summary = count() by hash = geo_point_to_s2cell(BeginLon, BeginLat, 8)
| project geo_s2cell_to_central_point(hash), count_summary
| extend Events = "count"
| render piechart with (kind = map)
Anzeigen von in der Nähe befindlichen Punkten in einem LineString
Die folgende Abfrage findet nahe gelegene Sturmereignisse, die entlang eines angegebenen LineString-Objekts auftreten, das einen definierten Pfad darstellt. In diesem Fall ist lineString eine Straße nach Key West. Die funktion geo_distance_point_to_line() wird verwendet, um die Sturmereignisse basierend auf ihrer Nähe zum definierten LineString zu filtern. Wenn ein Ereignis innerhalb von 500 Metern von LineString entfernt ist, wird das Ereignis auf einer Karte gerendert.
let roadToKeyWest = dynamic({
"type":"linestring",
"coordinates":[
[
-81.79595947265625,
24.56461038017685
],
[
-81.595458984375,
24.627044746156027
],
[
-81.52130126953125,
24.666986385216273
],
[
-81.35650634765625,
24.66449040712424
],
[
-81.32354736328125,
24.647017162630366
],
[
-80.8099365234375,
24.821639356846607
],
[
-80.62042236328125,
24.93127614538456
],
[
-80.37872314453125,
25.175116531621764
],
[
-80.42266845703124,
25.19251511519153
],
[
-80.4803466796875,
25.46063471847754
]
]});
StormEvents
| where isnotempty(BeginLat) and isnotempty(BeginLon)
| project BeginLon, BeginLat, EventType
| where geo_distance_point_to_line(BeginLon, BeginLat, roadToKeyWest) < 500
| render scatterchart with (kind=map)
Anzeigen von in der Nähe befindlichen Punkten in einem Polygon
Die folgende Abfrage findet In der Nähe befindliche Sturmereignisse, die innerhalb eines angegebenen Polygons auftreten. In diesem Fall ist das Polygon eine Straße nach Key West. Die funktion geo_distance_point_to_polygon() wird verwendet, um die Sturmereignisse basierend auf ihrer Nähe zum definierten Polygon zu filtern. Wenn ein Ereignis innerhalb von 500 Metern des Polygons liegt, wird das Ereignis auf einer Karte gerendert.
let roadToKeyWest = dynamic({
"type":"polygon",
"coordinates":[
[
[
-80.08209228515625,
25.39117928167583
],
[
-80.4913330078125,
25.517657429994035
],
[
-80.57922363281249,
25.477992320574817
],
[
-82.188720703125,
24.632038149596895
],
[
-82.1942138671875,
24.53712939907993
],
[
-82.13104248046875,
24.412140070651528
],
[
-81.81243896484375,
24.43714786161562
],
[
-80.58746337890625,
24.794214972389486
],
[
-80.08209228515625,
25.39117928167583
]
]
]});
StormEvents
| where isnotempty(BeginLat) and isnotempty(BeginLon)
| project BeginLon, BeginLat, EventType
| where geo_distance_point_to_polygon(BeginLon, BeginLat, roadToKeyWest) < 500
| render scatterchart with (kind=map)
Suchen von Anomalien basierend auf geospatialen Daten
Die folgende Abfrage führt eine Analyse von Sturmereignissen aus, die innerhalb eines bestimmten Zustands auftreten. Die Abfrage verwendet S2-Zellen und zeitliche Aggregation, um Schadensmuster zu untersuchen. Das Ergebnis ist ein visuelles Anomaliediagramm, das Unregelmäßigkeiten oder Abweichungen bei der sturminduzierten Zerstörung im Laufe der Zeit darstellt und eine detaillierte Perspektive auf die Wirkung von Stürmen innerhalb der angegebenen Zustandsgrenzen bietet.
let stateOfInterest = "Texas";
let statePolygon = materialize(
US_States
| extend name = tostring(features.properties.NAME)
| where name == stateOfInterest
| project geometry=features.geometry);
let stateCoveringS2cells = statePolygon
| project s2Cells = geo_polygon_to_s2cells(geometry, 9);
StormEvents
| extend s2Cell = geo_point_to_s2cell(BeginLon, BeginLat, 9)
| where s2Cell in (stateCoveringS2cells)
| where geo_point_in_polygon(BeginLon, BeginLat, toscalar(statePolygon))
| make-series damage = avg(DamageProperty + DamageCrops) default = double(0.0) on StartTime step 7d
| extend anomalies=series_decompose_anomalies(damage)
| render anomalychart with (anomalycolumns=anomalies)
Zugehöriger Inhalt
- Siehe Anwendungsfall für geospatiale Clustering: Datenanalyse für Fahrzeugtestflotten
- Informationen zur Azure-Architektur für geospatiale Datenverarbeitung und -analyse
- Erhalten Sie ein umfassendes Verständnis des Azure-Daten-Explorers, indem Sie das Whitepaper lesen.