当前位置:网站首页>Envi IDL: lire la teneur en colonne de NO2 de tous les produits OMI et calculer la moyenne mensuelle, la moyenne trimestrielle, la moyenne annuelle + résolution

Envi IDL: lire la teneur en colonne de NO2 de tous les produits OMI et calculer la moyenne mensuelle, la moyenne trimestrielle, la moyenne annuelle + résolution

2022-07-19 02:09:00 Aubergines frites

Table des matières

 

1. Contenu de l'expérience

2. Réserve de connaissances

3. Programmation


1. Contenu de l'expérience

Je n'écrirai pas mes devoirs pour la troisième semaine,Directement lié à cette expérience.

Une réflexion globale:
1. AccèsLon、Lat、NO2Les données de l'ensemble de données et de la paireNO2Les données sont traitées(Traitement de la valeur de remplissage、Conversion des unités、Échange nord - Sud)

2. Somme et compte

3. Moyenne

2. Réserve de connaissances

Parce queOMILe produit estHDF5Documentation,À utiliserHDF5Fonction de corrélation pour,D'autres fonctions de traitement de fichiers sont utilisées.

AccèsHDF5Étapes générales des données:

1. Ouvre.HDF5Documentation,Obtenir des fichiersid(Utiliserh5f_open()Fonctions)

2. Obtenir le nom de l'ensemble de données(Ici, vous pouvez programmer,Mais ce n'est pas vraiment nécessaire,UtiliserHDF ExplorerLe logiciel peut visualiser les ensembles de données、Propriétés、Vous pouvez également voir les données de contenu individuelles, etc,Même visualiser les données)

3. Par le nom de l'ensemble de données et le fichier obtenu précédemmentidObtenir l'ensemble de donnéesid(Adoptionh5d_open()Fonctions)

4. Obtenir des données pour l'ensemble de données (Adoptionh5d_read()Fonctions)

5. Fermer les ensembles de données et les fichiers (Adoptionh5f_close()、h5d_close()Fonctions)

1、Ouvre.HDF5Documentation,Obtenir des fichiersid
2、 Obtenir le nom de l'ensemble de données
3、 Convertir les noms des ensembles de données en ensembles de données id
4、De l'ensemble de donnéesidLire les données à
5、 Fermer les ensembles de données et les fichiers

3. Programmation

function get_hdf5_ds, file_path, ds_name
  ; Fonctions de construction:  Obtenir des données pour l'ensemble de données 
  
  ;  Obtenir l'ensemble de données dans le fichier id
  file_id = h5f_open(file_path)
  ;  Chemin vers le fichier où se trouve l'ensemble de données entrant 
  
  ; Obtenir l'ensemble de donnéesid
  ds_id = h5d_open(file_id, ds_name)
  ;  Le fichier dans lequel l'ensemble de données est passé id,  Nom de l'ensemble de données entrant 
  
  ;  Obtenir des données pour l'ensemble de données 
  ds_data = h5d_read(ds_id)
  ;  Dans l'ensemble de données id
  
  ;  Fermer les ensembles de données et les fichiers 
  h5d_close, ds_id
  h5f_close, file_id
  
  ;  Renvoie les données pour obtenir l'ensemble de données 
  return, ds_data
end



