{ "metadata": { "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.8.6" }, "orig_nbformat": 2, "kernelspec": { "name": "python3", "display_name": "Python 3.8.6 64-bit", "metadata": { "interpreter": { "hash": "0cf725079c7d16f2cba0a185a776402bb287255802a557bed9d05e4eed5bfa43" } } } }, "nbformat": 4, "nbformat_minor": 2, "cells": [ { "source": [ "# Serialize/Deserialize" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "The [EODataAccessGateway](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway) class provides methods to save a [SearchResult](../../api_reference/searchresult.rst#eodag.api.search_result.SearchResult) object to a GeoJSON file or to load a GeoJSON file to a [SearchResult](../../api_reference/searchresult.rst#eodag.api.search_result.SearchResult). These methods come in handy to save the state of a search and restore it later.\n", "\n", "The credentials are required in this notebook to download a quicklook from *PEPS*." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "os.environ[\"EODAG__PEPS__AUTH__CREDENTIALS__USERNAME\"] = \"PLEASE_CHANGE_ME\"\n", "os.environ[\"EODAG__PEPS__AUTH__CREDENTIALS__PASSWORD\"] = \"PLEASE_CHANGE_ME\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "2021-04-12 23:54:53,617-15s eodag.config [INFO ] Loading user configuration from: /home/maxime/.config/eodag/eodag.yml\n", "2021-04-12 23:54:54,450-15s eodag.core [INFO ] Locations configuration loaded from /home/maxime/.config/eodag/locations.yml\n" ] } ], "source": [ "from eodag import EODataAccessGateway\n", "from eodag import setup_logging\n", "\n", "setup_logging(2)\n", "\n", "dag = EODataAccessGateway()\n", "dag.set_preferred_provider(\"peps\")" ] }, { "source": [ "## Serialize" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "The method [serialize()](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.serialize) allows to save a [SearchResult](../../api_reference/searchresult.rst#eodag.api.search_result.SearchResult) as a *GeoJSON* file." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "output_type": "stream", "name": "stderr", "text": [ "2021-04-12 23:54:56,405-15s eodag.core [INFO ] Searching product type 'S2_MSI_L1C' on provider: peps\n", "2021-04-12 23:54:56,411-15s eodag.plugins.search.qssearch [INFO ] Sending count request: https://peps.cnes.fr/resto/api/collections/S2ST/search.json?startDate=2021-03-01&completionDate=2021-03-31&geometry=POLYGON ((1.0000 43.0000, 1.0000 44.0000, 2.0000 44.0000, 2.0000 43.0000, 1.0000 43.0000))&productType=S2MSI1C&maxRecords=1&page=1\n", "2021-04-12 23:54:57,131-15s eodag.plugins.search.qssearch [INFO ] Sending search request: https://peps.cnes.fr/resto/api/collections/S2ST/search.json?startDate=2021-03-01&completionDate=2021-03-31&geometry=POLYGON ((1.0000 43.0000, 1.0000 44.0000, 2.0000 44.0000, 2.0000 43.0000, 1.0000 43.0000))&productType=S2MSI1C&maxRecords=2&page=1\n", "2021-04-12 23:54:57,983-15s eodag.core [INFO ] Found 48 result(s) on provider 'peps'\n" ] } ], "source": [ "search_results, _ = dag.search(\n", " productType=\"S2_MSI_L1C\",\n", " start=\"2021-03-01\",\n", " end=\"2021-03-31\",\n", " geom={\"lonmin\": 1, \"latmin\": 43, \"lonmax\": 2, \"latmax\": 44},\n", " items_per_page=2\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[EOProduct(id=S2B_MSIL1C_20210328T103629_N0209_R008_T31TCJ_20210328T124650, provider=peps), EOProduct(id=S2B_MSIL1C_20210328T103629_N0209_R008_T31TCH_20210328T124650, provider=peps)]" ] }, "metadata": {}, "execution_count": 4 } ], "source": [ "search_results" ] }, { "source": [ "A folder is created to save the output of this notebook." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "workspace = \"eodag_workspace_serialize_deserialize\"\n", "if not os.path.isdir(workspace):\n", " os.mkdir(workspace)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'eodag_workspace_serialize_deserialize/search_results.geojson'" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "output_file = os.path.join(workspace, \"search_results.geojson\")\n", "\n", "dag.serialize(\n", " search_results, \n", " filename=output_file\n", ")" ] }, { "source": [ "## Deserialize" ], "cell_type": "markdown", "metadata": {} }, { "source": [ "There are two methods offered by [EODataAccessGateway](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway) to load a search result saved as a GeoJSON:\n", "\n", "* [deserialize()](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.deserialize): it simply recreates a [SearchResult](../../api_reference/searchresult.rst#eodag.api.search_result.SearchResult) and the [EOProduct](../../api_reference/eoproduct.rst#eodag.api.product._product.EOProduct) it contained\n", "* [deserialize_and_register()](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.deserialize_and_register): it also recreates a [SearchResult](../../api_reference/searchresult.rst#eodag.api.search_result.SearchResult) but additionally registers for each [EOProduct](../../api_reference/eoproduct.rst#eodag.api.product._product.EOProduct) the information it requires to download itself" ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[EOProduct(id=S2B_MSIL1C_20210328T103629_N0209_R008_T31TCJ_20210328T124650, provider=peps), EOProduct(id=S2B_MSIL1C_20210328T103629_N0209_R008_T31TCH_20210328T124650, provider=peps)]" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "deserialized_search_results = dag.deserialize(output_file)\n", "deserialized_search_results" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "output_type": "error", "ename": "AttributeError", "evalue": "'NoneType' object has no attribute 'config'", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdeserialized_search_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_quicklook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/TRAVAIL/06_EODAG/01_eodag/eodag/eodag/api/product/_product.py\u001b[0m in \u001b[0;36mget_quicklook\u001b[0;34m(self, filename, base_dir, progress_callback)\u001b[0m\n\u001b[1;32m 352\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 353\u001b[0m quicklooks_base_dir = os.path.join(\n\u001b[0;32m--> 354\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdownloader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs_prefix\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"quicklooks\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 355\u001b[0m )\n\u001b[1;32m 356\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misdir\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquicklooks_base_dir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'config'" ] } ], "source": [ "deserialized_search_results[0].get_quicklook()" ] }, { "source": [ "Trying to download a quicklook from a [SearchResult](../../api_reference/searchresult.rst#eodag.api.search_result.SearchResult) that was loaded with [serialize()](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.deserialize) since it doesn't try to configure each product so that it can be downloaded." ], "cell_type": "markdown", "metadata": {} }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[EOProduct(id=S2B_MSIL1C_20210328T103629_N0209_R008_T31TCJ_20210328T124650, provider=peps), EOProduct(id=S2B_MSIL1C_20210328T103629_N0209_R008_T31TCH_20210328T124650, provider=peps)]" ] }, "metadata": {}, "execution_count": 9 } ], "source": [ "deserialized_and_registered = dag.deserialize_and_register(output_file)\n", "deserialized_and_registered" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "output_type": "display_data", "data": { "text/plain": "HBox(children=(HTML(value=''), FloatProgress(value=0.0, layout=Layout(flex='2'), max=15629.0), HTML(value=''))…", "application/vnd.jupyter.widget-view+json": { "version_major": 2, "version_minor": 0, "model_id": "ec9f3265372f45aa9ae184916174437b" } }, "metadata": {} }, { "output_type": "stream", "name": "stderr", "text": [ "2021-04-12 23:55:07,085-15s eodag.api.product [INFO ] Download recorded in /home/maxime/TRAVAIL/06_EODAG/01_eodag/eodag/docs/notebooks/api_user_guide/eodag_workspace_serialize_deserialize/S2B_MSIL1C_20210328T103629_N0209_R008_T31TCJ_20210328T124650\n" ] } ], "source": [ "quicklook_path = deserialized_and_registered[0].get_quicklook(\n", " base_dir=workspace,\n", ")" ] }, { "source": [ "Downloading the quicklook with [deserialize_and_register()](../../api_reference/core.rst#eodag.api.core.EODataAccessGateway.deserialize_and_register) works as expected." ], "cell_type": "markdown", "metadata": {} } ] }