Note
This page was generated from examples/notebooks/read_granules.ipynb.
Read Granules#
[1]:
import starepandas
import netCDF4
import matplotlib.pyplot as plt
import numpy
import pandas
import time
import copy
import geopandas
import pystare
import pyhdf
Manually reading#
[2]:
vnp03_name = '../tests/data/granules/VNP03DNB.A2020219.0742.001.2020219124651.nc'
vnp03 = starepandas.io.granules.VNP03DNB(vnp03_name)
vnp03.read_latlon()
vnp03.read_data()
vnp03 = vnp03.to_df(xy=True)
VNP03#
[14]:
file_path = '../tests/data/granules/VNP09.A2021171.2124.001.2021172033635.hdf'
vnp09 = starepandas.io.granules.viirsl2.VNP09(file_path, nom_res='750m')
vnp09.read_data()
vnp09.read_timestamps()
[15]:
vnp03_path = vnp09.guess_companion_path(prefix='VNP03')
vnp03 = starepandas.io.granules.VNP03MOD(vnp03_path)
vnp03.read_data()
vnp03.read_sidecar_index()
vnp03.read_sidecar_latlon()
[16]:
vnp09 = vnp09.to_df(xy=True)
vnp03 = vnp03.to_df()
vnp09 = vnp09.join(vnp03)
vnp09.dropna(inplace=True)
[17]:
qf1 = starepandas.io.granules.viirsl2.decode_qf1(vnp09['QF1 Surface Reflectance'])
qf2 = starepandas.io.granules.viirsl2.decode_qf2(vnp09['QF2 Surface Reflectance'])
vnp09 = vnp09.join(qf1).join(qf2)
[20]:
pandas.DataFrame(vnp09).plot(x='x', y='sensor_zenith', kind='scatter')
[20]:
<AxesSubplot:xlabel='x', ylabel='sensor_zenith'>
MOD09GA#
[7]:
file_name = '../tests/data/granules/MOD09GA.A2020009.h00v08.006.2020011025435.hdf'
[8]:
mod09ga = starepandas.read_granule(file_name, xy=True)
mod09ga
[8]:
| x | y | sur_refl_b01_1 | sur_refl_b02_1 | sur_refl_b03_1 | sur_refl_b04_1 | sur_refl_b05_1 | sur_refl_b06_1 | sur_refl_b07_1 | QC_500m_1 | obscov_500m_1 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN |
| 1 | 1 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN |
| 2 | 2 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN |
| 3 | 3 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN |
| 4 | 4 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 5759995 | 2395 | 2399 | 0.2020 | 0.1939 | 0.2187 | 0.2053 | 0.1872 | 0.1359 | 0.0817 | 1073741824 | 0.15 |
| 5759996 | 2396 | 2399 | 0.2122 | 0.2043 | 0.2320 | 0.2174 | 0.2015 | 0.1356 | 0.0900 | 1073741824 | 0.19 |
| 5759997 | 2397 | 2399 | 0.2122 | 0.2043 | 0.2320 | 0.2174 | 0.2015 | 0.1356 | 0.0900 | 1073741824 | 0.19 |
| 5759998 | 2398 | 2399 | 0.2174 | 0.2094 | 0.2342 | 0.2225 | 0.2074 | 0.1464 | 0.0867 | 1073741824 | 0.11 |
| 5759999 | 2399 | 2399 | 0.2174 | 0.2094 | 0.2342 | 0.2225 | 0.2074 | 0.1464 | 0.0867 | 1073741824 | 0.14 |
5760000 rows × 11 columns
[9]:
mod09ga = starepandas.io.granules.Mod09GA(file_name)
mod09ga.read_data()
ds_name = 'state_1km_1'
mod09ga.read_dataset(ds_name, resample_factor=2)
mod09ga.decode_state('state_1km_1')
mod09ga.to_df()
[9]:
| sur_refl_b01_1 | sur_refl_b02_1 | sur_refl_b03_1 | sur_refl_b04_1 | sur_refl_b05_1 | sur_refl_b06_1 | sur_refl_b07_1 | QC_500m_1 | obscov_500m_1 | state_1km_1 | cloud | cloud_shadow | cloud_internal | snow_mod35 | snow_internal | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN | <NA> | <NA> | True | True | True | True |
| 1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN | <NA> | <NA> | True | True | True | True |
| 2 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN | <NA> | <NA> | True | True | True | True |
| 3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN | <NA> | <NA> | True | True | True | True |
| 4 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | <NA> | NaN | <NA> | <NA> | True | True | True | True |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 5759995 | 0.2020 | 0.1939 | 0.2187 | 0.2053 | 0.1872 | 0.1359 | 0.0817 | 1073741824 | 0.15 | 1849 | 1 | False | True | False | False |
| 5759996 | 0.2122 | 0.2043 | 0.2320 | 0.2174 | 0.2015 | 0.1356 | 0.0900 | 1073741824 | 0.19 | 1849 | 1 | False | True | False | False |
| 5759997 | 0.2122 | 0.2043 | 0.2320 | 0.2174 | 0.2015 | 0.1356 | 0.0900 | 1073741824 | 0.19 | 1849 | 1 | False | True | False | False |
| 5759998 | 0.2174 | 0.2094 | 0.2342 | 0.2225 | 0.2074 | 0.1464 | 0.0867 | 1073741824 | 0.11 | 1849 | 1 | False | True | False | False |
| 5759999 | 0.2174 | 0.2094 | 0.2342 | 0.2225 | 0.2074 | 0.1464 | 0.0867 | 1073741824 | 0.14 | 1849 | 1 | False | True | False | False |
5760000 rows × 15 columns
[10]:
sd = pyhdf.SD.SD(file_name)
ds = sd.select('sur_refl_b01_1')
ds.get()/ ds.attributes()['scale_factor']
[10]:
array([[-2.8672, -2.8672, -2.8672, ..., -2.8672, -2.8672, -2.8672],
[-2.8672, -2.8672, -2.8672, ..., -2.8672, -2.8672, -2.8672],
[-2.8672, -2.8672, -2.8672, ..., -2.8672, -2.8672, -2.8672],
...,
[-2.8672, -2.8672, -2.8672, ..., 0.2104, 0.2027, 0.2159],
[-2.8672, -2.8672, -2.8672, ..., 0.2104, 0.2307, 0.2307],
[-2.8672, -2.8672, -2.8672, ..., 0.2122, 0.2174, 0.2174]])
MOD09#
[11]:
file_name = '../tests/data/granules/MOD09.A2002299.0710.006.2015151173939.hdf'
mod09 = starepandas.read_granule(file_name)
[12]:
starepandas.io.granules.modis.decode_state(mod09['1km Reflectance Data State QA'])
[12]:
| cloud | cloud_shadow | cloud_internal | snow_mod35 | snow_internal | |
|---|---|---|---|---|---|
| 0 | 00 | False | False | False | False |
| 1 | 00 | False | False | False | False |
| 2 | 00 | False | False | False | False |
| 3 | 00 | False | False | False | False |
| 4 | 00 | False | False | False | False |
| ... | ... | ... | ... | ... | ... |
| 2748615 | 00 | False | False | False | False |
| 2748616 | 00 | False | False | False | False |
| 2748617 | 00 | False | False | False | False |
| 2748618 | 00 | False | False | False | False |
| 2748619 | 00 | False | False | False | False |
2748620 rows × 5 columns
MOD05#
[13]:
fname = '../tests/data/granules/MOD05_L2.A2019336.0000.061.2019336211522.hdf'
mod05 = starepandas.read_granule(fname, sidecar=True, latlon=True, xy=True, read_timestamp=True)
sids = mod05.to_array(mod05._sid_column_name)
#mod05.to_sidecar('test.nc')
[14]:
mod05
[14]:
| lat | lon | sids | ts_start | ts_end | x | y | Scan_Start_Time | Solar_Zenith | Solar_Azimuth | Sensor_Zenith | Sensor_Azimuth | Water_Vapor_Infrared | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 53.201778 | -15.933996 | 4298473764500464809 | 2019-12-02 | 2019-12-02 00:05:00 | 0 | 0 | 8.493984e+08 | 147.089997 | -22.959999 | 65.339999 | -89.519998 | NaN |
| 1 | 53.203171 | -16.288101 | 4298458168380511209 | 2019-12-02 | 2019-12-02 00:05:00 | 1 | 0 | 8.493984e+08 | 146.999997 | -23.539999 | 64.719999 | -89.799998 | NaN |
| 2 | 53.203518 | -16.629105 | 4297394569014717897 | 2019-12-02 | 2019-12-02 00:05:00 | 2 | 0 | 8.493984e+08 | 146.919997 | -24.099999 | 64.109999 | -90.079998 | NaN |
| 3 | 53.202934 | -16.957928 | 4297300698872999369 | 2019-12-02 | 2019-12-02 00:05:00 | 3 | 0 | 8.493984e+08 | 146.839997 | -24.639999 | 63.509999 | -90.339998 | NaN |
| 4 | 53.201508 | -17.275316 | 4297290857922121161 | 2019-12-02 | 2019-12-02 00:05:00 | 4 | 0 | 8.493984e+08 | 146.759997 | -25.159999 | 62.909999 | -90.589998 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 109615 | 64.084297 | -66.281410 | 3727686638370615689 | 2019-12-02 | 2019-12-02 00:05:00 | 265 | 405 | 8.493987e+08 | 121.569997 | -74.679998 | 62.229999 | 47.999999 | NaN |
| 109616 | 63.960953 | -66.591354 | 3727661374545790857 | 2019-12-02 | 2019-12-02 00:05:00 | 266 | 405 | 8.493987e+08 | 121.469997 | -75.049998 | 62.819999 | 47.719999 | NaN |
| 109617 | 63.831799 | -66.911255 | 3727838256925064969 | 2019-12-02 | 2019-12-02 00:05:00 | 267 | 405 | 8.493987e+08 | 121.369997 | -75.439998 | 63.419999 | 47.429999 | NaN |
| 109618 | 63.698635 | -67.236229 | 3727843063731949801 | 2019-12-02 | 2019-12-02 00:05:00 | 268 | 405 | 8.493987e+08 | 121.259997 | -75.829998 | 64.019999 | 47.139999 | NaN |
| 109619 | 63.551617 | -67.589508 | 3727853163225616425 | 2019-12-02 | 2019-12-02 00:05:00 | 269 | 405 | 8.493987e+08 | 121.149997 | -76.249998 | 64.639999 | 46.819999 | NaN |
109620 rows × 13 columns
Subset Loading#
[15]:
import shapely
roi = shapely.geometry.Polygon([[-120, 37],[-120, 38],[-119, 38],[-119, 37]])
roi = geopandas.GeoDataFrame(geometry=[roi], crs=4326)
roi = starepandas.STAREDataFrame(roi)
roi['sids'] = roi.make_sids(level=10)
sids = roi.sids.iloc[0]
[16]:
roi.plot(trixels=False)
[16]:
<AxesSubplot:>
[17]:
fname = '../tests/data/granules/MOD05_L2.A2019336.0000.061.2019336211522.hdf'
mod = starepandas.io.granules.Mod05(fname)
mod.read_sidecar_index()
[18]:
intersects = pystare.intersects(sids, mod.sids.flatten())
intersects = numpy.reshape(intersects, mod.sids.shape)
intersects
[18]:
array([[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]])
VNP02#
[19]:
vnp02_name = '../tests/data/granules/VNP02DNB.A2020219.0742.001.2020219125654.nc'
vnp02 = starepandas.read_granule(vnp02_name, sidecar=False, latlon=False)
[20]:
vnp02 = vnp03.join(vnp02)
[21]:
vnp02[(vnp02.land_water_mask==2) | (vnp02.land_water_mask==4) | (vnp02.land_water_mask==6) | (vnp02.land_water_mask==7)]
[21]:
| lat | lon | sids | land_water_mask | quality_flag | sensor_azimuth | sensor_zenith | solar_azimuth | solar_zenith | DNB_observations | DNB_quality_flags | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 626 | 40.365364 | -116.543037 | 3349072184256855310 | 2 | 0 | -94.070000 | 53.189999 | -122.680000 | 26.349998 | 2.836819e-09 | 16 |
| 627 | 40.364918 | -116.550812 | 3349076340608032526 | 2 | 0 | -94.070000 | 53.169998 | -122.699997 | 26.349998 | 3.408683e-09 | 16 |
| 882 | 40.144939 | -119.681236 | 3329808662558372205 | 2 | 0 | -96.000000 | 41.889999 | -127.229996 | 24.260000 | 2.692489e-09 | 16 |
| 883 | 40.144070 | -119.691635 | 3329808674148991821 | 2 | 0 | -96.009995 | 41.840000 | -127.250000 | 24.250000 | 2.414932e-09 | 16 |
| 1101 | 39.917175 | -122.075150 | 3329886257896566573 | 2 | 0 | -97.360001 | 30.549999 | -131.029999 | 22.699999 | 2.446824e-09 | 16 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 10188795 | -999.900024 | -999.900024 | 4026270999897165857 | 7 | 1 | NaN | NaN | NaN | NaN | 2.496130e-09 | 0 |
| 10188796 | -999.900024 | -999.900024 | -296497120 | 7 | 1 | NaN | NaN | NaN | NaN | 3.096395e-09 | 0 |
| 10188797 | -999.900024 | -999.900024 | 4026270999897165857 | 7 | 1 | NaN | NaN | NaN | NaN | 2.796263e-09 | 0 |
| 10188798 | -999.900024 | -999.900024 | -296497120 | 7 | 1 | NaN | NaN | NaN | NaN | 2.075945e-09 | 0 |
| 10188799 | -999.900024 | -999.900024 | 4026270999897165857 | 7 | 1 | NaN | NaN | NaN | NaN | 2.256024e-09 | 0 |
6437036 rows × 11 columns
VNP CLDMSK#
[22]:
cldmsk_name = '../tests/data/granules/CLDMSK_L2_VIIRS_SNPP.A2020219.0742.001.2020219190616.nc'
[23]:
cldmsk = starepandas.io.granules.CLDMSKL2VIIRS(cldmsk_name)
[24]:
cldmsk.read_latlon()
cldmsk.read_data()
cldmsk.to_df()
[24]:
| lat | lon | Integer_Cloud_Mask | |
|---|---|---|---|
| 0 | 41.747662 | -104.969498 | 3 |
| 1 | 41.747696 | -104.950218 | 3 |
| 2 | 41.747730 | -104.930237 | 3 |
| 3 | 41.747761 | -104.910843 | 3 |
| 4 | 41.747784 | -104.891747 | 3 |
| ... | ... | ... | ... |
| 10342395 | 16.522247 | -78.595093 | 2 |
| 10342396 | 16.518646 | -78.580162 | 1 |
| 10342397 | 16.515034 | -78.565208 | 0 |
| 10342398 | 16.511414 | -78.550224 | 1 |
| 10342399 | 16.507788 | -78.535187 | 1 |
10342400 rows × 3 columns
Plotting#
[25]:
path = '../tests/data/granules/VNP03DNB.A2020219.0742.001.2020219124651.nc'
vnp03dnb = starepandas.io.granules.VNP03DNB(path)
vnp03dnb.read_latlon()
path = '../tests/data/granules/VNP03MOD.A2020219.0742.001.2020219124651.nc'
vnp03mod = starepandas.io.granules.VNP03MOD(path)
vnp03mod.read_latlon()
path = '../tests/data/granules/CLDMSK_L2_VIIRS_SNPP.A2020219.0742.001.2020219190616.nc'
cldmsk = starepandas.io.granules.CLDMSKL2VIIRS(path)
cldmsk.read_latlon()
[26]:
fig, ax = plt.subplots(figsize=(5,5), dpi=100)
n = 20
ns = 0
nt = 0
ax.grid('on')
ax.plot(cldmsk.lon[ns:ns+n, nt:nt+n].flatten(), cldmsk.lat[ns:ns+n, nt:nt+n].flatten(),
color='r', lw=0, marker='.')
ax.plot(vnp03mod.lon[ns:ns+n, nt:nt+n].flatten(), vnp03mod.lat[ns:ns+n, nt:nt+n].flatten(),
color='g',lw=0, marker='.')
ax.plot(vnp03dnb.lon[ns:ns+n, nt:nt+n].flatten(), vnp03dnb.lat[ns:ns+n, nt:nt+n].flatten(),
color='b',lw=0, marker='.')
[26]:
[<matplotlib.lines.Line2D at 0x7fef877ed000>]
[ ]: