From 53962e9364da7804c4b15e77ef1c940b783bebbb Mon Sep 17 00:00:00 2001 From: Chris Holmes Date: Thu, 25 Jul 2024 07:39:19 -0700 Subject: [PATCH] Converters for AI4smallholders (#83) * Fieldscapes converter for AI4SmallFarms * updating date and removing calculated area * update to call (some) source data * renamed files * Finalize ai4sf converters * Merge Cambodia and Vietnam converters, add test --------- Co-authored-by: snehalchaudhari98 <1998snehalchaudhari@gmail.com> Co-authored-by: Matthias Mohr --- CHANGELOG.md | 1 + fiboa_cli/datasets/ai4sf.py | 153 ++++++++++++++++++ .../convert/ai4sf/1_vietnam_areas.gpkg | Bin 0 -> 131072 bytes .../convert/ai4sf/4_cambodia_areas.gpkg | Bin 0 -> 131072 bytes tests/test_convert.py | 11 +- 5 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 fiboa_cli/datasets/ai4sf.py create mode 100644 tests/data-files/convert/ai4sf/1_vietnam_areas.gpkg create mode 100644 tests/data-files/convert/ai4sf/4_cambodia_areas.gpkg diff --git a/CHANGELOG.md b/CHANGELOG.md index 011d2a5..67c9428 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - Converter for Planet's Automated Field Boundary (`planet_afb`) - Converter for Portugal (`pt`) - Converter for DigiFarm (`digifarm`) +- Converter for AI4SmallFarms in Cambodia and Vietnam (`ai4sf`) - Further tests ### Changed diff --git a/fiboa_cli/datasets/ai4sf.py b/fiboa_cli/datasets/ai4sf.py new file mode 100644 index 0000000..b008ddc --- /dev/null +++ b/fiboa_cli/datasets/ai4sf.py @@ -0,0 +1,153 @@ +from ..convert_utils import convert as convert_ + +SOURCES = { + # Cambodia + "https://phys-techsciences.datastations.nl/api/access/datafile/100634?gbrecs=true": "2_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100282?gbrecs=true": "3_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100392?gbrecs=true": "4_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100252?gbrecs=true": "5_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100072?gbrecs=true": "6_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100169?gbrecs=true": "7_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100348?gbrecs=true": "8_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100487?gbrecs=true": "9_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100084?gbrecs=true": "10_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100155?gbrecs=true": "11_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100475?gbrecs=true": "12_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100372?gbrecs=true": "13_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100196?gbrecs=true": "14_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100006?gbrecs=true": "15_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100248?gbrecs=true": "16_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100397?gbrecs=true": "17_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100217?gbrecs=true": "18_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100652?gbrecs=true": "19_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100326?gbrecs=true": "20_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100625?gbrecs=true": "21_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100413?gbrecs=true": "33_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100593?gbrecs=true": "34_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100057?gbrecs=true": "35_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100536?gbrecs=true": "36_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100343?gbrecs=true": "37_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100711?gbrecs=true": "38_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100313?gbrecs=true": "39_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100679?gbrecs=true": "57_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100191?gbrecs=true": "58_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100023?gbrecs=true": "59_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100025?gbrecs=true": "60_cambodia_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100543?gbrecs=true": "61_cambodia_areas.gpkg", + # Vietnam + "https://phys-techsciences.datastations.nl/api/access/datafile/100297?gbrecs=true": "0_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100636?gbrecs=true": "1_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100574?gbrecs=true": "22_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100095?gbrecs=true": "23_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100398?gbrecs=true": "24_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100187?gbrecs=true": "25_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100065?gbrecs=true": "26_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100425?gbrecs=true": "27_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100589?gbrecs=true": "28_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100021?gbrecs=true": "29_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100043?gbrecs=true": "30_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100562?gbrecs=true": "31_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100437?gbrecs=true": "32_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100549?gbrecs=true": "40_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100039?gbrecs=true": "41_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100427?gbrecs=true": "42_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100466?gbrecs=true": "43_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100014?gbrecs=true": "44_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100464?gbrecs=true": "45_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100416?gbrecs=true": "46_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100115?gbrecs=true": "47_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100510?gbrecs=true": "48_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100459?gbrecs=true": "49_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100340?gbrecs=true": "50_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100119?gbrecs=true": "51_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100086?gbrecs=true": "52_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100467?gbrecs=true": "53_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100176?gbrecs=true": "54_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100145?gbrecs=true": "55_vietnam_areas.gpkg", + "https://phys-techsciences.datastations.nl/api/access/datafile/100492?gbrecs=true": "56_vietnam_areas.gpkg", +} + +ID = "ai4sf" +SHORT_NAME = "Cambodia/Vietnam (AI4SmallFarms)" +TITLE = "Field boundaries for Cambodia and Vietnam (AI4SmallFarms)" +# from https://research.tudelft.nl/en/publications/ai4smallfarms-a-dataset-for-crop-field-delineation-in-southeast-a +DESCRIPTION = """ +Agricultural field polygons within smallholder farming systems are essential to facilitate the collection of geo-spatial data useful for farmers, managers, and policymakers. +However, the limited availability of training labels poses a challenge in developing supervised methods to accurately delineate field boundaries using Earth Observation (EO) data. +This data set allows researchers to test and benchmark machine learning methods to delineate agricultural field boundaries in polygon format. +The large-scale data set consists of 439,001 field polygons divided into 62 tiles of approximately 5×5 km distributed across Vietnam and Cambodia, covering a range of fields and diverse landscape types. +The field polygons have been meticulously digitized from satellite images, following a rigorous multi-step quality control process and topological consistency checks. +Multi-temporal composites of Sentinel-2 (S2) images are provided to ensure cloud-free data. +""" + +PROVIDERS = [ + { + "name": "DATA Archiving and Networked Services (DANS)", + "url": "https://research.tudelft.nl/en/publications/ai4smallfarms-a-dataset-for-crop-field-delineation-in-southeast-a", + "roles": ["producer", "licensor"] + } +] +ATTRIBUTION = "Persello, C., Grift, J., Fan, X., Paris, C., Hansch, R., Koeva, M., & Nelson, A. (2023). AI4SmallFarms: A Dataset for Crop Field Delineation in Southeast Asian Smallholder Farms. IEEE Geoscience and Remote Sensing Letters, 20, 1-5. Article 2505705. https://doi.org/10.1109/LGRS.2023.3323095" +LICENSE = "CC-BY-4.0" + +COLUMNS = { + 'fiboa_id': 'id', + 'id' : 'group', + '_predicate' : '_predicate', + 'country': 'country', + 'geometry' : 'geometry', +} + +# Add columns with constant values. +# The key is the column name, the value is a constant value that's used for all rows. +ADD_COLUMNS = { + "determination_datetime": "2021-08-01T00:00:00Z", + "determination_method": "auto-imagery" +} + +def migrate(gdf): + # Create unique IDs from the dataset in the form "xx_xxxxx" + gdf['fiboa_id'] = gdf['id'].astype(str).str.zfill(2) + "_" + gdf.index.astype(str).str.zfill(5) + return gdf + +MIGRATION = migrate + +MISSING_SCHEMAS = { + "properties": { + "group": { + "type": "uint8" + }, + "group_id": { + "type": "uint16" + }, + "_predicate": { + "type": "string", + "enum": ["INTERSECTS"] + }, + "country": { + "type": "string", + "enum": ["cambodia", "vietnam"] + } + } +} + +# Conversion function, usually no changes required +def convert(output_file, input_files = None, cache = None, source_coop_url = None, collection = False, compression = None): + convert_( + output_file, + cache, + SOURCES, + COLUMNS, + ID, + TITLE, + DESCRIPTION, + input_files=input_files, + source_coop_url=source_coop_url, + missing_schemas=MISSING_SCHEMAS, + column_additions=ADD_COLUMNS, + migration=MIGRATION, + attribution=ATTRIBUTION, + store_collection=collection, + license=LICENSE, + compression=compression, + ) diff --git a/tests/data-files/convert/ai4sf/1_vietnam_areas.gpkg b/tests/data-files/convert/ai4sf/1_vietnam_areas.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..75f0daa659e3bf6547130d9c4084d31aea1df2ba GIT binary patch literal 131072 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 G{{H}VAXxPP literal 0 HcmV?d00001 diff --git a/tests/data-files/convert/ai4sf/4_cambodia_areas.gpkg b/tests/data-files/convert/ai4sf/4_cambodia_areas.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..7f30f1c12433adabab025efbc4031579e49d26b2 GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/tests/test_convert.py b/tests/test_convert.py index 7a8f548..e338a12 100644 --- a/tests/test_convert.py +++ b/tests/test_convert.py @@ -29,12 +29,17 @@ def test_converter(out_file, converter): @mark.parametrize('args', [ - ['be_wa', 'tests/data-files/convert/be_wa/SIGEC_PARC_AGRI_ANON__2022_GEOPACKAGE_31370.zip|SIGEC_PARC_AGRI_ANON__2022.gpkg'] + ['be_wa', ['tests/data-files/convert/be_wa/SIGEC_PARC_AGRI_ANON__2022_GEOPACKAGE_31370.zip|SIGEC_PARC_AGRI_ANON__2022.gpkg']], + ['ai4sf', ['tests/data-files/convert/ai4sf/1_vietnam_areas.gpkg', 'tests/data-files/convert/ai4sf/4_cambodia_areas.gpkg']] ]) def test_converter_with_input(out_file, args): - converter, input_file = args + converter, input_files = args runner = CliRunner() - result = runner.invoke(convert, [converter, '-o', out_file.name, '-i', input_file]) + args = [converter, '-o', out_file.name] + for input_file in input_files: + args.append('-i') + args.append(input_file) + result = runner.invoke(convert, args) assert result.exit_code == 0, result.output error = re.search('Skipped - |No schema defined', result.output) if error: