Delen via


Zelfstudie: Georuimtelijke visualisaties maken

Van toepassing op: ✅Microsoft FabricAzure Data ExplorerAzure MonitorMicrosoft Sentinel

Deze zelfstudie is bedoeld voor degenen die Kusto Query Language (KQL) willen gebruiken voor georuimtelijke visualisatie. Georuimtelijke clustering is een manier om gegevens te organiseren en analyseren op basis van geografische locatie. KQL biedt meerdere methoden voor het uitvoeren van georuimtelijke clustering en hulpprogramma's voor georuimtelijke visualisaties.

In deze handleiding leer je hoe je:

Vereiste voorwaarden

Als u de volgende query's wilt uitvoeren, hebt u een queryomgeving nodig met toegang tot de voorbeeldgegevens. U kunt een van de volgende opties gebruiken:

  • Een Microsoft-account of Microsoft Entra-gebruikersidentiteit om u aan te melden bij het Help-cluster
  • Een Microsoft-account of Microsoft Entra-gebruikersidentiteit
  • Een Fabric-werkruimte met een Microsoft Fabric-ingeschakelde capaciteit

Punten op een kaart tekenen

Als u punten op een kaart wilt visualiseren, gebruikt u een project om de kolom met de lengtegraad en vervolgens de kolom met de breedtegraad te selecteren. Gebruik vervolgens render om uw resultaten in een spreidingsdiagram weer te geven met kind ingesteld op map.

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

Schermopname van stormgebeurtenissen op een kaart.

Meerdere reeks punten tekenen

Als u meerdere reeks punten wilt visualiseren, gebruikt u project om de lengtegraad en breedtegraad te selecteren, samen met een derde kolom, waarmee de reeks wordt gedefinieerd.

In de volgende query is de reeks EventType. De punten zijn verschillend gekleurd op basis van hun EventType, en wanneer deze optie is geselecteerd, wordt de inhoud van de EventType kolom weergegeven.

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

Schermopname van stormgebeurtenissen op een kaart per type.

U kunt ook expliciet de xcolumn (lengtegraad), ycolumn (breedtegraad) en series specificeren bij het uitvoeren van de render. Deze specificatie is nodig wanneer er meer kolommen in het resultaat zijn dan alleen de kolommen lengtegraad, breedtegraad en reeks.

StormEvents
| take 100
| render scatterchart with (kind = map, xcolumn = BeginLon, ycolumns = BeginLat, series = EventType)

GeoJSON-waarden gebruiken om punten op een kaart te tekenen

Een dynamische GeoJSON-waarde kan worden gewijzigd of bijgewerkt en worden vaak gebruikt voor realtime-toewijzingstoepassingen. Het in kaart brengen van punten met behulp van dynamische GeoJSON-waarden biedt meer flexibiliteit en controle over de presentatie van data op de kaart, die misschien niet mogelijk is met alleen eenvoudige breedte- en lengtegraadwaarden.

De volgende query maakt gebruik van de geo_point_to_s2cell en geo_s2cell_to_central_point om stormgebeurtenissen in een spreidingsdiagram toe te wijzen.

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)

Schermopname van stormgebeurtenissen die worden weergegeven met behulp van geojson.

Gegevenspunten weergeven met bubbels van variabele grootte

Visualiseer de distributie van gegevenspunten door een aggregatie uit te voeren in elk cluster en vervolgens het centrale punt van het cluster uit te tekenen.

De volgende query filtert bijvoorbeeld op alle storm-gebeurtenissen van het gebeurtenistype Tornado. Vervolgens worden de gebeurtenissen gegroepeerd in clusters op basis van hun lengte- en breedtegraad, wordt het aantal gebeurtenissen in elk cluster geteld en wordt het centrale punt van het cluster geprojecteert en wordt een kaart weergegeven om het resultaat te visualiseren. De regio's met de meeste tornado's worden duidelijk gedetecteerd op basis van hun grote bellengrootte.

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)

Schermopname van de webinterface van Azure Data Explorer met een georuimtelijke kaart van tornadostormen.

Punten binnen een specifiek gebied weergeven

Gebruik een veelhoek om de regio en de functie geo_point_in_polygon te definiëren om te filteren op gebeurtenissen die zich in die regio voordoen.

De volgende query definieert een veelhoek die de regio Zuid-Californië vertegenwoordigt en filtert op stormevenementen binnen deze regio. Vervolgens worden de gebeurtenissen gegroepeerd in clusters, wordt het aantal gebeurtenissen in elk cluster geteld, wordt het centrale punt van het cluster geprojecteert en wordt een kaart weergegeven om de clusters te visualiseren.

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)

Schermopname van de webgebruikersinterface van Azure Data Explorer met een georuimtelijke kaart van zuid-Californië stormen.

Punten in de buurt weergeven op een LineString

De volgende query vindt storm-gebeurtenissen in de buurt die plaatsvinden langs een opgegeven LineString, die een gedefinieerd pad vertegenwoordigt. In dit geval is LineString een weg naar Key West. De functie geo_distance_point_to_line() wordt gebruikt om de storm-gebeurtenissen te filteren op basis van de nabijheid van de gedefinieerde LineString. Als een gebeurtenis zich binnen 500 meter van LineString bevindt, wordt de gebeurtenis weergegeven op een kaart.

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)

Schermopname van het resultaat van de vorige KQL-query om gebeurtenissen langs een LineString te berekenen.

Nabijgelegen punten binnen een veelhoek weergeven

Met de volgende query worden stormen in de buurt opgespoord die plaatsvinden binnen een gespecificeerde veelhoek. In dit geval is de veelhoek een weg naar Key West. De functie geo_distance_point_to_polygon() wordt gebruikt om de storm-gebeurtenissen te filteren op basis van de nabijheid van de gedefinieerde veelhoek. Als een gebeurtenis zich binnen 500 meter van de veelhoek bevindt, wordt de gebeurtenis weergegeven op een kaart.

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)

Schermopname van het resultaat van de vorige KQL-query om gebeurtenissen langs een veelhoek te berekenen.

Afwijkingen zoeken op basis van georuimtelijke gegevens

Met de volgende query wordt een analyse uitgevoerd van storm-gebeurtenissen die zich binnen een bepaalde status voordoen. De query maakt gebruik van S2-cellen en tijdelijke aggregatie om patronen van schade te onderzoeken. Het resultaat is een visueel anomaliediagram dat onregelmatigheden of afwijkingen in door storm geïnduceerde vernietiging in de loop van de tijd weergeeft, wat een gedetailleerd perspectief biedt op het effect van stormen binnen de opgegeven staatsgrenzen.

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)

Schermopname van het anomaliediagram dat wordt weergegeven door de vorige KQL-query.