주제 : 지진데이터 시각화
버전 : Pandas 1.4.4. / Folium.0.14.0.
작성일 : 2023-01-10
수정일 : 2024-07-15 (본문스타일 변경)
안녕하세요, 개발자 우성우 입니다.
요즘 "백두산 폭발 임박"이라는 키워드가 자주 등장하고 있습니다. 백두산의 폭발주기는 약 100년 주기이다 보니 많은 학자들이 2025년에는 폭발 가능성이 농후하다는 의견들을 심심치 않게 볼 수 있는데요. 이에 오늘은 전 세계에서 발생하고 있는 지진 위치정보를 시각화해보도록 하겠습니다.
1. 데이터 준비
우선, 전세계의 지진정보를 데이터를 다운로드하여보도록 하겠습니다.
데이터는 기상청과 EMSC에서 다운로드가 가능하지만, 필자는 EMSC에서 다운로드하여서 사용하였습니다.
1.1. 기상청 국외지진 정보
우리나라 기상청 날씨누리는 날씨, 바다, 태풍, 황사 등의 다양한 정보들을 제공하고있으며, 지진 및 화산에 대한 정보도 제공합니다. 국외 지진발생목록은 발생기간, 규모범위, 위경도에 따라 검색해서 엑셀로 다운을 받을 수 있습니다. 다만, 제공하는 데이터가 제한적입니다.
- 링크 : https://www.weather.go.kr/w/eqk-vol/search/worldwide.do
- 장점 : 국문자료
- 단점 : 1990년 이전의 지진에 대한 정보는 제공하지 않음
1.2. EMSC 지진 정보
European-Mediterranean Seismological Center는 국제 비영리 조직으로 유럽-지중해 지역의 지진의 특성 및 연구를 위해 만들어진 조직으로, 수십 년간의 지진데이터를 보유하고 있습니다. 아울러, 최근 48시간 내에 발생한 지진을 웹상에서 확인할 수 있습니다.
- 링크 : https://www.emsc-csem.org/Earthquake/?filter=yes
- 장점 : 수십년간의 지진데이터를 보유하고 있으며, 데이터 다운로드 용이함
- 단점 : 영문자료
2. 데이터 확인
상단의 EMSC 홈페이지 화면에서 "save my criteria" 클릭하시면, 데이터 다운로드가 가능한 창이 뜹니다.
2.1. 파일 읽기
금일 사용할 라이브러리는 pandas와 folium입니다.
- folium 라이브러리가 설치한 적이 없는 경우, conda 명령어 또는 pip 이용해서 설치해주시면 됩니다.
<conda 명령어>
conda install -c conda-forge folium
<pip 명령어>
pip install folium
- pd.read_csv("file name")으로 데이터를 읽습니다.
import folium
import pandas as pd
# 데이터위치
Dir = '/Users/lucas/Desktop/wscode/Data/earthquake'
Data = '/export_EMSC.csv'
# pandas 이용하여 csv파일 읽기
df1 = pd.read_csv(Dir+Data) #오류발생
위와 동일하게 진행하면, csv 파일 읽을 수 없다고 오류가 발생합니다.
그 이유는 다운받은 파일을 확인해보면 아실 텐데요. ;(semicolon, 세미콜론) 구분자가 있기 때문입니다.
- . - dot
- , - comma
- ! - exclamation mark
- () - bracket
- @ - at
- : - colon
- ; - semicolon
- - - hyphen
- * - asterisk
- " '- quotation marks
- ~ - tilde
- 엑셀의 구분자가 있는 경우, sep(=separate) 속성을 활용하여 파일을 읽습니다.
import folium
import pandas as pd
Dir = '/Users/lucas/Desktop/wscode/Data/earthquake'
Data = '/export_EMSC.csv'
#df1 = pd.read_csv(Dir+Data) #오류발생
df1 = pd.read_csv(Dir+Data, sep =';')#오류해결
2.2. 데이터 추출 (전처리)
해당 데이터에는 Date, Time UTC, Latitude, Longitude 등의 다양한 값들이 존재합니다. 이 중 우리가 지도상에 표출 시에 필요한 데이터만 추출합니다.
- 최소 필요한 데이터 : Latitude, Longitude, Magnitude
- 필자가 선택한 데이터 : Date, Latitude, Longitude, Region Name, Magnitude
# Keep only relevant columns
df = df1.loc[:, ("Date", "Latitude", "Longitude", "Region Name","Magnitude")]
3. 지도 표출
folium을 활용하여 기본 배경으로 활용한 지도를 표출합니다.
3.1. 지도 생성
- folium.Map(location = [위도, 경도], zoom_start = , titles = )
m = folium.Map(location=[37, 120], # 지도의 중심위치 설정
zoom_start=4, # zoom level 설정
tiles= "cartodb positron" #"Cartodb dark_matter"
)
3.2. 동그라미 표출
우선, 복잡하지않게 연습용으로 하나의 값만 지도 위에 표출해 보록 하겠습니다.
- folium.Circle([위도, 경도], radius = "원의 반지름 크기", color = "원하는 색",
fill_color= "원하는 채움색"
).add_to(m)
folium.Circle([df['Latitude'][2], df['Longitude'][2]], #df 위경도데이터의 2index값을 가져옵니다.
radius = df['Magnitude'][2]**7.5, #df 규모데이터의 2index값
color = "white",
fill_color = "Red"
).add_to(m) # 이를 m이라고 지정한 지도위에 추가합니다.
m
여기까지 이해가 되셨다면, 이젠 우리가 가지고 있는 모든 데이터 값을 표출하기 위해 for 문을 사용하도록 하겠습니다.
- for문
- 표출되는 원을 규모에 따라 상이하게 표현하기 위해, 임의로 7.5 지수승을 취하였습니다.
for i in range(df['Date'].count()):
folium.Circle([df['Latitude'][i], df['Longitude'][i]],
radius = df['Magnitude'][i]**7.5,
color = "white",
fill_color = "Red"
).add_to(m)
m
3.3. 판(지각) 표출
고등학교 시절, 배웠던 지구과학을 떠올리면 대다수의 지진과 화산발생은 판(지각)의 수렴 및 발산으로 발생합니다.
그렇기 때문에 판의 경계에서 지진이 많이 발생합니다.
그렇다면, 판(지각)을 지도 위에 표출해 보록 하겠습니다.
- 위와 동일한 작업에 판(지각)만 추가로 올려주면 됩니다.
- 판(지각). json 파일 - https://github.com/fraxen/tectonicplates
#기존과 동일
m = folium.Map(location=[37, 120],
zoom_start=4,
tiles= "cartodb positron" #"Cartodb dark_matter"
)
#추가된 부분
import json
plate = "/Users/lucas/Desktop/wscode/Data/tectonicplates-master/GeoJSON/PB2002_plates.json"
geo_data = json.load(open(plate, encoding = 'utf-8'))
folium.Choropleth(geo_data=geo_data,
).add_to(m)
#기존과 동일
for i in range(df['Date'].count()):
folium.Circle([df['Latitude'][i], df['Longitude'][i]],
radius = df['Magnitude'][i]**7.5,
color = "white",
fill_color = "Red"
).add_to(m)
m
m.save('map.html') #html로 저장가능
이렇게 판의 경계에서 발생하는 지진들을 한눈에 확인이 가능합니다.
4. 전체코드
#import library
import json
import folium
from folium.plugins import MarkerCluster
import pandas as pd
#setting the file directory and data
Dir = '/Users/lucas/Desktop/wscode/Data/earthquake'
Data = '/export_EMSC.csv'
#read the data
df1 = pd.read_csv(Dir+Data, sep =';')
#extract speific data from the dataset
df = df1.loc[:, ("Date", "Latitude", "Longitude", "Region Name","Magnitude")]
#draw a map with folium
m = folium.Map(location=[37, 120],
zoom_start=4,
tiles= "cartodb positron" #"Cartodb dark_matter"
)
#read the tectonicplates data(json file)
plate = "/Users/lucas/Desktop/wscode/Data/tectonicplates-master/GeoJSON/PB2002_plates.json"
geo_data = json.load(open(plate, encoding = 'utf-8'))
#add the tectonicplates on the map
folium.Choropleth(geo_data=geo_data,
).add_to(m)
#draw the circle based on the magnitude of earthquake
for i in range(df['Date'].count()):
folium.Circle([df['Latitude'][i], df['Longitude'][i]],
radius = df['Magnitude'][i]**7.5,
color = "white",
fill_color = "Red"
).add_to(m)
m.save('map.html')
Reference
- EMSC 웹사이트 https://www.emsc-csem.org/Earthquake/?filter=yes
- Folium attributes https://python-visualization.github.io/folium/modules.html
- 지도 시각화도구 사용법 https://teddylee777.github.io/visualization/folium
'Python > 4️⃣ 시각화' 카테고리의 다른 글
[GeoPandas] 서울시 공원 위치 시각화(1/2) (0) | 2023.01.13 |
---|---|
[GeoPandas] Python으로 .shp 파일 읽기 (0) | 2023.01.13 |
[GeoPandas] GeoPandas 라이브러리 설치 (2) | 2023.01.06 |
[Python/Cartopy]모델자료 활용한 일기도 묘화 (1) | 2020.11.06 |
[Python/Basemap]모델자료를 활용한 일기도 묘화 (9) | 2020.11.03 |