Skip to content

Instantly share code, notes, and snippets.

@hevgyrt
Last active November 20, 2019 08:08
Show Gist options
  • Save hevgyrt/77154094289a7bdf250a19efa9d6716d to your computer and use it in GitHub Desktop.
Save hevgyrt/77154094289a7bdf250a19efa9d6716d to your computer and use it in GitHub Desktop.
Read Sentinel-2 L2A (bottom of atmosphere) product in NetCDF/CF by means of OPeNDAP from satellittdata.no
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"__This notebook shows how to read Sentinel-2 L2A products in NetCDF/CF by means of OPeNDAP.__\n",
"\n",
"Data is served through the Norwegian ground degment for satellite data (www.satellittdata.no)."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"from netCDF4 import Dataset\n",
"\n",
"s2_url = \"http://nbstds.met.no/thredds/dodsC/NBS/test/S2B_MSIL2A_20191001T105849_N0213_R094_T32VLK_20191001T140823.nc\"\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"ncin = Dataset(s2_url,'r')"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'netCDF4._netCDF4.Dataset'>\n",
"root group (NETCDF3_CLASSIC data model, file format DAP2):\n",
" _NCProperties: version=2,netcdf=4.6.2,hdf5=1.10.5\n",
" title: Sentinel-2 Level-2A data\n",
" netcdf4_version_id: 4.6.2\n",
" file_creation_date: 2019-10-04T14:23:24Z\n",
" AOT_QUANTIFICATION_VALUE: 1000.0\n",
" AOT_QUANTIFICATION_VALUE_UNIT: none\n",
" AOT_RETRIEVAL_ACCURACY: 0.0\n",
" BOA_QUANTIFICATION_VALUE: 10000\n",
" BOA_QUANTIFICATION_VALUE_UNIT: none\n",
" CLOUD_COVERAGE_ASSESSMENT: 12.157538\n",
" CLOUD_SHADOW_PERCENTAGE: 4.118643\n",
" DARK_FEATURES_PERCENTAGE: 3.206031\n",
" DATATAKE_1_DATATAKE_SENSING_START: 2019-10-01T10:58:49.025Z\n",
" DATATAKE_1_DATATAKE_TYPE: INS-NOBS\n",
" DATATAKE_1_ID: GS2B_20191001T105849_013419_N02.13\n",
" DATATAKE_1_SENSING_ORBIT_DIRECTION: DESCENDING\n",
" DATATAKE_1_SPACECRAFT_NAME: Sentinel-2B\n",
" DEGRADED_ANC_DATA_PERCENTAGE: 0.0\n",
" DEGRADED_MSI_DATA_PERCENTAGE: 0\n",
" FOOTPRINT: POLYGON((5.558265107108251 58.5945886925831, 7.446490338604399 58.631278079015125, 7.488843962689502 57.64542268456104, 5.651925366744611 57.61010611826214, 5.558265107108251 58.5945886925831))\n",
" FORMAT_CORRECTNESS: PASSED\n",
" GENERAL_QUALITY: PASSED\n",
" GENERATION_TIME: 2019-10-01T14:08:23.000000Z\n",
" GEOMETRIC_QUALITY: PASSED\n",
" HIGH_PROBA_CLOUDS_PERCENTAGE: 4.753667\n",
" MEDIUM_PROBA_CLOUDS_PERCENTAGE: 4.436034\n",
" NODATA_PIXEL_PERCENTAGE: 0.0\n",
" NOT_VEGETATED_PERCENTAGE: 0.846361\n",
" PREVIEW_GEO_INFO: Not applicable\n",
" PREVIEW_IMAGE_URL: Not applicable\n",
" PROCESSING_BASELINE: 02.13\n",
" PROCESSING_LEVEL: Level-2A\n",
" PRODUCT_START_TIME: 2019-10-01T10:58:49.025Z\n",
" PRODUCT_STOP_TIME: 2019-10-01T10:58:49.025Z\n",
" PRODUCT_TYPE: S2MSI2A\n",
" PRODUCT_URI: S2B_MSIL2A_20191001T105849_N0213_R094_T32VLK_20191001T140823.SAFE\n",
" RADIATIVE_TRANSFER_ACCURACY: 0.0\n",
" RADIOMETRIC_QUALITY: PASSED\n",
" REFLECTANCE_CONVERSION_U: 0.996095409614864\n",
" SATURATED_DEFECTIVE_PIXEL_PERCENTAGE: 0.0\n",
" SENSOR_QUALITY: PASSED\n",
" SNOW_ICE_PERCENTAGE: 4.508333\n",
" SPECIAL_VALUE_NODATA: 0\n",
" SPECIAL_VALUE_SATURATED: 65535\n",
" THIN_CIRRUS_PERCENTAGE: 2.967837\n",
" UNCLASSIFIED_PERCENTAGE: 2.507394\n",
" VEGETATION_PERCENTAGE: 22.086824\n",
" WATER_PERCENTAGE: 50.568879\n",
" WATER_VAPOUR_RETRIEVAL_ACCURACY: 0.0\n",
" WVP_QUANTIFICATION_VALUE: 1000.0\n",
" WVP_QUANTIFICATION_VALUE_UNIT: cm\n",
" Conventions: CF-1.6\n",
" summary: Sentinel-2 Multi-Spectral Instrument Level-2A product.\n",
" keywords: [Earth Science, Atmosphere, Atmospheric radiation, Reflectance]\n",
" keywords_vocabulary: GCMD Science Keywords\n",
" institution: Norwegian Meteorological Institute\n",
" history: 2019-10-04T14:23:24Z. Converted from SAFE to NetCDF by NBS team.\n",
" source: surface observation\n",
" orbitNumber: 013419\n",
" relativeOrbitNumber: 94\n",
" DODS.strlen: 10694\n",
" DODS.dimName: dimension_SAFE_structure\n",
" dimensions(sizes): dimension_rgb(3), maxStrlen64(64), time(1), x(10980), y(10980)\n",
" variables(dimensions): int32 \u001b[4mtime\u001b[0m(time), int32 \u001b[4mx\u001b[0m(x), int32 \u001b[4my\u001b[0m(y), int8 \u001b[4mTCI\u001b[0m(time,dimension_rgb,y,x), int32 \u001b[4mUTM_projection\u001b[0m(), |S1 \u001b[4mS2_Level_2A_Product_Metadata\u001b[0m(maxStrlen64), |S1 \u001b[4mINSPIRE_Metadata\u001b[0m(maxStrlen64), |S1 \u001b[4mS2_Level_2A_Tile1_Metadata\u001b[0m(maxStrlen64), |S1 \u001b[4mFormat_OLQC_Report_Tile1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mGeneral_OLQC_Report_Tile1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mGeometric_OLQC_Report_Tile1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mRadiometric_OLQC_Report_Tile1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mSensor_OLQC_Report_Tile1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mS2_Level_2A_Datastrip1_Metadata\u001b[0m(maxStrlen64), |S1 \u001b[4mFormat_OLQC_Report_Datastrip1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mGeneral_OLQC_Report_Datastrip1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mGeometric_OLQC_Report_Datastrip1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mRadiometric_OLQC_Report_Datastrip1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mSensor_OLQC_Report_Datastrip1_InformationData\u001b[0m(maxStrlen64), |S1 \u001b[4mSAFE_structure\u001b[0m(maxStrlen64), float32 \u001b[4mlat\u001b[0m(y,x), float32 \u001b[4mlon\u001b[0m(y,x), int16 \u001b[4mB4\u001b[0m(time,y,x), int16 \u001b[4mB3\u001b[0m(time,y,x), int16 \u001b[4mB2\u001b[0m(time,y,x), int16 \u001b[4mB8\u001b[0m(time,y,x), int16 \u001b[4mB5\u001b[0m(time,y,x), int16 \u001b[4mB6\u001b[0m(time,y,x), int16 \u001b[4mB7\u001b[0m(time,y,x), int16 \u001b[4mB8A\u001b[0m(time,y,x), int16 \u001b[4mB11\u001b[0m(time,y,x), int16 \u001b[4mB12\u001b[0m(time,y,x), int16 \u001b[4mB1\u001b[0m(time,y,x), int16 \u001b[4mB9\u001b[0m(time,y,x), int8 \u001b[4mClouds\u001b[0m(time,y,x), int8 \u001b[4mMSK_DEFECT_B12\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B01\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B02\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B03\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B04\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B05\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B06\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B07\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B08\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B09\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B10\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B11\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B12\u001b[0m(time,y,x), int8 \u001b[4mMSK_DETFOO_B8A\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B01\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B04\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B05\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B07\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B08\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B09\u001b[0m(time,y,x), int8 \u001b[4mMSK_NODATA_B10\u001b[0m(time,y,x), int8 \u001b[4mMSK_CLDPRB\u001b[0m(time,y,x), int8 \u001b[4mMSK_SNWPRB\u001b[0m(time,y,x), int16 \u001b[4mAOT\u001b[0m(time,y,x), int16 \u001b[4mWVP\u001b[0m(time,y,x), int8 \u001b[4mSCL\u001b[0m(time,y,x), float32 \u001b[4msun_zenith\u001b[0m(time,y,x), float32 \u001b[4msun_azimuth\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B1\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B1\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B2\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B2\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B3\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B3\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B4\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B4\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B5\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B5\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B6\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B6\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B7\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B7\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B8\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B8\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B8A\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B8A\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B9\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B9\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B10\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B10\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B11\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B11\u001b[0m(time,y,x), float32 \u001b[4mview_zenith_B12\u001b[0m(time,y,x), float32 \u001b[4mview_azimuth_B12\u001b[0m(time,y,x)\n",
" groups: \n",
"\n"
]
}
],
"source": [
"# Printing the content of the dataset\n",
"print(ncin)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'netCDF4._netCDF4.Variable'>\n",
"int16 B2(time, y, x)\n",
" _FillValue: 0\n",
" units: 1\n",
" coordinates: lat lon\n",
" grid_mapping: UTM_projection\n",
" standard_name: toa_bidirectional_reflectance\n",
" long_name: Reflectance in band B2\n",
" bandwidth: 65\n",
" bandwidth_unit: nm\n",
" wavelength: 490\n",
" wavelength_unit: nm\n",
" solar_irradiance: 1959.77\n",
" solar_irradiance_unit: W/m2/um\n",
" _Unsigned: true\n",
" _ChunkSizes: [ 1 32 32]\n",
"unlimited dimensions: \n",
"current shape = (1, 10980, 10980)\n",
"filling off\n",
"\n"
]
}
],
"source": [
"# print metadata for reflectance band B2\n",
"print(ncin['B2'])"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[6288 6328 6288 ... 12176 12224 12112]\n",
" [6280 6284 6288 ... 12256 12184 12048]\n",
" [6232 6172 6216 ... 12184 12128 12080]\n",
" ...\n",
" [11888 11864 11848 ... 8912 8744 8800]\n",
" [11584 11544 11424 ... 8832 8696 8560]\n",
" [11280 11136 10896 ... 8880 8688 8544]]\n"
]
}
],
"source": [
"# print a subset of the data\n",
"print(ncin['B2'][0,100:300,200:400]) #time=0, y=100:300, x=200:400"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment