From 3713c5997ffc479516ec75e6001e035109fd44f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDiga=20Luk=C5=A1i=C4=8D?= <31988337+zigaLuksic@users.noreply.github.com> Date: Tue, 29 Aug 2023 10:57:59 +0200 Subject: [PATCH] Update examples (#726) * adjust the core example * update time-lapse notebook * adjust io example * remove bbox plotting in visualization example * adjust mask and land-cover examples * Reer * minor edits --------- Co-authored-by: Matic Lubej --- examples/core/CoreOverview.ipynb | 186 +++++++++++------- examples/core/TimeLapse.ipynb | 7 +- examples/io/SentinelHubIO.ipynb | 2 +- .../land-cover-map/SI_LULC_pipeline.ipynb | 6 +- examples/mask/ValidDataMask.ipynb | 14 +- .../visualization/EOPatchVisualization.ipynb | 29 --- 6 files changed, 129 insertions(+), 115 deletions(-) diff --git a/examples/core/CoreOverview.ipynb b/examples/core/CoreOverview.ipynb index 93be01955..18f3af705 100644 --- a/examples/core/CoreOverview.ipynb +++ b/examples/core/CoreOverview.ipynb @@ -28,9 +28,11 @@ "![eopatch](./images/eopatch.png)\n", "\n", "- It is designed to store all types of EO data for a single geographical location.\n", - "- Typically it is defined by a bounding box and a coordinate reference system.\n", + "- The `EOPatch` can contain data (of the same location) for multiple times. If the `EOPatch` contains multiple collections of temporal data, they must have the same temporal axis (the images must correspond to the same time-points).\n", "- There is no limit to how much data a single `EOPatch` can store, but typically it shouldn't be more than the size of your RAM.\n", "\n", + "Each `EOPatch` has an attribute `bbox` of type `sentinelhub.BBox` to define its area. The attribute `timestamps` defines the temporal component of an `EOPatch`, which is either `None` (for patches without a temporal dimension) or a list of `datetime.datetime` objects.\n", + "\n", "EO data can be divided into categories, called \"feature types\" according to the following properties:\n", "\n", "| `FeatureType` | Type of data | Time component | Spatial component | Type of values | Python object | Shape |\n", @@ -46,8 +48,6 @@ "| VECTOR | vector | yes | yes | / | `geopandas.GeoDataFrame` | Required columns `geometry` and `TIMESTAMP` |\n", "| VECTOR_TIMELESS | vector | no | yes | / | `geopandas.GeoDataFrame` | Required column `geometry` |\n", "| META_INFO | anything | no | no | anything | anything | anything |\n", - "| TIMESTAMP | timestamps | yes | no | datetime | `list(datetime.datetime)` | `t` |\n", - "| BBOX | bounding box and CRS | no | yes | coordinates | `sentinelhub.BBox` | / |\n", "\n", "Note: `t` specifies time component, `n` and `m` are spatial components (height and width), and `d` is an additional component for data with multiple channels.\n", "\n", @@ -65,58 +65,57 @@ "data": { "text/plain": [ "EOPatch(\n", - " data={\n", - " BANDS-S2-L1C: numpy.ndarray(shape=(68, 101, 100, 13), dtype=float32)\n", - " CLP: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", - " CLP_MULTI: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", - " CLP_S2C: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", - " NDVI: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", - " REFERENCE_SCENES: numpy.ndarray(shape=(5, 101, 100, 13), dtype=float32)\n", - " }\n", - " mask={\n", - " CLM: numpy.ndarray(shape=(68, 101, 100, 1), dtype=uint8)\n", - " CLM_INTERSSIM: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", - " CLM_MULTI: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", - " CLM_S2C: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", - " IS_DATA: numpy.ndarray(shape=(68, 101, 100, 1), dtype=uint8)\n", - " IS_VALID: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", + " bbox=BBox(((465181.0522318204, 5079244.8912012065), (466180.53145382757, 5080254.63349641)), crs=CRS('32633'))\n", + " timestamps=[datetime.datetime(2015, 7, 11, 10, 0, 8), ..., datetime.datetime(2017, 12, 22, 10, 4, 15)], length=68\n", + " mask_timeless={\n", + " LULC: numpy.ndarray(shape=(101, 100, 1), dtype=uint16)\n", + " RANDOM_UINT8: numpy.ndarray(shape=(101, 100, 13), dtype=uint8)\n", + " VALID_COUNT: numpy.ndarray(shape=(101, 100, 1), dtype=int64)\n", " }\n", - " scalar={\n", - " CLOUD_COVERAGE: numpy.ndarray(shape=(68, 1), dtype=float16)\n", + " vector={\n", + " CLM_VECTOR: geopandas.GeoDataFrame(columns=['TIMESTAMP', 'VALUE', 'geometry'], length=55, crs=EPSG:32633)\n", " }\n", " label={\n", " IS_CLOUDLESS: numpy.ndarray(shape=(68, 1), dtype=bool)\n", " RANDOM_DIGIT: numpy.ndarray(shape=(68, 2), dtype=int8)\n", " }\n", - " vector={\n", - " CLM_VECTOR: geopandas.GeoDataFrame(columns=['TIMESTAMP', 'VALUE', 'geometry'], length=55, crs=EPSG:32633)\n", - " }\n", - " data_timeless={\n", - " DEM: numpy.ndarray(shape=(101, 100, 1), dtype=float32)\n", - " MAX_NDVI: numpy.ndarray(shape=(101, 100, 1), dtype=float64)\n", - " }\n", - " mask_timeless={\n", - " LULC: numpy.ndarray(shape=(101, 100, 1), dtype=uint16)\n", - " RANDOM_UINT8: numpy.ndarray(shape=(101, 100, 13), dtype=uint8)\n", - " VALID_COUNT: numpy.ndarray(shape=(101, 100, 1), dtype=int64)\n", + " meta_info={\n", + " maxcc: 0.8\n", + " service_type: 'wcs'\n", + " size_x: '10m'\n", + " size_y: '10m'\n", " }\n", " scalar_timeless={\n", " LULC_PERCENTAGE: numpy.ndarray(shape=(6,), dtype=float64)\n", " }\n", - " label_timeless={\n", - " LULC_COUNTS: numpy.ndarray(shape=(6,), dtype=int32)\n", + " scalar={\n", + " CLOUD_COVERAGE: numpy.ndarray(shape=(68, 1), dtype=float16)\n", " }\n", " vector_timeless={\n", " LULC: geopandas.GeoDataFrame(columns=['index', 'RABA_ID', 'AREA', 'DATE', 'LULC_ID', 'LULC_NAME', 'geometry'], length=88, crs=EPSG:32633)\n", " }\n", - " meta_info={\n", - " maxcc: 0.8\n", - " service_type: 'wcs'\n", - " size_x: '10m'\n", - " size_y: '10m'\n", + " mask={\n", + " CLM: numpy.ndarray(shape=(68, 101, 100, 1), dtype=uint8)\n", + " CLM_INTERSSIM: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", + " CLM_MULTI: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", + " CLM_S2C: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", + " IS_DATA: numpy.ndarray(shape=(68, 101, 100, 1), dtype=uint8)\n", + " IS_VALID: numpy.ndarray(shape=(68, 101, 100, 1), dtype=bool)\n", + " }\n", + " label_timeless={\n", + " LULC_COUNTS: numpy.ndarray(shape=(6,), dtype=int32)\n", + " }\n", + " data_timeless={\n", + " DEM: numpy.ndarray(shape=(101, 100, 1), dtype=float32)\n", + " MAX_NDVI: numpy.ndarray(shape=(101, 100, 1), dtype=float64)\n", + " }\n", + " data={\n", + " BANDS-S2-L1C: numpy.ndarray(shape=(68, 101, 100, 13), dtype=float32)\n", + " CLP: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", + " CLP_MULTI: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", + " CLP_S2C: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", + " NDVI: numpy.ndarray(shape=(68, 101, 100, 1), dtype=float32)\n", " }\n", - " bbox=BBox(((465181.0522318204, 5079244.8912012065), (466180.53145382757, 5080254.63349641)), crs=CRS('32633'))\n", - " timestamps=[datetime.datetime(2015, 7, 11, 10, 0, 8), ..., datetime.datetime(2017, 12, 22, 10, 4, 15)], length=68\n", ")" ] }, @@ -298,9 +297,11 @@ }, { "data": { - "image/svg+xml": "", + "image/svg+xml": [ + "" + ], "text/plain": [ - "" + "" ] }, "execution_count": 4, @@ -330,8 +331,7 @@ { "data": { "text/plain": [ - "[(, 'REFERENCE_SCENES'),\n", - " (, 'CLP_S2C'),\n", + "[(, 'CLP_S2C'),\n", " (, 'CLP'),\n", " (, 'NDVI'),\n", " (, 'BANDS-S2-L1C'),\n", @@ -354,12 +354,10 @@ " (, 'LULC_PERCENTAGE'),\n", " (, 'LULC_COUNTS'),\n", " (, 'LULC'),\n", - " (, 'size_y'),\n", " (, 'maxcc'),\n", - " (, 'service_type'),\n", " (, 'size_x'),\n", - " (, None),\n", - " (, None)]" + " (, 'size_y'),\n", + " (, 'service_type')]" ] }, "execution_count": 5, @@ -387,13 +385,14 @@ "data": { "text/plain": [ "EOPatch(\n", + " bbox=BBox(((0.0, 0.0), (1.0, 1.0)), crs=CRS('4326'))\n", + " timestamps=[datetime.datetime(2015, 7, 11, 10, 0, 8), ..., datetime.datetime(2017, 12, 22, 10, 4, 15)], length=68\n", + " mask_timeless={\n", + " NEW_MASK: numpy.ndarray(shape=(68, 10, 13), dtype=uint8)\n", + " }\n", " data={\n", " BANDS: numpy.ndarray(shape=(68, 101, 100, 13), dtype=float32)\n", " }\n", - " mask_timeless={\n", - " NEW_MASK: numpy.ndarray(shape=(10, 10, 13), dtype=uint8)\n", - " }\n", - " bbox=BBox(((0.0, 0.0), (1.0, 1.0)), crs=CRS('4326'))\n", ")" ] }, @@ -410,9 +409,13 @@ "# Since EOPatch represents geolocated data, it should always have a bounding box\n", "new_eopatch = EOPatch(bbox=BBox((0, 0, 1, 1), CRS.WGS84))\n", "\n", - "new_eopatch[FeatureType.DATA, \"BANDS\"] = eopatch[FeatureType.DATA, \"BANDS-S2-L1C\"]\n", + "new_eopatch[FeatureType.MASK_TIMELESS, \"NEW_MASK\"] = np.zeros((68, 10, 13), dtype=np.uint8)\n", + "\n", + "# If temporal features are added to an EOPatch that does not have timestamps (or if the dimensions do not match),\n", + "# the user is warned that the EOPatch is temporall ill-defined\n", "\n", - "new_eopatch[FeatureType.MASK_TIMELESS, \"NEW_MASK\"] = np.zeros((10, 10, 13), dtype=np.uint8)\n", + "new_eopatch.timestamps = eopatch.timestamps\n", + "new_eopatch[FeatureType.DATA, \"BANDS\"] = eopatch[FeatureType.DATA, \"BANDS-S2-L1C\"]\n", "\n", "# The following wouldn't work as there are restrictions to what kind of data can be stored in each feature type\n", "# new_eopatch[FeatureType.MASK, 'NEW_MASK'] = np.zeros((10, 10, 13), dtype=np.uint8)\n", @@ -437,10 +440,11 @@ "data": { "text/plain": [ "EOPatch(\n", - " mask_timeless={\n", - " NEW_MASK: numpy.ndarray(shape=(10, 10, 13), dtype=uint8)\n", - " }\n", " bbox=BBox(((0.0, 0.0), (1.0, 1.0)), crs=CRS('4326'))\n", + " timestamps=[datetime.datetime(2015, 7, 11, 10, 0, 8), ..., datetime.datetime(2017, 12, 22, 10, 4, 15)], length=68\n", + " data={\n", + " BANDS: numpy.ndarray(shape=(68, 101, 100, 13), dtype=float32)\n", + " }\n", ")" ] }, @@ -450,7 +454,7 @@ } ], "source": [ - "del new_eopatch[FeatureType.DATA, \"BANDS\"]\n", + "del new_eopatch[FeatureType.MASK_TIMELESS, \"NEW_MASK\"]\n", "\n", "new_eopatch" ] @@ -459,7 +463,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can save `EOPatch` into a local folder. In case an `EOPatch` already exists in the specified location, we have to allow to overwrite its features." + "We can save `EOPatch` into a local folder. In case an `EOPatch` already exists in the specified location, we have to allow to overwrite its features." ] }, { @@ -523,10 +527,11 @@ "data": { "text/plain": [ "EOPatch(\n", - " mask_timeless={\n", - " NEW_MASK: numpy.ndarray(shape=(10, 10, 13), dtype=uint8)\n", - " }\n", " bbox=BBox(((0.0, 0.0), (1.0, 1.0)), crs=CRS('4326'))\n", + " timestamps=[datetime.datetime(2015, 7, 11, 10, 0, 8), ..., datetime.datetime(2017, 12, 22, 10, 4, 15)], length=68\n", + " data={\n", + " BANDS: numpy.ndarray(shape=(68, 101, 100, 13), dtype=float32)\n", + " }\n", ")" ] }, @@ -624,10 +629,11 @@ "data": { "text/plain": [ "EOPatch(\n", + " bbox=BBox(((0.0, 0.0), (1.0, 1.0)), crs=CRS('4326'))\n", + " timestamps=[datetime.datetime(2017, 1, 1, 0, 0), ..., datetime.datetime(2017, 5, 1, 0, 0)], length=5\n", " data={\n", " NEW_BANDS: numpy.ndarray(shape=(5, 100, 100, 13), dtype=float64)\n", " }\n", - " bbox=BBox(((0.0, 0.0), (1.0, 1.0)), crs=CRS('4326'))\n", ")" ] }, @@ -637,7 +643,7 @@ } ], "source": [ - "eopatch = EOPatch(bbox=BBox((0, 0, 1, 1), CRS.WGS84))\n", + "eopatch = EOPatch(bbox=BBox((0, 0, 1, 1), CRS.WGS84), timestamps=[f\"2017-0{i}-01\" for i in range(1, 6)])\n", "\n", "add_feature_task = AddFeatureTask((FeatureType.DATA, \"NEW_BANDS\"))\n", "\n", @@ -711,9 +717,53 @@ "outputs": [ { "data": { - "image/svg+xml": "\n\n\n\n\n\n%3\n\n\n\nLoad EOPatch\n\nLoad EOPatch\n\n\n\nAdd a new feature\n\nAdd a new feature\n\n\n\nLoad EOPatch->Add a new feature\n\n\n\n\n\nSave EOPatch\n\nSave EOPatch\n\n\n\nAdd a new feature->Save EOPatch\n\n\n\n\n\n", + "image/svg+xml": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "%3\n", + "\n", + "\n", + "\n", + "Load EOPatch\n", + "\n", + "Load EOPatch\n", + "\n", + "\n", + "\n", + "Add a new feature\n", + "\n", + "Add a new feature\n", + "\n", + "\n", + "\n", + "Load EOPatch->Add a new feature\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Save EOPatch\n", + "\n", + "Save EOPatch\n", + "\n", + "\n", + "\n", + "Add a new feature->Save EOPatch\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/plain": [ - "" + "" ] }, "execution_count": 14, @@ -742,7 +792,7 @@ { "data": { "text/plain": [ - "WorkflowResults(outputs={}, start_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 324680), end_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 605534), stats={'LoadTask-db6d5a07bd8711edb8fc-d53c2b78843b': NodeStats(node_uid='LoadTask-db6d5a07bd8711edb8fc-d53c2b78843b', node_name='Load EOPatch', start_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 324741), end_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 417614), exception=None, exception_traceback=None), 'AddFeatureTask-db6d5e41bd8711ed8233-a4d329d818d3': NodeStats(node_uid='AddFeatureTask-db6d5e41bd8711ed8233-a4d329d818d3', node_name='Add a new feature', start_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 419545), end_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 419576), exception=None, exception_traceback=None), 'SaveTask-db6d6164bd8711edbfb9-d491c006650a': NodeStats(node_uid='SaveTask-db6d6164bd8711edbfb9-d491c006650a', node_name='Save EOPatch', start_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 420848), end_time=datetime.datetime(2023, 3, 8, 9, 4, 40, 604000), exception=None, exception_traceback=None)}, error_node_uid=None)" + "WorkflowResults(outputs={}, start_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 733751), end_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 961589), stats={'LoadTask-939b27aa45a511eeb8db-91a8de8b81da': NodeStats(node_uid='LoadTask-939b27aa45a511eeb8db-91a8de8b81da', node_name='Load EOPatch', start_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 733806), end_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 822464), exception_info=None), 'AddFeatureTask-939b2a9b45a511eea69d-e2612971e907': NodeStats(node_uid='AddFeatureTask-939b2a9b45a511eea69d-e2612971e907', node_name='Add a new feature', start_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 825206), end_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 825267), exception_info=None), 'SaveTask-939b2cb545a511eea722-ed1665ca815d': NodeStats(node_uid='SaveTask-939b2cb545a511eea722-ed1665ca815d', node_name='Save EOPatch', start_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 827230), end_time=datetime.datetime(2023, 8, 28, 15, 19, 54, 960678), exception_info=None)}, error_node_uid=None)" ] }, "execution_count": 15, @@ -754,7 +804,7 @@ "results = workflow.execute(\n", " {\n", " load_node: {\"eopatch_folder\": \"TestEOPatch\"},\n", - " add_feature_node: {\"data\": np.zeros((10, 3), dtype=np.uint8)},\n", + " add_feature_node: {\"data\": np.zeros((68, 3), dtype=np.uint8)},\n", " save_node: {\"eopatch_folder\": \"WorkflowEOPatch\"},\n", " }\n", ")\n", diff --git a/examples/core/TimeLapse.ipynb b/examples/core/TimeLapse.ipynb index 2409e6763..f65af93ce 100644 --- a/examples/core/TimeLapse.ipynb +++ b/examples/core/TimeLapse.ipynb @@ -150,11 +150,11 @@ "metadata": {}, "outputs": [], "source": [ - "def make_gif(eopatch, output_path, fps):\n", + "def make_gif(eopatch, output_path, duration):\n", " \"\"\"\n", " Generates a GIF animation from an EOPatch.\n", " \"\"\"\n", - " with imageio.get_writer(output_path, mode=\"I\", fps=fps) as writer:\n", + " with imageio.get_writer(output_path, mode=\"I\", duration=duration) as writer:\n", " for image in eopatch:\n", " writer.append_data(np.array(image, dtype=np.uint8))" ] @@ -166,12 +166,11 @@ "outputs": [], "source": [ "OUTPUT_GIF_PATH = os.path.join(\".\", \"outputs\", \"eopatch.gif\")\n", - "DURATION = 4 # seconds\n", "\n", "make_gif(\n", " eopatch=np.clip(eopatch.data[\"RGB\"] * 2.5 * 255, 0, 255),\n", " output_path=OUTPUT_GIF_PATH,\n", - " fps=len(eopatch.timestamps) / DURATION,\n", + " duration=4, # seconds\n", ")" ] }, diff --git a/examples/io/SentinelHubIO.ipynb b/examples/io/SentinelHubIO.ipynb index 1a1466d47..da6f62462 100644 --- a/examples/io/SentinelHubIO.ipynb +++ b/examples/io/SentinelHubIO.ipynb @@ -337,7 +337,7 @@ }, "outputs": [], "source": [ - "save = SaveTask(\"io_example\", overwrite_permission=2, compress_level=1)" + "save = SaveTask(\"io_example\")" ] }, { diff --git a/examples/land-cover-map/SI_LULC_pipeline.ipynb b/examples/land-cover-map/SI_LULC_pipeline.ipynb index c34ed3f5e..7eadbc329 100644 --- a/examples/land-cover-map/SI_LULC_pipeline.ipynb +++ b/examples/land-cover-map/SI_LULC_pipeline.ipynb @@ -399,7 +399,7 @@ "add_valid_count = AddValidCountTask(\"IS_VALID\", \"VALID_COUNT\")\n", "\n", "# SAVING TO OUTPUT (if needed)\n", - "save = SaveTask(EOPATCH_FOLDER, overwrite_permission=OverwritePermission.OVERWRITE_PATCH)" + "save = SaveTask(EOPATCH_FOLDER, overwrite_permission=OverwritePermission.OVERWRITE_FEATURES)" ] }, { @@ -1282,7 +1282,7 @@ " exclude_values=[0],\n", ")\n", "\n", - "save = SaveTask(EOPATCH_SAMPLES_FOLDER, overwrite_permission=OverwritePermission.OVERWRITE_PATCH)" + "save = SaveTask(EOPATCH_SAMPLES_FOLDER, overwrite_permission=OverwritePermission.OVERWRITE_FEATURES)" ] }, { @@ -1967,7 +1967,7 @@ "predict = PredictPatchTask(model, (FeatureType.DATA, \"FEATURES\"), \"LBL_GBM\", \"SCR_GBM\")\n", "\n", "# SAVE\n", - "save = SaveTask(EOPATCH_SAMPLES_FOLDER, overwrite_permission=OverwritePermission.OVERWRITE_PATCH)\n", + "save = SaveTask(EOPATCH_SAMPLES_FOLDER, overwrite_permission=OverwritePermission.OVERWRITE_FEATURES)\n", "\n", "# EXPORT TIFF\n", "tiff_location = os.path.join(RESULTS_FOLDER, \"predicted_tiff\")\n", diff --git a/examples/mask/ValidDataMask.ipynb b/examples/mask/ValidDataMask.ipynb index 6f800c2f8..cf4ff8ea8 100644 --- a/examples/mask/ValidDataMask.ipynb +++ b/examples/mask/ValidDataMask.ipynb @@ -139,22 +139,16 @@ "data": { "text/plain": [ "EOPatch(\n", - " data={\n", - " trueColorBands: numpy.ndarray(shape=(9, 118, 205, 3), dtype=float32)\n", - " }\n", + " bbox=BBox(((12.14, 45.36), (12.55, 45.54)), crs=CRS('4326'))\n", + " timestamps=[datetime.datetime(2020, 6, 2, 10, 18, 8), ..., datetime.datetime(2020, 6, 22, 10, 18, 9)], length=9\n", " mask={\n", " CLM: numpy.ndarray(shape=(9, 118, 205, 1), dtype=uint8)\n", " VALID_DATA: numpy.ndarray(shape=(9, 118, 205, 1), dtype=bool)\n", " dataMask: numpy.ndarray(shape=(9, 118, 205, 1), dtype=bool)\n", " }\n", - " meta_info={\n", - " size_x: 205\n", - " size_y: 118\n", - " time_difference: 7200.0\n", - " time_interval: ('2020-06-01T00:00:00', '2020-06-23T23:59:59')\n", + " data={\n", + " trueColorBands: numpy.ndarray(shape=(9, 118, 205, 3), dtype=float32)\n", " }\n", - " bbox=BBox(((12.14, 45.36), (12.55, 45.54)), crs=CRS('4326'))\n", - " timestamps=[datetime.datetime(2020, 6, 2, 10, 18, 8), ..., datetime.datetime(2020, 6, 22, 10, 18, 9)], length=9\n", ")" ] }, diff --git a/examples/visualization/EOPatchVisualization.ipynb b/examples/visualization/EOPatchVisualization.ipynb index f0e693546..d61f1c57c 100644 --- a/examples/visualization/EOPatchVisualization.ipynb +++ b/examples/visualization/EOPatchVisualization.ipynb @@ -324,35 +324,6 @@ "source": [ "eopatch.plot((FeatureType.VECTOR, \"CLM_VECTOR\"), times=slice(6, 9));" ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Additionally we can plot a bounding box feature on its own." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "eopatch.plot(FeatureType.BBOX);" - ] } ], "metadata": {