Samouczek: tworzenie wizualizacji geoprzestrzennych
Dotyczy: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Ten samouczek dotyczy osób, które chcą używać język zapytań Kusto (KQL) na potrzeby 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:
- Kreślenie punktów na mapie
- Wykreśl wiele serii punktów
- Używanie wartości GeoJSON do kreślenia punktów na mapie
- Reprezentacja punktów danych za pomocą bąbelków o zmiennym rozmiarze
- Wyświetlanie punktów w określonym obszarze
- Pokazywanie pobliskich punktów na lineString
- Pokaż pobliskie punkty w wielokącie
- Znajdowanie anomalii na podstawie danych geoprzestrzennych
Wymagania wstępne
Aby uruchomić następujące zapytania, potrzebujesz środowiska zapytań z dostępem do przykładowych danych. Możesz użyć jednej z następujących opcji:
- Konto Microsoft lub tożsamość użytkownika Microsoft Entra w celu zalogowania się do klastra pomocy
- Konto Microsoft lub tożsamość użytkownika Entra firmy Microsoft
- Obszar roboczy sieci szkieletowej z pojemnością z włączoną usługą Microsoft Fabric
Kreślenie punktów na mapie
Aby wizualizować 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ą kind
map
.
StormEvents
| take 100
| project BeginLon, BeginLat
| render scatterchart with (kind = map)
Wykreśl wiele 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 zgodnie z wartościami EventType
i po wybraniu wyświetlania EventType
zawartości kolumny.
StormEvents
| take 100
| project BeginLon, BeginLat, EventType
| render scatterchart with (kind = map)
Można również jawnie określić xcolumn
(Długość geograficzna), ycolumn
(Szerokość geograficzna) i series
podczas wykonywania .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 dla aplikacji 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)
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ą tornad stają się wyraźnie wykrywane na podstawie ich dużego rozmiaru 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)
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 region południowej Kalifornii i filtry dla zdarzeń 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)
Pokazywanie pobliskich punktów na lineString
Poniższe zapytanie znajduje pobliskie zdarzenia burzy, 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)
Pokaż pobliskie punkty w wielokącie
Poniższe zapytanie znajduje pobliskie zdarzenia burzy, 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)
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 zbadania wzorców uszkodzeń. Wynik jest wizualnym wykresem anomalii, który przedstawia wszelkie nieprawidłowości lub odchylenia w niszczeniu wywołanym przez burzę 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)
Powiązana zawartość
- Zobacz przypadek użycia klastrowania geoprzestrzennego: analiza danych dla flot testów samochodowych
- Dowiedz się więcej o architekturze platformy Azure na potrzeby przetwarzania i analizy danych geoprzestrzennych
- Uzyskaj kompleksową wiedzę na temat usługi Azure Data Explorer, czytając oficjalny dokument