मैं वैश्विक मानचित्र पर नासा से सार्वजनिक डेटा के आधार पर सीओ 2 स्तरों को मैप करने की कोशिश कर रहा हूं और डेटा के आधार पर और पैनोपली सॉफ़्टवेयर का उपयोग करके उन मानों को स्थलाकृतिक मानचित्र के रूप में (लंबे, अक्षांश, मान) के रूप में चित्रित करता हूं, यही मेरी साजिश दिखनी चाहिए: यहां छवि विवरण दर्ज करें

डेटा .nc4 प्रारूप में है और सही ढंग से पढ़ा गया है, हालांकि मुझे डेटा प्लॉट नहीं मिल रहा है मैं कार्टोपी एपीआई का उपयोग कर रहा हूं और इस उदाहरण का अनुसरण कर रहा हूं:(https://scitools.org.uk/cartopy/docs/latest/gallery/waves.html #sphx-glr-gallery-waves-py)।

इसके अलावा मैं बासमैप का उपयोग नहीं करना चाहता।

प्रयास # 1:

नीचे पायथन कोड देखें:

from netCDF4 import Dataset
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import cartopy.crs as ccrs


"""
function that download each OCO - 2 data that is in .nc4 format from file "subset_OCO2_L2_ABand_V8_20180929_010345.txt"
which is list of links
for all data with date range 2015 - 09 - 01 to 2016 - 01 - 01# make sure that you have a valid user name & password by registering in https: //earthdata.nasa.gov/
#implementation based on http: //unidata.github.io/netcdf4-python/#section1"""

def download_oco2_nc4(username, password, filespath):
  filespath = "C:\\Users\\Desktop\\oco2\\oco2_LtCO2_150831_B8100r_171009083146s.nc4"
  dataset = Dataset(filespath)
  print(dataset.file_format)
  print(dataset.dimensions.keys())
  print(dataset.variables['xco2'])
  XCO2 = []
  LONGITUDE = []
  LATITUDE = []
  # XCO2
  XCO2 = dataset.variables['xco2'][:]
  print("->", type(XCO2))
  print(dataset.variables['latitude'])
  # LATITUDE
  LATITUDE = dataset.variables['latitude'][:]
  print(dataset.variables['longitude'])
  # LONGITUDE
  LONGITUDE = dataset.variables['longitude'][:]
  return XCO2, LONGITUDE, LATITUDE, dataset


def mapXoco2():
  fig = plt.figure(figsize = (10, 5))
  ax = fig.add_subplot(1, 1, 1, projection = ccrs.Mollweide())

  XCO2, LONGITUDE, LATITUDE, dataset = download_oco2_nc4(1, 2, 3)
  dataset.close()

  XCO2_subset = list()
  counter = 0
  for xco2 in XCO2:
      if counter < 10:
          XCO2_subset.append(xco2)
          counter = counter + 1
      else:
          break
  print("XCO2_subset="+str(len(XCO2_subset)))


  counter = 0
  LONGITUDE_subset = list()
  for longitude in LONGITUDE:
      if counter < 10:
          LONGITUDE_subset.append(longitude)
          counter = counter + 1
      else:
          break
  print("LONGITUDE_subset="+str(len(LONGITUDE_subset)))

  counter = 0
  LATITUDE_subset = list()
  for latitude in LATITUDE:
      if counter < 10:
          LATITUDE_subset.append(latitude)
          counter = counter + 1
      else:
          break
  print("LATITUDE_subset="+str(len(LATITUDE_subset)))

  XCO2_subset = np.array(XCO2_subset)
  LONGITUDE_subset = np.array(LONGITUDE_subset)
  LATITUDE_subset = np.array(LATITUDE_subset)
  #LONGITUDE_subset, LATITUDE_subset = np.meshgrid(LONGITUDE_subset, LATITUDE_subset)
  #XCO2_subset,XCO2_subset = np.meshgrid(XCO2_subset,XCO2_subset)
  ax.contourf(LONGITUDE_subset,LATITUDE_subset,XCO2_subset,
      transform = ccrs.Mollweide(central_longitude=0, globe=None),
      cmap = 'nipy_spectral')
  ax.coastlines()
  ax.set_global()
  plt.show()
  print(XCO2_subset)

mapXoco2()

जब मैं इन पंक्तियों पर टिप्पणी करता हूं:

 #LONGITUDE_subset, LATITUDE_subset = np.meshgrid(LONGITUDE_subset, LATITUDE_subset)
      #XCO2_subset,XCO2_subset = np.meshgrid(XCO2_subset,XCO2_subset)

मुझे एक त्रुटि मिलती है:

TypeError बढ़ाएँ ("इनपुट z एक 2D सरणी होना चाहिए।")

लेखन त्रुटि: इनपुट z एक 2D सरणी होना चाहिए।

हालांकि जब मैं इन पंक्तियों पर टिप्पणी नहीं करता:

 LONGITUDE_subset, LATITUDE_subset = np.meshgrid(LONGITUDE_subset, LATITUDE_subset)
      XCO2_subset,XCO2_subset = np.meshgrid(XCO2_subset,XCO2_subset

)

मुझे एक खाली नक्शा मिलता है, मैं महाद्वीपों को देखता हूं लेकिन कोई प्लॉट किए गए मान C02 मान नहीं हैं।

मेरा मानना ​​​​है कि मेरे इनपुट के 1D से 2D परिवर्तन की गलत व्याख्या करना।

प्रयास # 2 (अद्यतन):

एपीआई में ये 2 डी ट्रांसफॉर्मेशन क्यों/क्या कर रहे हैं, इससे निपटने के बजाय, मैं लूप का उपयोग करके प्रत्येक बिंदु 1 को 1 से प्लॉट कर रहा हूं। मुद्दा यह है कि हालांकि मैं और अधिक डेटा देख सकता हूं (मैं केवल डेटा का लगभग 10% प्लॉट कर रहा हूं)

from netCDF4 import Dataset
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import cartopy.crs as ccrs
from random import sample


"""
function that download each OCO - 2 data that is in .nc4 format from file "subset_OCO2_L2_ABand_V8_20180929_010345.txt"
which is list of links
for all data with date range 2015 - 09 - 01 to 2016 - 01 - 01# make sure that you have a valid user name & password by registering in https: //earthdata.nasa.gov/
#implementation based on http: //unidata.github.io/netcdf4-python/#section1"""

filespath = "C:\\Users\\Downloads\\oco2_LtCO2_150830_B7305Br_160712072205s.nc4"

def download_oco2_nc4(filespath):

  dataset = Dataset(filespath)
  print("file format:"+str(dataset.file_format))
  print("dimensions.keys():"+str(dataset.dimensions.keys()))
  print("variables['xco2']:"+str(dataset.variables['xco2']))
  XCO2 = []
  LONGITUDE = []
  LATITUDE = []
  # XCO2
  XCO2 = dataset.variables['xco2'][:]
  print("->", type(XCO2))
  print(dataset.variables['latitude'])
  # LATITUDE
  LATITUDE = dataset.variables['latitude'][:]
  print(dataset.variables['longitude'])
  # LONGITUDE
  LONGITUDE = dataset.variables['longitude'][:]
  return XCO2, LONGITUDE, LATITUDE, dataset


def mapXoco2():
  fig = plt.figure(figsize = (10, 5))
  ax = fig.add_subplot(1, 1, 1, projection = ccrs.Mollweide())

  XCO2, LONGITUDE, LATITUDE, dataset = download_oco2_nc4(filespath)
  dataset.close()


  XCO2_subset = np.array(XCO2)
  LONGITUDE_subset = np.array(LONGITUDE)
  LATITUDE_subset = np.array(LATITUDE)

  """each of the arrays has over 80,000 of data therefore its taking to long to map, after 10,000 rows its to slow, and 10,000 isnt sufficient. 
  Because oco-2 gathers data from trajectory the 1st 10% or whatever precent of the data will not be a good representation of the overal data. 
  We must sample from X number of  slices across the data.
  """
  #XCO2 attempt to get ten ranges, we need to check 10 ranges therefore we need if statements not if/else
  if (len(XCO2_subset)>=10000):
      first_XCO2_subset=XCO2_subset[0:1000]
  if (len(XCO2_subset)>=20000):
      second_XCO2_subset=XCO2_subset[20000:21000]
  if (len(XCO2_subset)>=30000):
      third_XCO2_subset=XCO2_subset[30000:31000]
  if (len(XCO2_subset)>=40000):
      fourth_XCO2_subset=XCO2_subset[40000:41000]
  if (len(XCO2_subset)>=50000):
      fifth_XCO2_subset=XCO2_subset[50000:51000]
  if (len(XCO2_subset)>=60000):
      sixth_XCO2_subset=XCO2_subset[60000:61000]
  if (len(XCO2_subset)>=70000):
      seventh_XCO2_subset=XCO2_subset[70000:71000]
  if (len(XCO2_subset)>=80000):
      eight_XCO2_subset=XCO2_subset[80000:81000]


  sampled_xco2 = first_XCO2_subset + second_XCO2_subset + third_XCO2_subset + fourth_XCO2_subset +  fifth_XCO2_subset + sixth_XCO2_subset + seventh_XCO2_subset +  eight_XCO2_subset

    #LONGITUDE attempt to get ten ranges, we need to check 10 ranges therefore we need if statements not if/else
  if (len(LONGITUDE_subset)>=10000):
      first_LONGITUDE_subset=LONGITUDE_subset[0:1000]
  if (len(LONGITUDE_subset)>=20000):
      second_LONGITUDE_subset=LONGITUDE_subset[20000:21000]
  if (len(LONGITUDE_subset)>=30000):
      third_LONGITUDE_subset=LONGITUDE_subset[30000:31000]
  if (len(LONGITUDE_subset)>=40000):
      fourth_LONGITUDE_subset=LONGITUDE_subset[40000:41000]
  if (len(LONGITUDE_subset)>=50000):
      fifth_LONGITUDE_subset=LONGITUDE_subset[50000:51000]
  if (len(LONGITUDE_subset)>=60000):
      sixth_LONGITUDE_subset=LONGITUDE_subset[60000:61000]
  if (len(LONGITUDE_subset)>=70000):
      seventh_LONGITUDE_subset=LONGITUDE_subset[70000:71000]
  if (len(LONGITUDE_subset)>=80000):
      eight_LONGITUDE_subset=LONGITUDE_subset[80000:81000]

  sampled_LONGITUDE = first_LONGITUDE_subset + second_LONGITUDE_subset + third_LONGITUDE_subset + fourth_LONGITUDE_subset +  fifth_LONGITUDE_subset + sixth_LONGITUDE_subset + seventh_LONGITUDE_subset +  eight_LONGITUDE_subset
  #LATITUDE attempt to get ten ranges, we need to check 10 ranges therefore we need if statements not if/else
  if (len(LATITUDE_subset)>=10000):
      first_LATITUDE_subset=LATITUDE_subset[0:1000]
  if (len(LATITUDE_subset)>=20000):
      second_LATITUDE_subset=LATITUDE_subset[20000:21000]
  if (len(LATITUDE_subset)>=30000):
      third_LATITUDE_subset=LATITUDE_subset[30000:31000]
  if (len(LATITUDE_subset)>=40000):
      fourth_LATITUDE_subset=LATITUDE_subset[40000:41000]
  if (len(LATITUDE_subset)>=50000):
      fifth_LATITUDE_subset=LATITUDE_subset[50000:51000]
  if (len(LATITUDE_subset)>=60000):
      sixth_LATITUDE_subset=LATITUDE_subset[60000:61000]
  if (len(LATITUDE_subset)>=70000):
      seventh_LATITUDE_subset=LATITUDE_subset[70000:71000]
  if (len(LATITUDE_subset)>=80000):
      eight_LATITUDE_subset=LATITUDE_subset[80000:81000]

  sampled_LATITUDE = first_LATITUDE_subset + second_LATITUDE_subset + third_LATITUDE_subset + fourth_LATITUDE_subset +  fifth_LATITUDE_subset + sixth_LATITUDE_subset + seventh_LATITUDE_subset +  eight_LATITUDE_subset

  ax = plt.axes(projection=ccrs.Mollweide())
  #plt.contourf(LONGITUDE_subset, LATITUDE_subset, XCO2_subset, 60,transform=ccrs.PlateCarree())
  for long, lat, value in zip(sampled_LONGITUDE, sampled_LATITUDE,sampled_xco2):
    #print(long, lat, value)
    if value >= 0 and value < 370:
        ax.plot(long,lat,marker='o',color='blue', markersize=1, transform=ccrs.PlateCarree())
    elif value >= 370 and value < 390:
        ax.plot(long,lat,marker='o',color='cyan', markersize=1, transform=ccrs.PlateCarree())
    elif value >= 390 and value < 402:
        ax.plot(long,lat,marker='o',color='yellow', markersize=1, transform=ccrs.PlateCarree())
    elif value >= 402 and value < 410:
        ax.plot(long,lat,marker='o',color='orange', markersize=1, transform=ccrs.PlateCarree())
    elif value >= 410 and value < 415:
        ax.plot(long,lat,marker='o',color='red', markersize=1, transform=ccrs.PlateCarree())
    else:
        ax.plot(long,lat,marker='o',color='brown', markersize=1, transform=ccrs.PlateCarree())

  ax.coastlines()
  plt.show()


mapXoco2()

आउटपुट:

फ़ाइल प्रारूप: NETCDF4

आयाम.की (): odict_keys (['साउंडिंग_आईडी', 'लेवल', 'बैंड', 'वर्टिस', 'एपोच_डिमेंशन', 'सोर्स_फाइल्स'])

चर ['xco2']: फ्लोट32 xco2(sounding_id) इकाइयां: ppm long_name: XCO2 अनुपलब्ध_वैल्यू: -999999.0 टिप्पणी: CO2 का स्तंभ-औसत शुष्क-वायु मोल अंश (पूर्वाग्रह सुधार शामिल है)

असीमित आयाम: वर्तमान आकार = (82776,) फिलिंग ऑन, डिफ़ॉल्ट _FillValue of 9.969209968386869e+36 उपयोग किया गया

-> फ्लोट 32 अक्षांश (ध्वनि_आईडी) इकाइयां: डिग्री_उत्तर लंबा_नाम: अक्षांश लापता_मान: -999999.0 टिप्पणी: माप का केंद्र अक्षांश असीमित आयाम: वर्तमान आकार = (82776,) भरना, डिफ़ॉल्ट _FillValue 9.969209968386869e+36 का उपयोग किया गया

फ्लोट 32 देशांतर (ध्वनि_आईडी) इकाइयाँ: डिग्री_पूर्व लंबा_नाम: देशांतर लापता_वैल्यू: -999999.0 टिप्पणी: माप का केंद्र देशांतर असीमित आयाम: वर्तमान आकार = (82776,) भरना, डिफ़ॉल्ट _FillValue का 9.969209968386869e+36 उपयोग किया गया

enter image description here

1) मानचित्र और महाद्वीपों का क्या हुआ?

धन्यवाद और किसी भी उपयोगी मदद की सराहना की।

-1
cyber101 2 अक्टूबर 2018, 09:46

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि आपका परिवर्तन तर्क गलत है। यदि आपके पास अक्षांश/देशांतर डेटा है तो परिवर्तन तर्क का मान ccrs.PlateCarree() होना चाहिए। विवरण के लिए कार्टोपी दस्तावेज़ में यह मार्गदर्शिका देखें: https://scitools. org.uk/cartopy/docs/latest/tutorials/understanding_transform.html

यह समाधान है यह सत्यापित करने के लिए मैं आपका उदाहरण नहीं चला सकता। स्टैक ओवरफ़्लो का अधिकतम लाभ उठाने के लिए आपको एक न्यूनतम कार्यशील उदाहरण प्रदान करना चाहिए जिसे अन्य स्वयं चला सकें। देखें https://stackoverflow.com/help/mcve और https://stackoverflow.com/help/how-to-ask

0
ajdawson 2 अक्टूबर 2018, 10:24