개발자 D
주제 : Basemap를 활용한 기상관측망 시각화 작업
데이터 : 종관기상관측(ASOS), 방재기상관측(AWS)
기상자료개방포털 ▶ 데이터 ▶ 메타데이터 ▶ 관측지점정보
(data.kma.go.kr/tmeta/stn/selectStnList.do?pgmNo=123)
버 젼 : conda 4.9.0 / Python 3.8.3 / numpy 1.19.2 / pandas 1.1.3
- basemap 설치 : conda install basemap
- conda 업데이트 금지 (conda update -n base conda)
*(2020.11.01 기준) 업데이트 시, basemap 지원문제로 충돌 발생
※ conda 및 pip를 병행하여 사용하는 경우, 충돌 가능성이 있음으로 개발자는 하나로 통일하여 사용하기를 권장
1. 데이터 다운로드 및 전처리
해당 데이터는 다음 메타데이터를 가지고 있음
- 지점, 시작일, 종료일, 지점명, 관리관서, 위도, 경도, 노장해발고도,기압계, 기온계, 풍속계, 강우계
1.1. 데이터전처리
이유를 알 수 없지만, 데이터의 일부가 '위도'칸에 관리관서가 적혀있음
이를 엑셀에서 처리한 뒤 작업하였습니다. 또한, 파일의 구분을 위해 파일명 뒤에 "관제" 또는"종관"이라고 기입함
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
file_name = "META_관측지점정보_20201023115226_관제.csv"
org_data = pd.read_csv("./Data/"+file_name, encoding = "euc-kr")
data = org_data[org_data['종료일'].isnull()].reset_index(drop=True) ## code01
다운받은 데이터는 관측이 종료된 데이터도 포함되어있으며, 종료일이 빈값의 경우, 현재 운용 중인 관측망임
(즉, 현재 운용 중인 관측망을 시각화하기 'code 01' 전처리 진행)
2. Basemap 지도 시각화
Basemap는 다양한 projection 지원 하지만, 한반도의 기상관측지점을 효과적으로 표현하기위해 다른 프로젝션 사용
plt.figure(figsize=(8, 8))
m = Basemap(projection='ortho', resolution=None, lat_0=38, lon_0=128)
m.bluemarble(scale=0.7);
plt.figure(figsize=(8, 8))
m = Basemap(projection='ortho', resolution=None, lat_0=38, lon_0=128)
m.etopo(scale=0.5, alpha=0.5)
2.1. Projection = "merc"
# Figure size setting
plt.figure(figsize=(10,10))
# Basemap setting
m = Basemap(projection='merc', lat_0=37.35, lon_0=126.58, resolution = 'h',
urcrnrlat=40, llcrnrlat=33, llcrnrlon=122, urcrnrlon=132)
m.drawcoastlines()
m.drawcountries()
m.drawmapboundary()
# lat/lon setting
parallels = np.arange(30.,50.,1.)
m.drawparallels(parallels,labels=[True,False,False,False])
meridians = np.arange(120.,150.,2.)
m.drawmeridians(meridians,labels=[True,False,False,True])
plt.show()
3. 우리나라 지도 위에 AWS 위치 표출
for i in data.index :
x, y = m(data['경도'][i], data['위도'][i])
m.plot(x, y,'bo', ms=2) ## 'bo'는 파란색으로 o(동그라미) | ms(=marker size)
전처리한 데이터(data)에서 우리가 필요한 위/경도 데이터만 가져와서 plot 표출
3.1. 동일한 방식으로 ASOS위치 표출가능
3.2. (최종) AWS와 ASOS 동시 표출
AWS와 ASOS 같이 표현하고 싶은 경우, 데이터를 각각 불러와서 지도상에 표출 가능
하지만, 두 데이터를 합쳐서 표현하고 싶다면
## 라이브러리
%matplotlib inline
import os
import glob
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
# 지도표출
plt.figure(figsize=(10,10))
m = Basemap(projection='merc', lat_0=37.35, lon_0=126.58, resolution = 'h',
urcrnrlat=40, llcrnrlat=33, llcrnrlon=122, urcrnrlon=132)
m.drawcoastlines()
m.drawcountries()
m.drawmapboundary()
## 지도표출_위경도
parallels = np.arange(30.,50.,1.)
m.drawparallels(parallels,labels=[True,False,False,False])
meridians = np.arange(120.,150.,2.)
m.drawmeridians(meridians,labels=[True,False,False,True])
#=================데이터 병합 및 전처리=================
File_in = "./Data/" # 파일위치설정(데이터위치 설정필수)
All_file_list = glob.glob(os.path.join(File_in, "META_*")) # 결과 궁금하면, print(All_file_list)
AllData= [] # 데이터 병합을 위한 빈 리스트 생성
for file in All_file_list:
df = pd.read_csv(file, encoding= "euc-kr")
df['category'] = file[-6:-4] # AWS, ASOS 구별하기 위해 'category'생성
AllData.append(df) # 일전에 두 데이터를 구별하기위해
# 파일명 끝에 '관제' 또는 '종관' 저장함
data_f = pd.concat(AllData, axis=0, ignore_index = True)
data_f = data_f[data_f['종료일'].isnull()].reset_index(drop=True) #운용중인 데이터만 활용
a = data_f[data_f['category'] == "종관"] # 아래 코드는 IF와 FOR문을 통해서 간단화(추후)
b = data_f[data_f['category'] == "관제"]
for i in a.index :
x, y = m(datacombine['경도'][i], datacombine['위도'][i])
m.plot(x, y,'ro', ms=2)
for i in b.index :
x, y = m(datacombine['경도'][i], datacombine['위도'][i])
m.plot(x, y,'bo', ms=2)
plt.show()
Reference
- Geographic Data with Basemap jakevdp.github.io/PythonDataScienceHandbook/04.13-geographic-data-with-basemap.html
- Drawing a Map Background matplotlib.org/basemap/users/geography.html
- 기상청 기상관측망 현황 web.kma.go.kr/aboutkma/biz/observation01.jsp
728x90
반응형
'Python > 4️⃣ 시각화' 카테고리의 다른 글
[GeoPandas] Python으로 .shp 파일 읽기 (0) | 2023.01.13 |
---|---|
[Folium] 지진 데이터 시각화 (0) | 2023.01.10 |
[GeoPandas] GeoPandas 라이브러리 설치 (2) | 2023.01.06 |
[Python/Cartopy]모델자료 활용한 일기도 묘화 (1) | 2020.11.06 |
[Python/Basemap]모델자료를 활용한 일기도 묘화 (9) | 2020.11.03 |