FY-4A/LPW产品4km经纬度查找表生成代码-风云四号

实在是太忙,没时间整理,没办法,抽时间整理一下吧。
FY-4A/LPW水汽产品4km经纬度查找表生成代码:

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 23 11:39:02 2019

@author: Administrator
"""


import os
import numpy as np 
import math
import netCDF4 as nc
import h5py 
from osgeo import gdal
import operator


#读取FY4A-_AGRI--_N_DISK_1047E_L1-_GEO-_MULT_NOM文件,空间分辨率4km
#此程序仅限于此类文件

#该文件中仅用于获得FY4A-_AGRI--_N_REGC_1047E_L1_***_4000M_***.HDF文件
#中数据的行列号转换成经纬度

def Get_Line_Col_in_Disk(File_Full_Path):
    #print('#########################################')
    #判读输入文件是否为FY4A-_AGRI--_N_REGC_1047E_L1_***_4000M_***.HDF文件
    #FY4A-_AGRI--_N_REGC_1047E_L2-_LPW-_MULT_NOM_20210303074918_20210303075335_4000M_V0001.NC



    #以只读的方式打开hdf5文件
    InFile_REGC_GEO_4KM = nc.Dataset(File_Full_Path,'r')
    #data.variables
    #外围无效列标
    TPW_data = InFile_REGC_GEO_4KM.variables['TPW'][:].data
    Valid_Value_Index = np.where(TPW_data != 65535)
    
    line_begin = InFile_REGC_GEO_4KM.variables['geospatial_lat_lon_extent'].begin_line_number
    line_end = InFile_REGC_GEO_4KM.variables['geospatial_lat_lon_extent'].end_line_number
    column_begin = InFile_REGC_GEO_4KM.variables['geospatial_lat_lon_extent'].begin_pixel_number
    column_end = InFile_REGC_GEO_4KM.variables['geospatial_lat_lon_extent'].end_pixel_number
    x = np.array(list(range(column_begin,column_end+1)))
    y = np.array(list(range(line_begin,line_end+1)))
    X,Y = np.meshgrid(x,y)

    
    InFile_REGC_GEO_4KM.close() 
    return Y,X,Valid_Value_Index
    
def Convert_Line_Col_To_Lon_Lat(Data_Line_Num_in_Disk,Data_Col_Num_in_Disk,Valid_Value_Index):
    #print('##########################################')  
    ##根据中国区域在全圆盘中的行列号计算经纬度
    #注意:各个文件中在全圆盘的行列号会有所不同
    #中国区域内的有效行列号
           

    Line = Data_Line_Num_in_Disk[Valid_Value_Index]     
    Column = Data_Col_Num_in_Disk[Valid_Value_Index] 
     
   
    #地球的长半轴,单位km
    ea = 6378.137
    #地球的短半轴,单位km
    eb = 6356.7523
    #地心到卫星质心的距离,单位km
    h = 42164
    #卫星星下点的经度
    Lon_Sate = 104.7
    #COFF全圆盘列偏移,4km对应的数值
    COFF = 1373.5
    #CFAC全圆盘列比例因子,4km对应的数值
    CFAC = 10233137
    #LOFF全圆盘行偏移,4km对应的数值
    LOFF = 1373.5
    #LFAC全圆盘列比例因子,4km对应的数值
    LFAC = 10233137
    
    tmp = np.pi/(180*math.pow(2,-16))
    #print('tmp =',tmp)
    
    x = tmp * (Column - COFF)/CFAC
    #print('x =',x)
    
    y = tmp * (Line - LOFF)/LFAC
    #print('y =',y)

    sinx = np.sin(x)
    cosx = np.cos(x)
    siny = np.sin(y)
    cosy = np.cos(y)
    
    cosxy = cosx * cosy
    tmp2 = cosy*cosy + siny*siny * ea*ea /(eb*eb) 
    #print('tmp2=',tmp)
    sd = np.power((h*cosxy)*(h*cosxy) - tmp2*(h*h-ea*ea),0.5)
    sn = ( h*cosxy - sd ) / tmp2
    s1 = h - sn * cosxy
    s2 = sn * sinx * cosy
    s3 = -sn * siny
    sxy = np.power(s1*s1 + s2*s2,0.5)
    
    tmp3 = 180 / np.pi
    lon = tmp3 * np.arctan(s2/s1) + Lon_Sate
    lat = tmp3 * np.arctan((ea*ea*s3)/(eb*eb*sxy))
    #print('lon =',lon)
    #print('lat =',lat)
    print(lon)
    Data_Lon = np.zeros(Data_Line_Num_in_Disk.shape, dtype = np.float64,order = 'C' )
    Data_Lon[:,:] = 999    
    Data_Lon[Valid_Value_Index] = lon
    
    #print(Data_Lon)
    Data_Lat = np.zeros(Data_Line_Num_in_Disk.shape, dtype = np.float64,order = 'C' )
    Data_Lat[:,:] = 999
    Data_Lat[Valid_Value_Index] = lat 
    
    return Data_Lon,Data_Lat
    
def writeTiff(im_data,im_width,im_height,im_bands,path):#im_geotrans,im_proj,path):
    if 'int8' in im_data.dtype.name:
        datatype = gdal.GDT_Byte
    elif 'int16' in im_data.dtype.name:
        datatype = gdal.GDT_UInt16
    else:
        datatype = gdal.GDT_Float64

    if len(im_data.shape) == 3:
        im_bands, im_height, im_width = im_data.shape
    elif len(im_data.shape) == 2:
        im_data = np.array([im_data])
    else:
        im_bands, (im_height, im_width) = 1,im_data.shape
        #创建文件
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(path, im_width, im_height, im_bands, datatype)
    #if(dataset!= None):
        #dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数
        #dataset.SetProjection(im_proj) #写入投影
    for i in range(im_bands):
        dataset.GetRasterBand(i+1).WriteArray(im_data[i])
    del dataset
     

#主程序
if __name__ =='__main__': 
    
    GEO_File_Full_Path = 'E:\FY4A-_AGRI--_N_REGC_1047E_L2-_LPW-_MULT_NOM_20210303074918_20210303075335_4000M_V0001.NC'   
    GEO_file_name = os.path.basename(GEO_File_Full_Path)
    first = GEO_file_name[44:57]
    #print(first)
    second = GEO_file_name[73:79]
    #print(second)
    out_name = first + second + '经纬度查找表'
  
    Data_line_col = Get_Line_Col_in_Disk(GEO_File_Full_Path)      
    #print(Data_line_col)
    Lon_Lat = Convert_Line_Col_To_Lon_Lat(Data_line_col[0],Data_line_col[1],Data_line_col[2])

       
    #print(type(Lon_Lat))
    if Lon_Lat is None :
        print ('wrong file')
    #elif (id(GEO_file_name[44:73]) is not id(Ocean_file_name[44:73])):
        #print(type(GEO_file_name[44:73]))
        #print('Geo file does not match Ocean file')
    else:
        
        Lon = Lon_Lat[0] 
        Lat = Lon_Lat[1]        
    
    im_data = np.array([Lon,Lat])
    im_bands, im_height, im_width = im_data.shape
    
    #保存tif文件函数
    path = 'E:\\' + out_name + '.tif'
    
    writeTiff(im_data, im_width, im_height,im_bands,path) 

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在Vue.js中,可以使用自定义指令v-focus来设置元素的焦点。通过注册一个全局自定义指令v-focus,并在inserted钩子函数中使用el.focus()来聚焦元素。\[1\]这样,在页面加载时,该元素将自动获取焦点。你可以在Vue实例的el属性中指定要应用该指令的元素,如el: '#app'。\[1\]另外,你还可以在元素上直接使用v-focus指令来实现相同的效果。\[2\]下面是一个完整的示例代码:\[3\] ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title> <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script> </head> <body> <div id="app"> <p>页面载入时,input 元素自动获取焦点:</p> <input v-focus> </div> <script> // 注册一个全局自定义指令 v-focus Vue.directive('focus', { // 当绑定元素插入到 DOM 中。 inserted: function (el) { // 聚焦元素 el.focus() } }); // 创建根实例 new Vue({ el: '#app' }); </script> </body> </html> ``` 这样,当页面加载时,input元素将自动获取焦点。 #### 引用[.reference_title] - *1* *3* [Vue.JS 实现在页面加载时,元素获得焦点(聚焦问题)](https://blog.csdn.net/weixin_43918202/article/details/109766530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [VueJS入门教程之七:自定义指令(detective)](https://blog.csdn.net/lpw_cn/article/details/84524004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值