✔ Python/2. Visualization

[Python/Basemap]기상관측망 시각화

  • -

개발자 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. 데이터 다운로드 및 전처리

기상자료개방포털 > 데이터 > 메타데이터 > 검색조건 설정 > CSV 또는 EXCEL 다운로드

해당 데이터는 다음 메타데이터를 가지고 있음

  • 지점, 시작일, 종료일, 지점명, 관리관서, 위도, 경도, 노장해발고도,기압계, 기온계, 풍속계, 강우계

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 examples(projection= 'ortho')(좌).bluemarble (우).etopo 사용

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"

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 위치 표출

우리나라 전국 운용중인 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 같이 표현하고 싶은 경우, 데이터를 각각 불러와서 지도상에 표출 가능

하지만, 두 데이터를 합쳐서 표현하고 싶다면

한반도 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 

 

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.