정보

    • 업무명    : 파이썬 MOHID 해양순환모델 결과 (남동해역 유속, 수온, 염분)를 이용한 가시화

    • 작성자    : 박진만

    • 작성일    : 2019-09-02

    • 설   명    : 한반도 동남해상 전체에 대한 유속, 수온, 염분 가시화

    • 수정이력 :

     

     내용

    [특징]

    • 소스 코드의 초기화 설정 (관련 URL)

    • NetCDF 및 shp 파일을 이용하여, 각각의 구성요소를 가시화 (동남해역 전체 범위)

     

    [기능]

    • 동남해역 전체 범위에 대한 유속, 수온 염분 매핑 (각 depth 별) 

    • basemap 사용

     

    [활용 자료]

    • 없음

     

    [자료 처리 방안 및 활용 분석 기법]

    • 없음

     

    [사용법]

    • 1 단계 초기 설정한 후 소스 코드 실행 (python ##)

     

    [사용 OS]

    • Window 10

     

    [사용 언어]

    • Python v2.7

     

     소스 코드

    ## 동남해역 유속 매핑 ##
    
    arrow_magn=20.0
    
    
    #%matplotlib inline
    dep = [0,10,25,50,75]
    depnum = [18,16,15,13,12] #surface / 10m / 25m / 50m / 75m
    
        
    for i in range(0,1,1):
        depcount = -1
        for j in depnum:
            
            #print(j)
            depcount += 1
            
            # fig Size
            fig = plt.figure(figsize=(10, 12.5))
            ax  = fig.add_subplot(111)
            
            # style
            plt.style.use('seaborn-darkgrid')
        
            # define font size
            plt.rc("font", size=15)
            plt.rcParams['font.family'] = 'sans-serif'
            plt.rcParams['font.sans-serif'] = 'New Century Schoolbook'
            plt.rcParams["font.weight"] = "bold"
            plt.rcParams['axes.labelsize'] = 26
            plt.rcParams['xtick.labelsize'] = 26
            plt.rcParams['ytick.labelsize'] = 26
            plt.rcParams["axes.labelweight"] = "bold"
            plt.rcParams["axes.titleweight"] = "bold"
            plt.rcParams['contour.corner_mask'] = False
            plt.rcParams.update({'figure.autolayout': True})
            
            
            #vector extract
            varU= ncfile.variables[u'u'][i,j,:,:]
            varV= ncfile.variables[u'v'][i,j,:,:]
            varVM= ncfile.variables[u'vm'][i,j,:,:]
            
            
            varVM = switch(varVM,j) #마스크 계산 함수 호출...
        
            varVM = np.ma.array(varVM, mask = varVM <= 0.0)
    
            plt.contour(BS_X, BS_Y, varVM,cv_tick, linewidths=0,color='k')
            bsmap.contourf(BS_X,BS_Y,varVM,cv_tick,cmap=cmap_jet,vmin = 0, vmax = 2, extend='both')
        
            #color bar
            colorbar = bsmap.colorbar(location='right',size=0.25, ticks=cv_cbar_tick, cmap=cmap_jet,extendrect='False')
            colorbar.ax.set_yticklabels(colorbar.ax.get_yticklabels(), fontsize=11)
        
        
            # vector mapping
            meana = np.mean(varVM[points])
        
            Q = bsmap.quiver(lon2D[points],lat2D[points],varU[points],varV[points],varVM[points],pivot='middle',cmap=vcmap,latlon=True, scale_units='inches',scale=meana*arrow_magn,minlength=0.1,headwidth=4.0)
            plt.quiverkey(Q, 0.1, 0.95, 1, ''+str(int(1)) + 'm/s', labelpos='N', fontproperties={'weight': 'bold', 'size':'12'},labelsep=0.1)
            plt.quiverkey(Q, 0.1, 0.95, 1, 'Reference Vector', labelpos='S', fontproperties={'weight': 'bold', 'size':'12'},labelsep=0.1)
            
            BSPATCH = BSPOLY(bsmap)
            JPPATCH = JPPOLY(bsmap)
                
            ax.add_collection(PatchCollection(BSPATCH, facecolor= 'lightgray', edgecolor='k', linewidths=0.5, zorder=1))
            ax.add_collection(PatchCollection(JPPATCH, facecolor= 'lightgray', edgecolor='k', linewidths=0.5, zorder=1))
            
            # gray background
        
            bsmap.drawparallels(np.arange(-150, 120, 2), labels=[0,0,0,0], dashes=[2,2], color='lightgray')
            bsmap.drawmeridians(np.arange(-180, 180, 2), labels=[0,0,0,0], dashes=[2,2], color='lightgray')
            bsmap.drawmapboundary(fill_color='white')
    
    
            plt.title('Currend Vectors(m/s)', loc='left', size=20)
            plt.suptitle('[depth : ' + str(int(dep[depcount])) + 'm]', x=0.365, y=0.86, size=15)
            
            # lat label
            #plt.annotate(u'32\N{DEGREE SIGN}N', xy=(bsmap(123.0, 32.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'34\N{DEGREE SIGN}N', xy=(bsmap(123.0, 34.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'36\N{DEGREE SIGN}N', xy=(bsmap(123.0, 36.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'38\N{DEGREE SIGN}N', xy=(bsmap(123.0, 38.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'40\N{DEGREE SIGN}N', xy=(bsmap(123.0, 40.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
        
            # lon label
            #plt.annotate(u'124\N{DEGREE SIGN}E', xy=(bsmap(124.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'126\N{DEGREE SIGN}E', xy=(bsmap(126.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'128\N{DEGREE SIGN}E', xy=(bsmap(128.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'130\N{DEGREE SIGN}E', xy=(bsmap(130.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'132\N{DEGREE SIGN}E', xy=(bsmap(132.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
        
            # time label
            plt.annotate('VALID :'+times[i] + ' UTC', xy=(0.0, -0.035), color='red', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            plt.annotate(local_dt[i] + ' KST', xy=(0.092, -0.065), color='black', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            
            plt.annotate('TIME :'+times[0] + ' UTC', xy=(0.7, -0.035), color='red', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            plt.annotate(local_dt[0] + ' KST', xy=(0.780, -0.065), color='black', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
    
            plt.savefig('BS_cv' + times[i] + 'h _' + str(int(dep[depcount])) + 'm_layer' + '.png')
            
            print('BS_cv_' + times[i] + 'h_' + str(int(dep[depcount])) + 'm_layer' + '.png' + '    SUCCESS!!')
        
            #plt.show()
            
            
    
    ## 동남해역 수온 매핑 ##
    
    
    dep = [0,10,25,50,75]
    depnum = [18,16,15,13,12] #surface / 10m / 25m / 50m / 75m
    
    for i in range(0,1,1):
        depcount = -1
        for j in depnum:
            
            #print(j)
            depcount += 1
            
            # fig Size
            fig = plt.figure(figsize=(10, 12.5))
            ax  = fig.add_subplot(111)
    
            # style
            plt.style.use('seaborn-darkgrid')
        
            # define font size
            plt.rc("font", size=15)
            plt.rcParams['font.family'] = 'sans-serif'
            plt.rcParams['font.sans-serif'] = 'New Century Schoolbook'
            plt.rcParams["font.weight"] = "bold"
            plt.rcParams['axes.labelsize'] = 26
            plt.rcParams['xtick.labelsize'] = 26
            plt.rcParams['ytick.labelsize'] = 26
            plt.rcParams["axes.labelweight"] = "bold"
            plt.rcParams["axes.titleweight"] = "bold"
            plt.rcParams['contour.corner_mask'] = False
            plt.rcParams.update({'figure.autolayout': True})
            
            
            #vector extract
            var = ncfile.variables[u'temperature'][i,j,:,:]
            
            var = switch(var,j) #마스크 계산 함수 호출...
            var = np.ma.array(var, mask = var <= 0.0)
            
            cc = plt.contour(BS_X, BS_Y,var,tp_cont_tick, linewidths=1,cmap=vcmap)
            bsmap.contourf(BS_X,BS_Y,var,tp_conf_tick,cmap=cmap_jet1,vmin = 0.0, vmax = 33.0, extend='both')
            
            plt.clabel(cc, inline=True, fontsize=12, fmt ='%2i',  colors='k',inline_spacing=3.0)
    
            
            # FILL POLYGON COLOR AND PLOT BOUNDATY LINE
            BSPATCH = BSPOLY(bsmap)
            JPPATCH = JPPOLY(bsmap)
            
            ax.add_collection(PatchCollection(BSPATCH, facecolor= 'lightgray', edgecolor='k', linewidths=0.5, zorder=1))
            ax.add_collection(PatchCollection(JPPATCH, facecolor= 'lightgray', edgecolor='k', linewidths=0.5, zorder=1))
            
            #color bar
            colorbar = bsmap.colorbar(location='right',size=0.25, ticks=tp_cbar_tick, cmap=cmap_jet1,extendrect='False')
            colorbar.ax.set_yticklabels(colorbar.ax.get_yticklabels(), fontsize=11)
        
        
            # white background gray fill contin        
            bsmap.drawparallels(np.arange(-150, 120, 2), labels=[0,0,0,0], dashes=[2,2], color='lightgray')
            bsmap.drawmeridians(np.arange(-180, 180, 2), labels=[0,0,0,0], dashes=[2,2], color='lightgray')
            bsmap.drawmapboundary(fill_color='white')
        
            plt.title('Currend Vectors(m/s)', loc='left', size=20)
            plt.suptitle('[depth : ' + str(int(dep[depcount])) + 'm]', x=0.365, y=0.863, size=15)
            
            # lat label
            #plt.annotate(u'32\N{DEGREE SIGN}N', xy=(bsmap(123.0, 32.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'34\N{DEGREE SIGN}N', xy=(bsmap(123.0, 34.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'36\N{DEGREE SIGN}N', xy=(bsmap(123.0, 36.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'38\N{DEGREE SIGN}N', xy=(bsmap(123.0, 38.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'40\N{DEGREE SIGN}N', xy=(bsmap(123.0, 40.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
        
            # lon label
            #plt.annotate(u'124\N{DEGREE SIGN}E', xy=(bsmap(124.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'126\N{DEGREE SIGN}E', xy=(bsmap(126.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'128\N{DEGREE SIGN}E', xy=(bsmap(128.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'130\N{DEGREE SIGN}E', xy=(bsmap(130.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'132\N{DEGREE SIGN}E', xy=(bsmap(132.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
        
            # time label
            plt.annotate('VALID :'+times[i] + ' UTC', xy=(0.0, -0.03), color='red', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            plt.annotate(local_dt[i] + ' KST', xy=(0.092, -0.055), color='black', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            
            plt.annotate('TIME :'+times[0] + ' UTC', xy=(0.7, -0.03), color='red', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            plt.annotate(local_dt[0] + ' KST', xy=(0.780, -0.055), color='black', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
    
            plt.savefig('BS_temp' + times[i] + 'h _' + str(int(dep[depcount])) + 'm_layer' + '.png')
            
            print('BS_temp_' + times[i] + 'h_' + str(int(dep[depcount])) + 'm_layer' + '.png' + '    SUCCESS!!')
        
            #plt.show()
            
    
    ## 동남해역 염분 매핑 ##
    
    dep = [0,10,25,50,75]
    depnum = [18,16,15,13,12] #surface / 10m / 25m / 50m / 75m
    
    
    for i in range(0,timelen,1):
        depcount = -1
        for j in depnum:
            
            #print(j)
            depcount += 1
            
            # fig Size
            fig = plt.figure(figsize=(10, 12.5))
            ax  = fig.add_subplot(111)
    
            # style
            plt.style.use('seaborn-darkgrid')
        
            # define font size
            plt.rc("font", size=15)
            plt.rcParams['font.family'] = 'sans-serif'
            plt.rcParams['font.sans-serif'] = 'New Century Schoolbook'
            plt.rcParams["font.weight"] = "bold"
            plt.rcParams['axes.labelsize'] = 26
            plt.rcParams['xtick.labelsize'] = 26
            plt.rcParams['ytick.labelsize'] = 26
            plt.rcParams["axes.labelweight"] = "bold"
            plt.rcParams["axes.titleweight"] = "bold"
            plt.rcParams['contour.corner_mask'] = False
            plt.rcParams.update({'figure.autolayout': True})
            
            
            #vector extract
            var = ncfile.variables[u'salinity'][i,j,:,:]
            
            var = switch(var,j) #마스크 계산 함수 호출...
            var = np.ma.array(var, mask = var <= 0.0)
    
            cc = plt.contour(BS_X, BS_Y,var,sa_cont_tick, linewidths=1,cmap=vcmap)
            bsmap.contourf(BS_X,BS_Y,var,sa_conf_tick,cmap=cmap_jet1,vmin = 25.0, vmax = 35.0, extend='both')
            
            plt.clabel(cc, inline=True, fontsize=12, fmt ='%2.1f',  colors='k',inline_spacing=3.0)
    
            # FILL POLYGON COLOR AND PLOT BOUNDATY LINE
            BSPATCH = BSPOLY(bsmap)
            JPPATCH = JPPOLY(bsmap)
            
            ax.add_collection(PatchCollection(BSPATCH, facecolor= 'lightgray', edgecolor='k', linewidths=0.5, zorder=1))
            ax.add_collection(PatchCollection(JPPATCH, facecolor= 'lightgray', edgecolor='k', linewidths=0.5, zorder=1))
            
            #color bar
            colorbar = bsmap.colorbar(location='right',size=0.25, ticks=sa_cbar_tick, cmap=cmap_jet1,extendrect='False')
            colorbar.ax.set_yticklabels(colorbar.ax.get_yticklabels(), fontsize=11)
        
        
            # white background gray fill contin
            bsmap.drawparallels(np.arange(-150, 120, 2), labels=[0,0,0,0], dashes=[2,2], color='lightgray')
            bsmap.drawmeridians(np.arange(-180, 180, 2), labels=[0,0,0,0], dashes=[2,2], color='lightgray')
            bsmap.drawmapboundary(fill_color='white')
    
            
            plt.title('Salinity(psu)', loc='left', size=20)
            plt.suptitle('[depth : ' + str(int(dep[depcount])) + 'm]', x=0.255, y=0.863, size=15)
            
            # lat label
            #plt.annotate(u'32\N{DEGREE SIGN}N', xy=(bsmap(123.0, 32.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'34\N{DEGREE SIGN}N', xy=(bsmap(123.0, 34.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'36\N{DEGREE SIGN}N', xy=(bsmap(123.0, 36.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'38\N{DEGREE SIGN}N', xy=(bsmap(123.0, 38.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'40\N{DEGREE SIGN}N', xy=(bsmap(123.0, 40.04)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
        
            # lon label
            #plt.annotate(u'124\N{DEGREE SIGN}E', xy=(bsmap(124.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'126\N{DEGREE SIGN}E', xy=(bsmap(126.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'128\N{DEGREE SIGN}E', xy=(bsmap(128.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'130\N{DEGREE SIGN}E', xy=(bsmap(130.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
            #plt.annotate(u'132\N{DEGREE SIGN}E', xy=(bsmap(132.3, 30.90)), color='lightgray', fontweight='bold', xycoords='data', horizontalalignment='center', verticalalignment='top', size=9)
        
            # time label
            plt.annotate('VALID :'+times[i] + ' UTC', xy=(0.0, -0.03), color='red', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            plt.annotate(local_dt[i] + ' KST', xy=(0.092, -0.055), color='black', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            
            plt.annotate('TIME :'+times[0] + ' UTC', xy=(0.7, -0.03), color='red', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
            plt.annotate(local_dt[0] + ' KST', xy=(0.780, -0.055), color='black', fontweight='bold', textcoords='axes fraction',verticalalignment='left',xycoords='data', size=15)
    
            plt.savefig('BS_sa' + times[i] + 'h _' + str(int(dep[depcount])) + 'm_layer' + '.png')
            
            print('BS_sa_' + times[i] + 'h_' + str(int(dep[depcount])) + 'm_layer' + '.png' + '    SUCCESS!!')
        
            #plt.show()

     

    [Github]

     

     결과

    • 염분

    그림. 남동해역 유속 및 벡터 (0m)를 이용한 가시화.

     

    • 염분

    그림. 남동해역 염분 (0m)을 이용한 가시화.

     

    • 수온

    그림. 남동해역 수온 (0m)을 이용한 가시화.

     

     참고문헌

    [논문]

    • 없음

    [보고서]

    • 없음

    [URL]

    • 없음

     

    블로그에 대한 궁금하신 점을 문의하시면 자세히 답변드리겠습니다.

    E. ​sangho.lee.1990@gmail.com & ​saimang0804@gmail.com

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기