2025, Nov 01 01:32
pyresample के nearest-neighbor से NetCDF4 टोपोग्राफी को land-use ग्रिड पर मैप करें
जाने कैसे NetCDF4 में अलग lon/lat ग्रिड्स के बीच pyresample के nearest-neighbor से elevation को land-use ग्रिड पर सही तरह रीसम्पल करें. Python उदाहरण शामिल.
जब दो NetCDF4 डेटासेट एक ही क्षेत्र को कवर करते हैं, लेकिन अलग-अलग ग्रिड पर होते हैं, तो एक से दूसरे में मान सीधे कॉपी करने पर चीजें ठीक से नहीं बैठतीं। अक्सर मामला ऐसा होता है: एक land-use फाइल अपनी lon/lat ग्रिड के साथ और एक topography फाइल दूसरी lon/lat संरचना के साथ। कार्य यह है कि भौगोलिक निर्देशांकों के आधार पर nearest-neighbor विधि से elevation मानों को land-use ग्रिड पर स्थानांतरित किया जाए। नीचे Python में यह काम डेटा मॉडल से छेड़छाड़ किए बिना करने का साफ रास्ता दिया गया है।
सीधा लिखने पर दिक्कत कहाँ होती है
Topography फाइल से elevation array पढ़कर उसे land-use फाइल में असाइन करने की कोशिश प्रायः विफल हो जाती है या गलत स्थानिक संरेखण देती है। आकार (shape) और निर्देशांक अलग होते हैं, इसलिए भले दोनों फाइलें लगभग एक ही भौगोलिक विस्तार को कवर करें, यह असाइनमेंट अर्थपूर्ण नहीं होता।
from netCDF4 import Dataset
import numpy as np
lu_ds = Dataset('LUindexHCLIM3.nc', mode='a')
z_ds = Dataset('topography.nc', mode='r')
lon_target = np.array(lu_ds.variables['lon'])
lat_target = np.array(lu_ds.variables['lat'])
z_src = np.array(z_ds.variables['HGT_M'])
# गलत तरीका: ग्रिड समान नहीं हैं, इसलिए यह वैध असाइनमेंट नहीं है
z_on_lu = lu_ds.createVariable('HGT_M', 'f4', ('y', 'x'))
z_on_lu[:] = z_src # mismatched grid/shape
lu_ds.close()
z_ds.close()
ऊंचाई के मान दूसरी ग्रिड से संबंधित हैं। यदि आप स्रोत ग्रिड से गंतव्य ग्रिड पर निर्देशांकों का मानचित्रण नहीं करते, तो डेटा गलत जगह पर चला जाएगा।
ऐसा क्यों होता है
Longitude और latitude की arrays प्रत्येक सेल की वास्तविक भौगोलिक स्थिति को दर्शाती हैं। जो दो वेरिएबल्स अलग-अलग lon/lat arrays को संदर्भित करते हैं, वे अलग ग्रिड पर हैं, भले ही उनके bounding boxes आपस में ओवरलैप करते हों। बिना भौगोलिक निकटता का ध्यान रखे इंडेक्स के आधार पर एक array को दूसरे में देना गलत है। ज़रूरत है resampling की: हर target सेल के लिए निकटतम source निर्देशांक ढूंढें और उसका मान लें।
व्यावहारिक समाधान: pyresample के साथ निकटतम lon/lat से resample करें
एक संक्षिप्त और भरोसेमंद तरीका यह है कि pyresample का उपयोग करें। विचार यह है: topography के lon/lat से source swath परिभाषित करें, land-use के lon/lat से destination swath परिभाषित करें, और फिर nearest-neighbor resampling बुलाएँ ताकि आउटपुट array का आकार गंतव्य ग्रिड जैसा हो।
from netCDF4 import Dataset
import numpy as np
from pyresample import geometry, kd_tree
lu_nc = Dataset('LUindexHCLIM3.nc', mode='a')
ztop_nc = Dataset('topography.nc', mode='r')
# land-use फाइल से फील्ड्स निकालें
landcover_main = np.array(lu_nc.variables['Main_Nature_Cover'])
lon_dest = np.array(lu_nc.variables['lon'])
lat_dest = np.array(lu_nc.variables['lat'])
# topography फाइल से फील्ड्स निकालें
z_vals = np.array(ztop_nc.variables['HGT_M'])
lon_src = np.array(ztop_nc.variables['lon'])
lat_src = np.array(ztop_nc.variables['lat'])
# pyresample के लिए source और destination की परिभाषाएँ बनाएं
src_swath = geometry.SwathDefinition(lons=lon_src, lats=lat_src)
dst_swath = geometry.SwathDefinition(lons=lon_dest, lats=lat_dest)
# land-use ग्रिड पर nearest-neighbor resampling
z_on_landuse = kd_tree.resample_nearest(
src_swath,
z_vals,
dst_swath,
radius_of_influence=500000,
fill_value=None
)
# सुविधा के लिए masked आउटपुट को NaN से भरी ndarray में बदलें
z_on_landuse = z_on_landuse.filled(np.nan)
# resampled ऊंचाइयों को land-use फाइल में सहेजें
z_var = lu_nc.createVariable('HGT_M', 'f4', ('y', 'x'))
z_var[:] = z_on_landuse
lu_nc.close()
ztop_nc.close()
यह तरीका चुने गए त्रिज्या के भीतर प्रत्येक लक्ष्य ग्रिड सेल को निकटतम स्रोत निर्देशांक की ऊंचाई सौंप देता है। जरूरत पड़े तो आप अलग-अलग इंटरपोलेशन स्कीम्स आजमा सकते हैं।
इसे सही तरीके से करना क्यों जरूरी है
सीधे lon/lat के साथ काम करने से array shapes पर निर्भर कमजोर मान्यताओं से बचाव होता है। Resampling यह सुनिश्चित करता है कि परिणामी फील्ड ठीक land-use ग्रिड पर बैठे, ताकि आगे की हर गणना समान सेल सीमाओं और स्थानों का उपयोग करे। यह खासकर तब महत्वपूर्ण होता है जब अलग-अलग मॉडलों या प्रीप्रोसेसिंग पाइपलाइनों से आए डेटासेट्स को साथ में इस्तेमाल किया जाए।
निष्कर्ष
जब दो NetCDF4 वेरिएबल्स अलग ग्रिड पर हों, तो उन्हें अलग स्थानिक लेयर्स की तरह देखें और resampling के जरिए साथ लाएँ। वास्तविक निर्देशांकों के आधार पर pyresample के nearest-neighbor का उपयोग करना topography को land-use ग्रिड पर स्थानांतरित करने का सीधा तरीका है। पहले सुनिश्चित करें कि दोनों डेटासेट्स एक ही क्षेत्र को कवर करते हैं, फिर lon/lat के जरिए resample करें और परिणाम को लक्ष्य फाइल में लिख दें। आउटपुट की गुणवत्ता में सुधार चाहिए तो इसी कार्यप्रवाह में अलग इंटरपोलेशन विकल्प आजमाएँ।
यह लेख StackOverflow पर एक प्रश्न (लेखक: Elsri) और PhoenixFire1081 के उत्तर पर आधारित है।