Kurz: Vytváření geoprostorových vizualizací

Tento kurz je určený pro ty, kteří chtějí použít dotazovací jazyk Kusto (KQL) pro geoprostorovou vizualizaci. Geoprostorový clustering je způsob, jak uspořádat a analyzovat data na základě zeměpisné polohy. KQL nabízí několik metod pro provádění geoprostorových clusteringů a nástroje pro geoprostorové vizualizace.

V tomto kurzu se naučíte:

Vykreslení bodů na mapě

Pokud chcete vizualizovat body na mapě, vyberte pomocí projektu sloupec obsahující zeměpisnou délku a potom sloupec obsahující zeměpisnou šířku. Potom pomocí vykreslení zobrazte výsledky v bodovém grafu s nastavenou kind na maphodnotu .

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

Snímek obrazovky s ukázkovými událostmi storm na mapě

Vykreslení více řad bodů

Pokud chcete vizualizovat více řad bodů, pomocí projektu vyberte zeměpisnou délku a šířku spolu s třetím sloupcem, který řadu definuje.

V následujícím dotazu je EventTypetato řada . Body jsou vybarveny odlišně podle jejich EventTypea při výběru zobrazí obsah EventType sloupce.

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

Snímek obrazovky s ukázkovými událostmi storm na mapě podle typu

Můžete také explicitně zadat xcolumn hodnoty (Zeměpisná délka), ycolumn (Zeměpisná šířka) a series při provádění renderpříkazu . Tato specifikace je nezbytná, pokud je ve výsledku více sloupců než jen sloupce zeměpisné délky, šířky a řady.

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

Použití hodnot GeoJSON k vykreslení bodů na mapě

Dynamická hodnota GeoJSON se může měnit nebo aktualizovat a často se používá pro aplikace mapování v reálném čase. Mapování bodů pomocí dynamických hodnot GeoJSON umožňuje větší flexibilitu a kontrolu nad reprezentací dat na mapě, která nemusí být možná s hodnotami prosté zeměpisné šířky a délky.

Následující dotaz používá geo_point_to_s2cell a geo_s2cell_to_central_point k mapování událostí storm v bodovém grafu.

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)

Snímek obrazovky s ukázkovými událostmi storm zobrazenými pomocí geojsonu

Reprezentace datových bodů s bublinami s proměnlivou velikostí

Vizualizujte rozdělení datových bodů provedením agregace v každém clusteru a následným vykreslením centrálního bodu clusteru.

Například následující dotaz filtruje všechny události storm typu "Tornado". Pak seskupí události do shluků na základě jejich zeměpisné délky a šířky, spočítá počet událostí v každém clusteru, promítá centrální bod clusteru a vykreslí mapu pro vizualizaci výsledku. Oblasti s největším počtem tornád se jasně detekují na základě jejich velké velikosti bublin.

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)

Snímek obrazovky webového uživatelského rozhraní Azure Data Explorer zobrazující geoprostorovou mapu tornádových bouřek

Zobrazení bodů v určité oblasti

Mnohoúhelník slouží k definování oblasti a funkce geo_point_in_polygon k filtrování událostí, ke kterým v této oblasti dochází.

Následující dotaz definuje mnohoúhelník představující oblast jižní Kalifornie a filtruje události bouře v této oblasti. Potom seskupí události do clusterů, spočítá počet událostí v každém clusteru, promítá centrální bod clusteru a vykreslí mapu pro vizualizaci clusterů.

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)

Snímek obrazovky webového uživatelského rozhraní Azure Data Explorer zobrazující geoprostorovou mapu bouřek v jižní Kalifornii

Zobrazení okolních bodů na čáry

Následující dotaz vyhledá okolní události storm, ke kterým dochází podél zadaného řetězce LineString, který představuje definovanou cestu. V tomto případě je LineString cesta do Key West. Funkce geo_distance_point_to_line() slouží k filtrování událostí storm na základě jejich blízkosti k definovanému linestringu. Pokud se událost nachází v okruhu 500 metrů od linestringu, vykreslí se na mapě.

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)

Snímek obrazovky s výsledkem předchozího dotazu KQL pro výpočet událostí podél spojnicového řetězce

Zobrazení okolních bodů v mnohoúhelníku

Následující dotaz najde okolní události storm, ke kterým dochází v rámci zadaného mnohoúhelníku. V tomto případě je mnohoúhelník cestou ke Key West. Funkce geo_distance_point_to_polygon() slouží k filtrování událostí bouře na základě jejich blízkosti k definovanému mnohoúhelníku. Pokud je událost vzdálena do 500 metrů od mnohoúhelníku, vykreslí se na mapě.

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)

Snímek obrazovky s výsledkem předchozího dotazu KQL pro výpočet událostí podél mnohoúhelníku

Vyhledání anomálií na základě geoprostorových dat

Následující dotaz provede analýzu událostí stormu, ke kterým dochází v určitém stavu. Dotaz používá buňky S2 a časovou agregaci k prozkoumání vzorců poškození. Výsledkem je vizuální graf anomálií, který znázorňuje případné nepravidelnosti nebo odchylky v průběhu času způsobené bouří a nabízí podrobný pohled na vliv bouřek v rámci zadaných hranic států.

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)

Snímek obrazovky s grafem anomálií vykresleným předchozím dotazem KQL