pro week_three_test
  start = systime(1)
  ; CalculNO2 Moyenne mensuelle de 、 Moyenne trimestrielle 、Moyenne annuelle,EtGeotiffFormat de sortie、 L'Unit é de sortie est mol/km2.
  ; Exigences: Le programme exige que toutes les moyennes soient calculées en même temps 
  
  ;  Chemins vers tous les fichiers 
  in_path = 'D:/IDL_program/experiment_data/chapter_2/NO2'
  ; Chemin vers le fichier de sortie
  out_path = 'D:/IDL_program/experiment_data/chapter_2/NO2/output/'
  if file_test(out_path, /directory) eq 0 then begin  ;  Vérifier si le répertoire existe , Créer s'il n'existe pas
    file_mkdir, out_path
  endif
  ;  Où se trouve l'ensemble de données group Chemin dans le fichier 
  group_path = '/HDFEOS/GRIDS/ColumnAmountNO2/Data Fields/'  ; Utilisez ici\Il y aura une erreur.,Il faut utiliser/
  ;  Nom de l'ensemble de données 
  ds_name = 'ColumnAmountNO2TropCloudScreened'
  ;  Chemin de l'ensemble de données dans le fichier 
  ds_path = group_path + ds_name
  
  ; Accèsin_path Chemin vers tous les fichiers à l'intérieur 
  file_path_array = file_search(in_path, '*.he5', count=file_count)  ; count=Nombre de documents
  ;  Obtenir le nom du fichier à partir de chaque chemin de fichier 
  file_name_array = file_basename(file_path_array, '.he5')
  ;  Année à partir du nom du fichier 
  file_year_array = fix(strmid(file_name_array, 19, 4))
  ;  Obtenir l'année de début et le nombre d'années 
  start_year = min(file_year_array)
  end_year = max(file_year_array)
  year_count = end_year - start_year + 1
  
  ;  Initialisation de diverses données 
  ;  Initialisation de l'ensemble de données du mois de stockage 
  data_total_month = fltarr(1440, 720, 12)  ;  Chaque ensemble de données est (1440, 720),  Douze mois par an 
  data_valid_month = fltarr(1440, 720, 12)  ;  Sur certains ensembles de données NO2 Les données sont invalides , Alors nous ne faisons pas la moyenne / 12, Ça dépend du nombre de fois où ça marche. 
  data_aver_month = fltarr(1440, 720, 12)  ; Au - dessusdata_total_month / data_valid_monthJe peux avoir
  
  ;  Initialisation des ensembles de données de la saison de stockage 
  data_total_season = fltarr(1440, 720, 4)  ; Un an.4Saison
  data_valid_season = fltarr(1440, 720, 4)  ; Nombre effectif
  data_aver_season = fltarr(1440, 720, 4)  ; Moyenne
  
  ;  Initialisation des ensembles de données de l'année de stockage 
  data_total_year = fltarr(1440, 720, year_count)  ; C'est tout.year_countAnnée
  data_valid_year = fltarr(1440, 720, year_count)
  data_aver_year = fltarr(1440, 720, year_count)
  
  ; En boucle
  for file_i = 0, file_count - 1 do begin
    ;  Pour vérifier ce fichier NO2 Si l'ensemble de données existe 
    flag = 0
    file_path = file_path_array[file_i]  ;  Obtenir le chemin du fichier sous cette boucle 
    file_id = h5f_open(file_path)  ; Obtenir des fichiersid
    ds_count = h5g_get_nmembers(file_id, group_path)  ; Fichier entrantidEtgroup Le chemin renvoie ce group Nombre d'ensembles de données sous 
    for ds_i = 0, ds_count - 1 do begin
      ds_i_name = h5g_get_member_name(file_id, group_path, ds_i)
      if ds_i_name eq ds_name then begin
        flag = 1
        continue
      endif
    endfor
    
    if flag ne 0 then begin
      ;  Invite le fichier à avoir un ensemble de données 
      print, 'Exit NO2 data set>>> ' + file_basename(file_path)
      
      ;  Date à laquelle le document a été obtenu par son nom 
      file_year = fix(strmid(file_basename(file_path), 19, 4))
      file_month = fix(strmid(file_basename(file_path), 24, 2))
      
      ;  Obtenir des données pour l'ensemble de données 
      ds_data = get_hdf5_ds(file_path, ds_path)

      ; Traitement de la valeur de remplissage
      ds_data = (ds_data gt 0) * ds_data  ; Nombre négatif(Valeur de remplissage)Devenir0
      
      ; Conversion des unités(Numérateur/cm2 ————》mol/km2)
      ds_data = (ds_data * 10.0 ^ 10.0) / !const.NA
      ;  Changement de position des pôles Nord et Sud 
      ds_data = rotate(ds_data, 7)
      
      ; Enregistrer les ensembles de données————》Mois
      data_total_month[*, *, file_month - 1] = data_total_month[*, *, file_month - 1] + ds_data
      data_valid_month[*, *, file_month - 1] = data_valid_month[*, *, file_month - 1] + (ds_data gt 0)
      ; Enregistrer les ensembles de données————》Saison
      season_index = [3, 3, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3]
      data_total_season[*, *, season_index[file_month - 1]] = data_total_season[*, *, season_index[file_month - 1]] + ds_data
      data_valid_season[*, *, season_index[file_month - 1]] = data_valid_season[*, *, season_index[file_month - 1]] + (ds_data gt 0)
      ; Enregistrer les ensembles de données————》Année
      data_total_year[*, *, file_year - start_year] = data_total_year[*, *, file_year - start_year] + ds_data
      data_valid_year[*, *, file_year - start_year] = data_valid_year[*, *, file_year - start_year] + (ds_data gt 0)
    endif else begin
      print, 'Not exit NO2 data set>> ' + file_basename(file_path)
    endelse
  endfor

  ;  Traitement de la valeur moyenne de l'ensemble de données en mm / JJ / AAAA 
  ;  Traitement mensuel 
  data_valid_month = (data_valid_month gt 0) * data_valid_month + (data_valid_month eq 0) * 1.0
  data_aver_month = data_total_month / data_valid_month
  ;  Traitement saisonnier 
  data_valid_season = (data_valid_season gt 0) * data_valid_season + (data_valid_month eq 0) * 1.0
  data_aver_season = data_total_season / data_valid_season
  ; Traitement annuel
  data_valid_year = (data_valid_year gt 0) * data_valid_year + (data_valid_year eq 0) * 1.0
  data_aver_year = data_total_year / data_valid_year

  ; geotiffParamètres
  geoinfo = {$
    MODELPIXELSCALETAG:[0.25,0.25,0.0],$
    MODELTIEPOINTTAG:[0.0,0.0,0.0,-180.0,90.0,0.0],$
    GTMODELTYPEGEOKEY:2,$
    GTRASTERTYPEGEOKEY:1,$
    GEOGRAPHICTYPEGEOKEY:4326,$
    GEOGCITATIONGEOKEY:'GCS_WGS_1984',$
    GEOGANGULARUNITSGEOKEY:9102,$
    GEOGSEMIMAJORAXISGEOKEY:6378137.0,$
    GEOGINVFLATTENINGGEOKEY:298.25722}

  ; Paramètres de sortie
  month_out = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
  season_out = ['spring', 'summer', 'autumn', 'winter']


  ;  Mois de sortie séquentiel 、Saison、Moyenne annuelle
  for month_i = 0, 11 do begin
    out_month_path = out_path + 'month_aver_' + month_out[month_i] + '.tiff'
    write_tiff, out_month_path, data_aver_month[*, *, month_i], /float, geotiff=geoinfo
    print, file_basename(out_month_path) + ' have completed'
  endfor
  
  for season_i = 0, 3 do begin
    out_season_path = out_path + 'season_aver_' + month_out[season_i] + '.tiff'
    write_tiff, out_season_path, data_aver_season[*, *, season_i], /float, geotiff=geoinfo
    print, file_basename(out_season_path) + ' have completed'
  endfor
  
  for year_i = 0, year_count - 1 do begin
    out_year_path = out_path + 'year_aver_' + strcompress(string(year_i + start_year), /REMOVE_ALL) + '.tiff'
    write_tiff, out_year_path, data_aver_year[*, *, year_i], /float, geotiff=geoinfo
    print, file_basename(out_year_path) + ' have completed'
  endfor
  
  ;  Ici, les résultats annuels sont produits comme suit: txtDocumentation
  out_txt_path = out_path
  for year_i = 0, year_count - 1 do begin
    out_year_path = out_txt_path + 'year_aver_' + strcompress(string(year_i + start_year), /REMOVE_ALL) + '.txt'
    openw, 2, out_year_path
    printf, 2, 'lon lat NO2'
    ;  Le Centre le plus central de chaque pixel , Un pixel est 0.25*0.25
    for row_i = 0, 719 do begin
      lat = 89.875 - 0.25 * row_i  
      for column_i = 0, 1439 do begin
        lon = -179.875 + column_i * 0.25
        printf, 2, lon, lat, data_aver_year[column_i, row_i, year_i], format='(3(f0.3, :, ","))'
      endfor
    endfor
    print, file_basename(out_year_path) + ' have completed'
    free_lun, 2
  endfor
  stop = systime(1)
  print, 'Spend time : ' + strcompress(string(stop - start))
end

Affichage des résultats d'exécution de la compilation :

ProduittiffPrésentation des documents:

UtiliserENVI Il n'y a aucun problème à l'ouvrir :

——————————————————————————————————————————

Il faut ajouter ,Erreur signalée ici, Le nombre de points flottants est illégal ! Mais il ne semble pas affecter la production des résultats .

Bien que, Je suis toujours de mauvaise humeur. .

Un autre point est devant. tiff La sortie du fichier est plus rapide , Mais le dernier txt La sortie des fichiers est lente , J'ai failli croire que ça ne marcherait pas. ,Chronométrage91Quelques secondes..

———————————————————————————————————————————

Je suis l'Aubergine frite ,Merci à tous.!

原网站

版权声明
本文为[Aubergines frites]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/200/202207170007284307.html