Samouczek: tworzenie wizualizacji geoprzestrzennych

Ten samouczek jest przeznaczony dla osób, które chcą używać język zapytań Kusto (KQL) do wizualizacji geoprzestrzennych. Klastrowanie geoprzestrzenne to sposób organizowania i analizowania danych na podstawie lokalizacji geograficznej. Język KQL oferuje wiele metod wykonywania klastrów geoprzestrzennych i narzędzi do wizualizacji geoprzestrzennych.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

Wykres punktów na mapie

Aby zwizualizować punkty na mapie, użyj projektu , aby wybrać kolumnę zawierającą długość geograficzną, a następnie kolumnę zawierającą szerokość geograficzną. Następnie użyj renderowania , aby wyświetlić wyniki na wykresie punktowym z ustawioną wartością kindmap.

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

Zrzut ekranu przedstawiający przykładowe zdarzenia burzy na mapie.

Kreślenie wielu serii punktów

Aby zwizualizować wiele serii punktów, użyj projektu , aby wybrać długość geograficzną i szerokość geograficzną wraz z trzecią kolumną, która definiuje serię.

W poniższym zapytaniu seria to EventType. Punkty są kolorowane inaczej w zależności od wartości EventType, a po wybraniu EventType opcji wyświetl zawartość kolumny.

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

Zrzut ekranu przedstawiający przykładowe zdarzenia burzy na mapie według typu.

Możesz również jawnie określić xcolumn wartość (Długość geograficzna), ycolumn Szerokość geograficzna i series podczas wykonywania operacji render. Ta specyfikacja jest niezbędna, gdy w wyniku znajduje się więcej kolumn niż tylko długość geograficzna, szerokość geograficzna i kolumny serii.

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

Używanie wartości GeoJSON do kreślenia punktów na mapie

Dynamiczna wartość GeoJSON może ulec zmianie lub zaktualizować i jest często używana w aplikacjach do mapowania w czasie rzeczywistym. Punkty mapowania używające dynamicznych wartości GeoJSON umożliwiają większą elastyczność i kontrolę nad reprezentacją danych na mapie, które mogą nie być możliwe przy użyciu zwykłych wartości szerokości geograficznej i długości geograficznej.

Poniższe zapytanie używa geo_point_to_s2cell i geo_s2cell_to_central_point do mapowania zdarzeń burzy na wykresie punktowym.

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)

Zrzut ekranu przedstawiający przykładowe zdarzenia burzy wyświetlane przy użyciu danych geojson.

Reprezentacja punktów danych za pomocą bąbelków o zmiennym rozmiarze

Wizualizuj rozkład punktów danych, wykonując agregację w każdym klastrze, a następnie kreśląc centralny punkt klastra.

Na przykład następujące zapytanie filtruje wszystkie zdarzenia burzy typu zdarzenia "Tornado". Następnie grupuje zdarzenia w klastrach na podstawie ich długości geograficznej i szerokości geograficznej, zlicza liczbę zdarzeń w każdym klastrze oraz projektuje centralny punkt klastra i renderuje mapę w celu wizualizacji wyniku. Regiony z największą ilością tornada stają się wyraźnie wykrywane w oparciu o ich duży rozmiar bąbelka.

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)

Zrzut ekranu przedstawiający internetowy interfejs użytkownika usługi Azure Data Explorer przedstawiający geoprzestrzenną mapę burz tornada.

Wyświetlanie punktów w określonym obszarze

Użyj wielokąta, aby zdefiniować region i funkcję geo_point_in_polygon w celu filtrowania zdarzeń występujących w tym regionie.

Poniższe zapytanie definiuje wielokąt reprezentujący południowy region Kalifornii i filtruje zdarzenia burzy w tym regionie. Następnie grupuje zdarzenia w klastry, zlicza liczbę zdarzeń w każdym klastrze, projektuje centralny punkt klastra i renderuje mapę w celu wizualizacji klastrów.

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)

Zrzut ekranu przedstawiający internetowy interfejs użytkownika usługi Azure Data Explorer przedstawiający geoprzestrzenną mapę południowych burz Kalifornii.

Pokazywanie pobliskich punktów na lineString

Następujące zapytanie znajduje zdarzenia burzy w pobliżu, które występują wzdłuż określonego ciągu LineString, który reprezentuje zdefiniowaną ścieżkę. W tym przypadku lineString jest drogą do Key West. Funkcja geo_distance_point_to_line() służy do filtrowania zdarzeń burzy w oparciu o ich bliskość do zdefiniowanego ciągu LineString. Jeśli zdarzenie znajduje się w odległości 500 metrów od lineString, zdarzenie jest renderowane na mapie.

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)

Zrzut ekranu przedstawiający wynik poprzedniego zapytania KQL w celu obliczenia zdarzeń wzdłuż ciągu LineString.

Pokazywanie pobliskich punktów w wielokącie

Poniższe zapytanie znajduje zdarzenia burzy w pobliżu, które występują w określonym wielokącie. W tym przypadku wielokąt jest drogą do Key West. Funkcja geo_distance_point_to_polygon() służy do filtrowania zdarzeń burzy w oparciu o ich bliskość do zdefiniowanego wielokąta. Jeśli zdarzenie znajduje się w odległości 500 metrów od wielokąta, zdarzenie jest renderowane na mapie.

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)

Zrzut ekranu przedstawiający wynik poprzedniego zapytania KQL w celu obliczenia zdarzeń wzdłuż wielokąta.

Znajdowanie anomalii na podstawie danych geoprzestrzennych

Poniższe zapytanie wykonuje analizę zdarzeń burzy występujących w określonym stanie. Zapytanie używa komórek S2 i agregacji czasowej do badania wzorców uszkodzeń. Wynikiem jest wizualny wykres anomalii, który przedstawia wszelkie nieprawidłowości lub odchylenia w zniszczeniach wywołanych burzami w czasie, oferując szczegółową perspektywę wpływu burz w określonych granicach stanu.

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)

Zrzut ekranu przedstawiający wykres anomalii renderowany przez poprzednie zapytanie KQL.