자습서: 지리 공간적 시각화 만들기
적용 대상: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
이 자습서는 지리 공간적 시각화에 KQL(Kusto 쿼리 언어)을 사용하려는 사용자를 위한 것입니다. 지리 공간적 클러스터링은 지리적 위치에 따라 데이터를 구성하고 분석하는 방법입니다. KQL은 지리 공간적 클러스터링을 수행하기 위한 여러 가지 방법과 지리 공간적 시각화를 위한 도구를 제공합니다.
이 자습서에서는 다음 작업을 수행하는 방법을 알아봅니다.
필수 조건
다음 쿼리를 실행하려면 샘플 데이터에 액세스할 수 있는 쿼리 환경이 필요합니다. 다음 중 하나를 사용할 수 있습니다.
- 도움말 클러스터에 로그인 할 Microsoft 계정 또는 Microsoft Entra 사용자 ID
- Microsoft 계정 또는 Microsoft Entra 사용자 ID
- Microsoft Fabric 사용 용량이 있는 패브릭 작업 영역
지도의 점 그리기
지도에서 점을 시각화하려면 프로젝트를 사용하여 경도를 포함하는 열을 선택한 다음 위도가 포함된 열을 선택합니다. 그런 다음 렌더링을 사용하여 분산형 차트에서 결과를 볼 수 있습니다 kind
map
.
StormEvents
| take 100
| project BeginLon, BeginLat
| render scatterchart with (kind = map)
여러 점 계열 그리기
여러 일련의 점을 시각화하려면 프로젝트를 사용하여 계열을 정의하는 세 번째 열과 함께 경도 및 위도를 선택합니다.
다음 쿼리에서 계열은 .입니다 EventType
. 포인트는 해당 요소에 따라 EventType
다르게 색이 지정되며 선택한 경우 열의 내용이 EventType
표시됩니다.
StormEvents
| take 100
| project BeginLon, BeginLat, EventType
| render scatterchart with (kind = map)
(경도), (위도) ycolumn
및 series
수행 render
시 명시적으로 지정할 xcolumn
수도 있습니다. 이 사양은 경도, 위도 및 계열 열보다 결과에 더 많은 열이 있는 경우에 필요합니다.
StormEvents
| take 100
| render scatterchart with (kind = map, xcolumn = BeginLon, ycolumns = BeginLat, series = EventType)
GeoJSON 값을 사용하여 지도에 점 그리기
동적 GeoJSON 값은 변경하거나 업데이트할 수 있으며 실시간 매핑 애플리케이션에 자주 사용됩니다. 동적 GeoJSON 값을 사용하는 매핑 지점을 사용하면 일반 위도 및 경도 값으로는 불가능할 수 있는 지도의 데이터 표현을 보다 유연하게 제어할 수 있습니다.
다음 쿼리는 geo_point_to_s2cell 및 geo_s2cell_to_central_point 사용하여 분산형 차트에 Storm 이벤트를 매핑합니다.
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)
가변 크기 거품이 있는 데이터 요소 표시
각 클러스터에서 집계를 수행한 다음 클러스터의 중심점을 그려 데이터 요소의 배포를 시각화합니다.
예를 들어 다음 쿼리는 "Tornado" 이벤트 유형의 모든 Storm 이벤트를 필터링합니다. 그런 다음, 경도 및 위도에 따라 이벤트를 클러스터로 그룹화하고, 각 클러스터의 이벤트 수를 계산하고, 클러스터의 중심점을 투영하고, 결과를 시각화하는 맵을 렌더링합니다. 토네이도가 가장 많은 지역은 큰 거품 크기에 따라 명확하게 감지됩니다.
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)
특정 영역 내의 표시 지점
다각형을 사용하여 영역 및 geo_point_in_polygon 함수를 정의하여 해당 지역 내에서 발생하는 이벤트를 필터링합니다.
다음 쿼리는 남부 캘리포니아 지역을 나타내는 다각형을 정의하고 이 지역 내의 Storm 이벤트에 대한 필터를 정의합니다. 그런 다음, 이벤트를 클러스터로 그룹화하고, 각 클러스터의 이벤트 수를 계산하고, 클러스터의 중심점을 투영하고, 클러스터를 시각화하는 맵을 렌더링합니다.
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)
LineString에 주변 지점 표시
다음 쿼리는 정의된 경로를 나타내는 지정된 LineString을 따라 발생하는 가까운 Storm 이벤트를 찾습니다. 이 경우 LineString은 키 웨스트로 가는 길입니다. geo_distance_point_to_line() 함수는 정의된 LineString에 대한 근접성을 기반으로 폭풍 이벤트를 필터링하는 데 사용됩니다. 이벤트가 LineString에서 500미터 이내인 경우 이벤트는 지도에 렌더링됩니다.
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)
다각형에 주변 점 표시
다음 쿼리는 지정된 다각형 내에서 발생하는 가까운 Storm 이벤트를 찾습니다. 이 경우 다각형은 키 웨스트로 가는 길입니다. geo_distance_point_to_polygon() 함수는 정의된 다각형에 대한 근접성을 기반으로 폭풍 이벤트를 필터링하는 데 사용됩니다. 이벤트가 다각형에서 500미터 이내인 경우 이벤트는 맵에 렌더링됩니다.
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)
지리 공간적 데이터를 기반으로 변칙 찾기
다음 쿼리는 특정 상태 내에서 발생하는 Storm 이벤트를 분석합니다. 이 쿼리는 S2 셀 및 임시 집계를 사용하여 손상 패턴을 조사합니다. 그 결과 시간이 지남에 따라 폭풍으로 인한 파괴의 불규칙성 또는 편차를 묘사하여 지정된 주 경계 내에서 폭풍의 영향에 대한 자세한 관점을 제공하는 시각적 변칙 차트가 생성됩니다.
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)
관련 콘텐츠
- 지리 공간적 클러스터링에 대한 사용 사례 참조: 자동차 테스트 차량의 데이터 분석
- 지리 공간적 데이터 처리 및 분석을 위한 Azure 아키텍처에 대해 알아보기
- 백서를 읽어 Azure Data Explorer에 대한 포괄적인 이해