Freigeben über


Lernprogramm: Erstellen von geospatialen Visualisierungen

Gilt für: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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:

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:

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 mapfestgelegt ist.

StormEvents
| take 100
| project BeginLon, BeginLat
| render scatterchart with (kind = map)

Screenshot von Beispiel-Sturmereignissen auf einer Karte.

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 EventTypedie Datenreihe . Die Punkte werden entsprechend ihrer EventTypeFarbe 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)

Screenshot von Beispielsturmereignissen auf einer Karte nach Typ.

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)

Screenshot von Beispielsturmereignissen, die mithilfe von Geojson angezeigt werden.

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)

Screenshot der Azure Data Explorer-Webbenutzeroberfläche mit einer geospatialen Karte von Tornado-Stürmen.

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)

Screenshot der Azure Data Explorer-Webbenutzeroberfläche mit einer geospatialen Karte von Südkalifornien-Stürmen.

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)

Screenshot des Ergebnisses der vorherigen KQL-Abfrage zum Berechnen von Ereignissen entlang eines LineString-Objekts.

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)

Screenshot des Ergebnisses der vorherigen KQL-Abfrage zum Berechnen von Ereignissen entlang eines Polygons.

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)

Screenshot des Anomaliediagramms, das von der vorherigen KQL-Abfrage gerendert wird.