From fb201f800a66091d5a1d87b32ceb2bac6f634408 Mon Sep 17 00:00:00 2001 From: Ivor Bosloper Date: Wed, 15 Oct 2025 23:56:01 +0200 Subject: [PATCH 1/4] Add fiboa improve command --- CHANGELOG.md | 3 + fiboa_cli/improve.py | 158 +++++++++ fiboa_cli/registry.py | 4 + tests/data-files/convert/dk/dk_2019.csv | 299 ++++++++++++++++++ .../improve/be_vlg_2024_fiboa_0_2.parquet | Bin 0 -> 36817 bytes .../improve/dk_2024_fiboa_0_2.parquet | Bin 0 -> 74976 bytes tests/test_improve.py | 50 +++ 7 files changed, 514 insertions(+) create mode 100644 fiboa_cli/improve.py create mode 100644 tests/data-files/convert/dk/dk_2019.csv create mode 100644 tests/data-files/improve/be_vlg_2024_fiboa_0_2.parquet create mode 100644 tests/data-files/improve/dk_2024_fiboa_0_2.parquet create mode 100644 tests/test_improve.py diff --git a/CHANGELOG.md b/CHANGELOG.md index f43bc44e..ebfb8605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - EuroCropsConverterMixin is a BaseClass for EuroCrops-provided datasets - EuroLandBaseConverter is a BaseClass for Euroland-provided datasets - Avoid base property schema override +- Fibo Improve command + - Upgrades from fiboa-0.2 if required + - Adds HCAT if specified ## [v0.20.3] - 2025-09-13 diff --git a/fiboa_cli/improve.py b/fiboa_cli/improve.py new file mode 100644 index 00000000..2fbd1af6 --- /dev/null +++ b/fiboa_cli/improve.py @@ -0,0 +1,158 @@ +import json + +import click +import spdx_license_list +from geopandas import GeoDataFrame +from vecorel_cli.basecommand import runnable +from vecorel_cli.encoding.auto import create_encoding +from vecorel_cli.improve import ImproveData +from vecorel_cli.vecorel.collection import Collection +from vecorel_cli.vecorel.extensions import ADMIN_DIVISION +from vecorel_cli.vecorel.version import sdl_uri + +from fiboa_cli.conversion.fiboa_converter import FiboaBaseConverter +from fiboa_cli.datasets.commons.ec import AddHCATMixin +from fiboa_cli.datasets.commons.hcat import CROP_EXTENSION, HCAT_EXTENSION +from fiboa_cli.registry import FIBOA_SPECIFICATION + + +class Improve(ImproveData): + @staticmethod + def get_cli_args(): + return { + **ImproveData.get_cli_args(), + "add-hcat": click.option( + "--add-hcat", + "-hcat", + type=str, + help="Adds hcat-extension and columns to the collection, based on the crop:code column and a mapping file. Requires a mapping file as argument, e.g. 'at_2021.csv', find them at https://github.com/maja601/EuroCrops/tree/main/csvs/country_mappings", + ), + } + + @runnable + def improve_file( + self, source, target=None, compression=None, geoparquet_version=None, indent=None, **kwargs + ): + # Override method to be able to convert input from fiboa-0.2.0 to fiboa-0.3.0 + if not target: + target = source + + input_encoding = create_encoding(source) + geodata = input_encoding.read() + collection = input_encoding.get_collection() + + if not collection: + # Try to migrate from fiboa-0.2.0 to fiboa-0.3.0 + metadata = input_encoding.get_metadata() + if b"fiboa" in metadata: + fiboa_2 = json.loads(metadata[b"fiboa"].decode("utf-8")) + geodata, collection = self.migrate_fiboa_2(geodata, fiboa_2) + + geodata, collection = self.improve(geodata, collection=collection, **kwargs) + + output_encoding = create_encoding(target) + output_encoding.set_collection(collection) + output_encoding.write( + geodata, + compression=compression, + geoparquet_version=geoparquet_version, + indent=indent, + ) + return target + + def improve( + self, gdf: GeoDataFrame, collection: Collection, add_hcat: str = None, **kwargs + ) -> tuple[GeoDataFrame, Collection]: + gdf, collection = super().improve(gdf, collection, **kwargs) + # Add HCAT + if add_hcat: + gdf, collection = self.add_hcat(gdf, collection, add_hcat) + self.info("Added HCAT columns and extension") + return gdf, collection + + def add_hcat(self, gdf, collection, mapping_file): + if "crop:code" not in gdf.columns: + raise Exception("Missing crop:code column in dataset") + + is_url = "/" in mapping_file + _mapping_file = mapping_file + + # Simplest way to reuse functionality from AddHCATMixin + class HCAT(AddHCATMixin, FiboaBaseConverter): + columns = {"crop:code": "crop:code"} + ec_mapping_csv = None if is_url else _mapping_file + mapping_file = _mapping_file if is_url else None + + for schemas in collection["schemas"].values(): + if HCAT_EXTENSION not in schemas: + schemas.append(HCAT_EXTENSION) + + return HCAT().add_hcat(gdf), collection + + def migrate_fiboa_2(self, geodata, original: Collection) -> tuple[GeoDataFrame, Collection]: + if original["fiboa_version"] != "0.2.0": + self.warning( + f"Not migrating from fiboa version {original['fiboa_version']}, can only migrate fiboa from 0.2.0" + ) + return geodata, original + + self.info(f"Migrating data from fiboa version {original['fiboa_version']}") + schemas = {"https://vecorel.org/specification/v0.1.0/schema.yaml", FIBOA_SPECIFICATION} + for e in original.get("fiboa_extensions", []): + if e in EXTENSION_MAPPING: + schemas.add(EXTENSION_MAPPING[e]) + + base = {k: original[k] for k in ("title", "description", "attribution") if k in original} + collection = Collection( + {"schemas": {original["id"]: list(schemas)}, "collection": original["id"]} | base + ) + + # Migrate custom schemas + if "fiboa_custom_schemas" in original: + collection["schemas:custom"] = { + "$schema": "https://vecorel.org/sdl/v0.2.0/schema.json", + "required": [], + "collection": {}, + } | original["fiboa_custom_schemas"] + + # Take first provider json, make string out of it + if "providers" in original: + provider = next(iter(original["providers"])) + collection["provider"] = f"{provider['name']} <{provider['url']}>" + + # Transform license links to string + if original.get("license"): + if original["license"] in spdx_license_list.LICENSES or "<" in original["license"]: + collection["license"] = original["license"] + if "license" not in collection: + _licenses = [link for link in original.get("links", []) if link.get("rel") == "license"] + if _licenses: + collection["license"] = f"{_licenses[0]['title']} <{_licenses[0]['href']}>" + + # Rename columns + rename = { + k: v + for k, v in ( + ("determination_datetime", "determination:datetime"), + ("determination_method", "determination:method"), + ("metrics_perimeter", "metrics:perimeter"), + ) + if k in original + } + + # Transform area from ha to m2 + if "area" in geodata.columns: + geodata["area"] *= 10000 + rename["area"] = "metrics:area" + + geodata.rename(rename, axis=1, inplace=True) + return geodata, collection + + +EXTENSION_MAPPING = { + "https://fiboa.github.io/hcat-extension/v0.2.0/schema.yaml": HCAT_EXTENSION, + "https://fiboa.github.io/crop-extension/v0.1.0/schema.yaml": CROP_EXTENSION, + "https://fiboa.github.io/inspire-extension/v0.1.0/schema.yaml": "https://fiboa.org/inspire-extension/v0.3.0/schema.yaml", + "https://fiboa.github.io/schema/v0.1.0/schema.json": sdl_uri, + "https://fiboa.github.io/administrative-division-extension/v0.1.0/schema.yaml": ADMIN_DIVISION, +} diff --git a/fiboa_cli/registry.py b/fiboa_cli/registry.py index 7fff99a4..13609ebf 100644 --- a/fiboa_cli/registry.py +++ b/fiboa_cli/registry.py @@ -4,6 +4,8 @@ from fiboa_cli.fiboa.version import spec_pattern +FIBOA_SPECIFICATION = "https://fiboa.org/specification/v0.3.0/schema.yaml" + class FiboaRegistry(VecorelRegistry): name: str = "fiboa-cli" @@ -29,11 +31,13 @@ def register_commands(self): from .create_stac import CreateFiboaStacCollection from .describe import DescribeFiboaFile + from .improve import Improve from .rename_extension import RenameFiboaExtension self.set_command(CreateFiboaStacCollection) self.set_command(DescribeFiboaFile) self.set_command(RenameFiboaExtension) + self.set_command(Improve) Registry.instance = FiboaRegistry() diff --git a/tests/data-files/convert/dk/dk_2019.csv b/tests/data-files/convert/dk/dk_2019.csv new file mode 100644 index 00000000..dd51a435 --- /dev/null +++ b/tests/data-files/convert/dk/dk_2019.csv @@ -0,0 +1,299 @@ +original_code,original_name,translated_name,HCAT3_name,HCAT3_code,HCAT2_name,HCAT2_code +1,Vårbyg,Spring barley,spring_barley,3301010402,spring_barley,3301010402 +2,Vårhvede,Spring wheat,spring_common_soft_wheat,3301010102,spring_common_soft_wheat,3301010102 +3,Vårhavre,Spring oats,spring_oats,3301010502,spring_oats,3301010502 +4,Blanding af vårsåede arter,Mixture of spring-sown species,arable_crops,3301000000,other_arable_land_crops,3301990000 +5,Majs til modenhed,Maize for maturity,grain_maize_corn_popcorn,3301010600,grain_maize_corn_popcorn,3301010600 +6,"Vårhvede, brødhvede",Spring wheat bread wheat,spring_common_soft_wheat,3301010102,spring_common_soft_wheat,3301010102 +7,Korn + bælgsæd under 50% bælgsæd,Cereals + legumes below 50% legumes,cereal,3301010000,unspecified_cereals,3301011500 +8,Vårspelt,Spring spelt,spring_spelt,3301011002,spring_spelt,3301011002 +9,Vinterspelt,Winter spelt,winter_spelt,3301011001,winter_spelt,3301011001 +10,Vinterbyg,Winter barley,winter_barley,3301010401,winter_barley,3301010401 +11,Vinterhvede,Winter wheat,winter_common_soft_wheat,3301010101,winter_common_soft_wheat,3301010101 +13,"Vinterhvede, brødhvede",Winter wheat bread wheat,winter_common_soft_wheat,3301010101,winter_common_soft_wheat,3301010101 +14,Vinterrug,Winter rye,winter_rye,3301010301,winter_rye,3301010301 +15,Vinterhybridrug,Winter hybrid rye,winter_rye,3301010301,winter_rye,3301010301 +16,Vintertriticale,Winter triticale,winter_triticale,3301010801,winter_triticale,3301010801 +17,Blanding af efterårssåede arter,Mixture of autumn sown species,arable_crops,3301000000,other_arable_land_crops,3301990000 +21,Vårraps,Spring rape,spring_rapeseed_rape,3301060402,spring_rapeseed_rape,3301060402 +22,Vinterraps,Winter rape,winter_rapeseed_rape,3301060401,winter_rapeseed_rape,3301060401 +24,Solsikke,Sunflower,sunflower,3301060500,sunflower,3301060500 +25,Sojabønner,Soybeans,soy_soybeans,3301160000,soy_soybeans,3301160000 +30,Ærter,Peas,peas,3301020600,peas,3301020600 +31,Hestebønner,Broad bean,beans,3301020100,beans,3301020100 +32,Sødlupin,Sweet lupine,sweet_lupins,3301020700,sweet_lupins,3301020700 +35,"Bælgsæd, flerårig blanding",Legumes perennial mixture,legumes_dried_pulses_protein_crops,3301020000,legumes_dried_pulses_protein_crops,3301020000 +36,"Bælgsæd, andre typer til modenhed blanding",Legumes other types for maturity mixing,legumes_dried_pulses_protein_crops,3301020000,legumes_dried_pulses_protein_crops,3301020000 +40,Oliehør,Oil flax,flax_linseed_oil,3301060702,flax_linseed_oil,3301060702 +42,Hamp,Hemp,hemp_cannabis,3301061000,hemp_cannabis,3301061000 +51,"Blanding bredbladet afgrøde, frø/kerne",Mix broadleaf crop seed / core,arable_crops,3301000000,other_arable_land_crops,3301990000 +52,Quinoa,Quinoa,quinoa,3301150300,quinoa,3301150300 +53,Boghvede,Buckwheat,buckwheat,3301150200,buckwheat,3301150200 +54,Bælgsæd blanding,Legume mixture,legumes_dried_pulses_protein_crops,3301020000,legumes_dried_pulses_protein_crops,3301020000 +55,Vårrug,Spring rye,spring_rye,3301010302,spring_rye,3301010302 +56,Vårtriticale,Spring triticale,spring_triticale,3301010802,spring_triticale,3301010802 +57,Vinterhavre,Winter oats,winter_oats,3301010501,winter_oats,3301010501 +58,Sorghum,Sorghum,millet_sorghum,3301010900,millet_sorghum,3301010900 +101,"Rajgræsfrø, alm.",Ryegrass seeds regular,lolium_ryegrass,3301090205,lolium_ryegrass,3301090205 +102,"Rajgræsfrø, alm. 1. år, efterårsudlagt",Ryegrass seeds regular 1st year autumn undersown,lolium_ryegrass,3301090205,lolium_ryegrass,3301090205 +103,"Rajgræsfrø, ital.",Ryegrass seeds italian,lolium_ryegrass,3301090205,lolium_ryegrass,3301090205 +104,"Rajgræsfrø, ital. 1. år efterårsudlagt",Ryegrass seeds Italian 1 year autumn undersown,lolium_ryegrass,3301090205,lolium_ryegrass,3301090205 +105,Timothefrø,Timothy seeds,timothy,3301090209,timothy,3301090209 +106,Hundegræsfrø,Cocksfoot seeds,cocksfoot_catgrass,3301090203,temporary_grass,3301090100 +107,Engsvingelfrø,Meadow fescue seeds,festuca_fescue,3301090202,festuca_fescue,3301090202 +108,Rødsvingelfrø,Red fescue seeds,festuca_fescue,3301090202,festuca_fescue,3301090202 +109,Rajsvingelfrø,Rice fescue seeds,festuca_fescue,3301090202,festuca_fescue,3301090202 +110,"Svingelfrø, stivbladet",Hard fescue seeds,festuca_fescue,3301090202,festuca_fescue,3301090202 +111,"Svingelfrø, strand-",Tall fescue seeds,festuca_fescue,3301090202,festuca_fescue,3301090202 +112,Engrapgræsfrø (marktype),Kentucky bluegrass seed (ley type),poaceae_grasses,3301090200,pasture_meadow_grassland_grass,3302000000 +113,Engrapsgræsfrø (plænetype),Kentucky bluegrass seed (turfgrass type),poaceae_grasses,3301090200,pasture_meadow_grassland_grass,3302000000 +114,"Rapgræsfrø, alm.",Rough bluegrass,poaceae_grasses,3301090200,pasture_meadow_grassland_grass,3302000000 +115,"Hvenefrø, alm. og krybende",Browntop and creeping bent,poaceae_grasses,3301090200,vetches,3301090305 +116,"Rajgræs, hybrid",Ryegrass hybrid,lolium_ryegrass,3301090205,lolium_ryegrass,3301090205 +117,"Rajgræs, efterårsudl. hybrid",Ryegrass autumn undersown hybrid,lolium_ryegrass,3301090205,lolium_ryegrass,3301090205 +118,"Rajsvingelfrø, efterårsudlagt",X Festulolium seeds autumn undersown,poaceae_grasses,3301090200,rye,3301010300 +120,Kløverfrø,Clover seeds,clover,3301090303,clover,3301090303 +121,"Bælgplanter, frø",Ley legumes,legumes_dried_pulses_protein_crops,3301020000,legumes_dried_pulses_protein_crops,3301020000 +122,Kommenfrø,Caraway seeds,caraway,3301061211,caraway,3301061211 +123,Valmuefrø,Poppy seeds,poppy,3301060600,poppy,3301060600 +124,Spinatfrø,Spinach seeds,spinach,3301310800,spinach,3301310800 +125,Bederoefrø,Beetroot seeds,beetroot_beets,3301290200,beetroot_beets,3301290200 +126,Blanding af markfrø til udsæd,Mix of seeds for seed corn,grain_maize_corn_popcorn,3301010600,grain_maize_corn_popcorn,3301010600 +149,"Kartofler, lægge- (certificerede)",Seed Potatoes (certified),potatoes,3301030000,potatoes,3301030000 +150,"Kartofler, lægge- (egen opformering)",Seed potatoes (own propagation),potatoes,3301030000,potatoes,3301030000 +151,"Kartofler, stivelses-",Potatoes starchy,potatoes,3301030000,potatoes,3301030000 +152,"Kartofler, spise-",Potatoes consumption,potatoes,3301030000,potatoes,3301030000 +153,"Kartofler, andre",Potatoes others,potatoes,3301030000,potatoes,3301030000 +160,Sukkerroer til fabrik,Sugar beet for factory,sugar_beet,3301290700,sugar_beet,3301290700 +161,Cikorierødder,Chicory roots,chicory_chicories,3301310200,chicory_chicories,3301310200 +162,"Blanding, andre industriafgr.",Mixture other industrial crops,industrial_nonfood_crops,3301060000,other_industrial_crops,3301069900 +170,Græs til fabrik (omdrift),Grass for factory (rotation),temporary_grass,3301090100,temporary_grass,3301090100 +171,"Lucerne, slæt",Lucerne mowing,alfalfa_lucerne,3301090301,alfalfa_lucerne,3301090301 +172,"Lucernegræs, over 25 % græs til slæt inkl. egetfoder",Lucerne grass over 25% grass for mowing incl. own feed,alfalfa_lucerne,3301090301,alfalfa_lucerne,3301090301 +173,Kløver til slæt,Clover for mowing,clover,3301090303,clover,3301090303 +174,Kløvergræs til fabrik,Clover grass for factory,clover,3301090303,clover,3301090303 +180,Gul sennep,White mustard,mustard,3301210100,mustard,3301210100 +182,Blanding af oliearter,Mixture of oil species,oilseed_crops,3301060800,oilseed_crops,3301060800 +210,"Vårbyg, helsæd",Spring barley wholecrop,spring_barley,3301010402,spring_barley,3301010402 +211,"Vårhvede, helsæd",Spring wheat wholecrop,spring_common_soft_wheat,3301010102,spring_common_soft_wheat,3301010102 +212,"Vårhavre, helsæd",Spring oats wholecrop,spring_oats,3301010502,spring_oats,3301010502 +213,"Blandkorn, vårsået, helsæd",Mixed cereal spring sown wholecrop,spring_meslin,3301011102,spring_unspecified_cereals,3301011502 +214,"Korn og bælgsæd, helsæd, under 50% bælgsæd",Cereals and legumes whole grains less than 50% legumes,cereal,3301010000,unspecified_cereals,3301011500 +215,Ærtehelsæd,Peas wholecrop,peas,3301020600,peas,3301020600 +216,Silomajs,Silo maize,green_silo_maize,3301090400,green_silo_maize,3301090400 +220,"Vinterbyg, helsæd",Winter barley wholecrop,winter_barley,3301010401,winter_barley,3301010401 +221,"Vinterhvede, helsæd",Winter wheat wholecrop,winter_common_soft_wheat,3301010101,winter_common_soft_wheat,3301010101 +222,"Vinterrug, helsæd",Winter rye wholecrop,winter_rye,3301010301,winter_rye,3301010301 +223,"Vintertriticale, helsæd",Winter triticale wholecrop,winter_triticale,3301010801,winter_triticale,3301010801 +230,"Blanding af vårkorn, grønkorn",Mixture of spring cereals green grains,spring_meslin,3301011102,spring_unspecified_cereals,3301011502 +234,"Korn og bælgsæd, grønkorn, under 50% bælgsæd",Cereals and pulses green grains less than 50% pulses,cereal,3301010000,unspecified_cereals,3301011500 +235,"Blanding af vinterkorn, grønkorn",Mixture of winter grains green grains,winter_meslin,3301011101,winter_unspecified_cereals,3301011501 +247,"Miljøgræs MVJ-tilsagn (0 N), omdrift",Environmental grass AECM scheme 2 rotation,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +248,Permanent græs ved vandboring,Permanent grass by water borehole,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +249,Udnyttet græs ved vandboring,Utilized grass next to water borehole,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +250,"Permanent græs, meget lavt udbytte",Permanent grass very low yield,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +251,"Permanent græs, lavt udbytte",Permanent grass low yield,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +252,"Permanent græs, normalt udbytte",Permanent grass standard yield,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +253,"Miljøgræs MVJ-tilsagn (80 N), omdrift",Environmental grass MVJ commitment (80 N) rotation,temporary_grass,3301090100,pasture_meadow_grassland_grass,3302000000 +254,"Miljøgræs MVJ-tilsagn (0 N), permanent",Environmental grass MVJ commitment (0 N) permanent,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +255,"Permanent græs, under 50% kløver/lucerne",Permanent grass less than 50% clover / alfalfa,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +256,"Permanent kløvergræs, over 50 % kløver/lucerne",Permanent clover grass over 50% clover / alfalfa0,clover,3301090303,clover,3301090303 +257,"Permanent græs, uden kløver",Permanent grass without clover,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +259,"Permanent græs, fabrik, over 6 tons",Permanent grass factory over 6 tons,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +260,"Græs med kløver/lucerne, under 50 % bælgpl. (omdrift)",Grass with clover / alfalfa less than 50% legumes rotation,plants_harvested_green,3301090000,pasture_meadow_grassland_grass,3302000000 +261,"Kløvergræs, over 50% kløver (omdrift)",Clover grass over 50% clover (rotation),clover,3301090303,clover,3301090303 +262,"Lucernegræs, over 50% lucerne (omdrift)",Lucerne grass over 50% alfalfa (rotation),alfalfa_lucerne,3301090301,alfalfa_lucerne,3301090301 +263,Græs uden kløvergræs (omdrift),Grass without clover grass (rotation),temporary_grass,3301090100,pasture_meadow_grassland_grass,3302000000 +264,"Græs og kløvergræs uden norm, under 50 % kløver (omdrift)",Grass and clover grass without norm below 50% clover (rotation),plants_harvested_green,3301090000,pasture_meadow_grassland_grass,3302000000 +266,"Græs under 50% kløver/lucerne, ekstremt lavt udbytte (omdrift)",Grass below 50% clover / alfalfa extremely low yield (rotation),plants_harvested_green,3301090000,pasture_meadow_grassland_grass,3302000000 +267,"Græs under 50% kløver/lucerne, meget lavt udbytte (omdrift)",Grass below 50% clover / alfalfa very low yield (rotation),plants_harvested_green,3301090000,pasture_meadow_grassland_grass,3302000000 +268,"Græs under 50% kløver/lucerne, lavt udbytte (omdrift)",Grass below 50% clover / alfalfa low yield (rotation),plants_harvested_green,3301090000,pasture_meadow_grassland_grass,3302000000 +269,"Græs, rullegræs",Grass rolled sod,sod_turf,3301090207,sod_turf,3301090207 +270,"Græs til udegrise, omdrift",Grass for freerange pigs rotation,temporary_grass,3301090100,pasture_meadow_grassland_grass,3302000000 +271,Rekreative formål,Recreative purpose,not_known_and_other,3399000000,not_known_and_other,3399000000 +272,Permanent græs til fabrik,Permanent grass for factory,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +273,Lucerne til fabrik,Lucerne to factory,alfalfa_lucerne,3301090301,alfalfa_lucerne,3301090301 +274,"Permanent lucernegræs over 25% græs, til fabrik0",Permanent alfalfa grass over 25% grass for factory,alfalfa_lucerne,3301090301,alfalfa_lucerne,3301090301 +276,"Permanent græs og kløvergræs uden norm, under 50 % kløver",Permanent grass and clover grass without norm below 50% clover,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +278,Permanent lucerne og lucernegræs over 50% lucerne0,Permanent alfalfa and alfalfa grass over 50% alfalfa,alfalfa_lucerne,3301090301,alfalfa_lucerne,3301090301 +279,Permanent kløvergræs til fabrik,Permanent clover grass for factory,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +280,Fodersukkerroer,Sugar beet for fodder,mangelwurzel_fodder_beet,3301290400,sugar_beet,3301290700 +281,Kålroer,Swedes,swede_rutabaga,3301210500,swede_rutabaga,3301210500 +282,Fodermarvkål,Marrow stem kale,kale,3301210208,kale,3301210208 +283,Fodergulerødder,Fodder carrots,carrots_daucus,3301290300,carrots_daucus,3301290300 +284,"Græs med vikke og andre bælgplanter, under 50%bælgpl.",Grass with vetches and other legumes less than 50% legumes,plants_harvested_green,3301090000,pasture_meadow_grassland_grass,3302000000 +285,"Græs og kløvergræs uden norm, over 50 % kløver (omdrift)",Grass and clover grass without norm over 50% clover (rotation),clover,3301090303,pasture_meadow_grassland_grass,3302000000 +286,"Permanent græs og kløvergræs uden norm, over 50 % kløver",Permanent grass and clover grass without norm over 50% clover,clover,3301090303,pasture_meadow_grassland_grass,3302000000 +287,"Græs til udegrise, permanent",Grass for outdoor pigs permanent,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +305,"Permanent græs, uden udbetaling af økologi-tilskud",Permanent grass without payment of ecological subsidies,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +306,"Græs i omdrift, uden udbetaling af økologi-tilskud",Grass in rotation without payment of organic subsidies,temporary_grass,3301090100,pasture_meadow_grassland_grass,3302000000 +308,"MFO-brak, sommerslåning",EFA-Fallow with summer mowing,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +309,Udyrket areal ved vandboring,Uncultivated area next to water boreholes,not_known_and_other,3399000000,not_known_and_other,3399000000 +310,"Brak, sommerslåning",Fallow with summer mowing,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +311,Skovrejsning på tidl. landbrugsjord 1,Forest establisment on formerly farmland 1,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +312,20-årig udtagning,20-year set aside,unmaintained,3308000000,fallow_land_not_crop,3301110000 +313,20-årig udtagning af agerjord med frivillig skovrejsning,20-year set-aside of arable land with voluntary afforestation,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +314,20-årig udtagning med tilsagn om skovrejsning,20-year set aside with scheme of forest establiment from NST,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +317,Vådområder med udtagning,Wetlands with set aside,not_known_and_other,3399000000,not_known_and_other,3399000000 +318,"MVJ ej udtagning, ej landbrugsareal",AECM no set aside not farmland area,not_known_and_other,3399000000,not_known_and_other,3399000000 +319,"MFO-brak, Udtagning, ej landbrugsareal",EFA Wetlands or shallow soils with set aside,not_known_and_other,3399000000,fallow_land_not_crop,3301110000 +321,"Miljøtiltag, ej landbrugsarealer",Environmental measures not agricultural land,not_known_and_other,3399000000,not_known_and_other,3399000000 +322,"Minivådområder, projekttilsagn",Mini-wetlands with project scheme,not_known_and_other,3399000000,not_known_and_other,3399000000 +323,MFO-udyrket areal ved vandboring,EFA-Uncultivated area next to water boreholes,not_known_and_other,3399000000,not_known_and_other,3399000000 +324,Blomsterbrak,Fallow with flowers,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +325,MFO-Blomsterbrak,EFA-fallow with flowers,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +326,"Ej landbrug, MSO, omlagt fra permanent græs",Environmental sensitive permanent grassland converted into non-agricultural area,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +327,"MFO-bræmme, sommerslåning",EFA-field margins mowing/grazing,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +328,MFO-bræmme med blomsterblanding,EFA-field margins with flower mix,flowers_ornamental_plants,3301080000,flowers_ornamental_plants,3301080000 +329,"MFO-bræmme, miljøtilsagn",EFA-field margins with environmental scheme,not_known_and_other,3399000000,not_known_and_other,3399000000 +334,"MFO-bræmme, forårsslåning",EFA brim spring mowing,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +335,"MFO-bræmme, permanent græs, forårsslåning",EFA edge permanent grass spring mowing,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +336,"MFO-bræmme, permanent græs, sommerslåning",EFA edge permanent grass summer mowing,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +338,"Brak, forårsslåning",Fallow spring mowing,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +339,"MFO-brak, forårsslåning",EFA fallow spring mowing,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +342,Bestøverbrak,Pollen fallow,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +343,MFO-bestøverbrak,EFA-fallow for melliferous plants,fallow_land_not_crop,3301110000,fallow_land_not_crop,3301110000 +361,Ikke støtteberettiget landbrugsareal,Farmland not warranted for subsidies,other_arable_land_crops,3301990000,other_arable_land_crops,3301990000 +400,Asieagurker,Gherkin,cucumber_pickle,3301140100,cucumber_pickle,3301140100 +401,Asparges,Asparagus,asparagus,3301200000,aspargus,3301200000 +402,Bladselleri,Celery leaves,leaf_celery,3301250200,leaf_celery,3301250200 +403,Blomkål,Cauliflower,cauliflower,3301210204,cauliflower,3301210204 +404,Broccoli,Broccoli,broccoli,3301210202,broccoli,3301210202 +405,"Courgette, squash",Courgette squash,zucchini_courgette,3301140600,zucchini_courgette,3301140600 +406,Grønkål,Kale,kale,3301210208,kale,3301210208 +407,Gulerod,Carrot,carrots_daucus,3301290300,carrots_daucus,3301290300 +408,Hvidkål,White cabbage,white_cabbage,3301210212,white_cabbage,3301210212 +409,Kinakål,Chinese cabbage,chinese_cabbage,3301210205,chinese_cabbage,3301210205 +410,Knoldselleri,Celeriac,celeriac,3301250100,celeriac,3301250100 +411,Løg,Onion,onions,3301220400,onions,3301220400 +412,Pastinak,Parsnip,parsnips,3301290500,parsnips,3301290500 +413,Rodpersille,Parsley root,parsly,3301061227,parsly,3301061227 +415,Porre,Leek,leek,3301220300,leek,3301220300 +416,Rosenkål,Brussel sprouts,brussels_sprouts,3301210203,brussels_sprouts,3301210203 +417,Rødbede,Beetroot,beetroot_beets,3301290200,beetroot_beets,3301290200 +418,Rødkål,Red cabbage,red_cabbage,3301210210,red_cabbage,3301210210 +420,Salat (friland),Salad (outdoor),salads_lettuce_leaf_vegetables,3301310000,salads_lettuce_leaf_vegetables,3301310000 +421,"Savoykål, spidskål",Savoy cabbage oxheart cabbag,savoy_cabbage,3301210211,savoy_cabbage,3301210211 +422,Spinat,Spinach,spinach,3301310800,spinach,3301310800 +423,Sukkermajs,Sweet corn,grain_maize_corn_popcorn,3301010600,grain_maize_corn_popcorn,3301010600 +424,"Ærter, konsum",Peas consumption,peas,3301020600,peas,3301020600 +429,"Jordskokker, konsum",Jerusalem artichokes comsumption,topinambur_jerusalem_artichoke,3301180000,topinambur_jerusalem_artichoke,3301180000 +430,Bladpersille,Parsley,parsly,3301061227,parsly,3301061227 +431,Purløg,Chives,chives,3301220100,chives,3301220100 +432,Krydderurter (undtagen persille og purløg),Herbs (excluding parsley and chives),aromatic_medicinal_culinary_plants_spices_herbs,3301061200,aromatic_medicinal_culinary_plants_spices_herbs,3301061200 +434,"Grøntsager, andre (friland)",Vegetables other (outdoor),fresh_vegetables,3301070000,fresh_vegetables,3301070000 +448,"Medicinpl., en- og toårige",Medicinal plants annual and biennial,aromatic_medicinal_culinary_plants_spices_herbs,3301061200,aromatic_medicinal_culinary_plants_spices_herbs,3301061200 +449,"Medicinpl., stauder",Medicinal plants perennials,aromatic_medicinal_culinary_plants_spices_herbs,3301061200,aromatic_medicinal_culinary_plants_spices_herbs,3301061200 +450,"Grøntsager, blandinger",Vegetables mixtures,fresh_vegetables,3301070000,fresh_vegetables,3301070000 +486,Hønsegård uden plantedække,Henyard with bare soil,not_known_and_other,3399000000,not_known_and_other,3399000000 +487,Skovlandbrug,Agroforestry,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +488,"Hønsegård, permanent græs",Henyard permanent grass,pasture_meadow_grassland_grass,3302000000,pasture_meadow_grassland_grass,3302000000 +489,Havtorn,Sea buckthorn,hippophae_sea_buckthorns_seaberry,3303020800,hippophae_sea_buckthorns_seaberry,3303020800 +493,Surbær,Black chokeberry,aronia_chokeberries,3303020100,aronia_chokeberries,3303020100 +494,Japan kvæde,Japan quince,quinces,3303011500,quinces,3303011500 +497,"Planteskolekulturer, vedplanter, til videresalg",Nursery cultivation arboreal plants for sale,nurseries_nursery,3303070000,nurseries_nursery,3303070000 +499,Lukket system,Closed system,not_known_and_other,3399000000,not_known_and_other,3399000000 +501,Stauder,Perennial,permanent_crops_perennial,3303000000,permanent_crops_perennial,3303000000 +502,Blomsterløg,Flower bulbs,flowers_ornamental_plants,3301080000,flowers_ornamental_plants,3301080000 +503,En- og to-årige planter,Annual and biennial plants,arable_crops,3301000000,other_arable_land_crops,3301990000 +504,"Solbær, stiklingeopformering",Blackcurrant multiplication by cutting,blackcurrant_cassis,3303020300,blackcurrant_cassis,3303020300 +506,"Stikkelsbær, stiklingeopformering",Gooseberries multiplication by cutting,gooseberry_gooseberries_cranberries,3303020700,gooseberry_gooseberries_cranberries,3303020700 +507,"Hindbær, stiklingeopformering",Raspberries multiplication by cutting,raspberry_raspberries,3303021000,raspberry_raspberries,3303021000 +509,Trækvæde,Quince,quinces,3303011500,quinces,3303011500 +510,Melon,Melon,melon,3301140300,melon,3301140300 +512,Rabarber,Rhubarb,rhubarb,3301230000,rhubarb,3301230000 +513,Jordbær,Strawberry,strawberries,3301130000,strawberries,3301130000 +514,Solbær,Blackcurrant,blackcurrant_cassis,3303020300,blackcurrant_cassis,3303020300 +515,Ribs,Red currant,redcurrant,3303021100,redcurrant,3303021100 +516,Stikkelsbær,Gooseberry,gooseberry_gooseberries_cranberries,3303020700,gooseberry_gooseberries_cranberries,3303020700 +517,Brombær,Blackberry,blackberry,3303020200,blackberry,3303020200 +518,Hindbær,Raspberry,raspberry_raspberries,3303021000,raspberry_raspberries,3303021000 +519,Blåbær,Blueberry,blueberry,3303020400,blueberry,3303020400 +520,Surkirsebær uden undervækst af græs,Sour cherry without undergrowth of grass,cherry_cherries,3303010400,cherry_cherries,3303010400 +521,Surkirsebær med undervækst af græs,Sour cherry with undergrowth of grass,cherry_cherries,3303010400,cherry_cherries,3303010400 +522,Blomme uden undervækst af græs,Plum without undergrowth of grass,plums,3303011300,plums,3303011300 +523,Blomme med undervækst af græs,Plum with undergrowth of grass,plums,3303011300,plums,3303011300 +524,Sødkirsebær uden undervækst af græs,Sweet cherry without undergrowth of grass,cherry_cherries,3303010400,cherry_cherries,3303010400 +525,Sødkirsebær med undervækst af græs,Sweet cherry with undergrowth of grass,cherry_cherries,3303010400,cherry_cherries,3303010400 +526,Hyld,Elder,elder_elderberry,3303080400,elder_elderberry,3303080400 +527,Hassel,Hazel,hazelnuts_hazel,3303030200,hazelnuts_hazel,3303030200 +528,Æbler,Apples,apples,3303010200,apples,3303010200 +529,Pærer,Pear,pears,3303011200,pears,3303011200 +530,Vindrue,Grape,vineyards_wine_vine_rebland_grapes,3303060000,vineyards_wine_vine_rebland_grapes,3303060000 +531,Anden træfrugt,Other tree fruit,orchards_fruits,3303010000,orchards_fruits,3303010000 +532,Anden buskfrugt,Other shrub fruit,shrubberries_shrubs,3303080000,shrubberries_shrubs,3303080000 +533,Rønnebær,Rowanberries,rowan_rowanberries,3303021300,rowan_rowanberries,3303021300 +534,Hyben,Rose hip,rose_hip_rosehip,3303021200,rose_hip_rosehip,3303021200 +536,Spisedruer,Food grape,vineyards_wine_vine_rebland_grapes,3303060000,vineyards_wine_vine_rebland_grapes,3303060000 +537,Valnød (almindelig),Walnut common,walnuts,3303030600,walnuts,3303030600 +538,Kastanje (ægte),Chestnut sweet,sweet_chestnuts,3303030500,sweet_chestnuts,3303030500 +539,Blandet frugt,Mixed fruit,orchards_fruits,3303010000,orchards_fruits,3303010000 +540,Tomater,Tomatoes,tomato,3301280000,tomato,3301280000 +541,Agurker,Cucumbers,cucumber_pickle,3301140100,cucumber_pickle,3301140100 +542,Salat (drivhus),Lettuce (greenhouse),greenhouse_foil_film,3305000000,greenhouse_foil_film,3305000000 +543,"Grøntsager, andre (drivhus)",Vegetables other (greenhouse),greenhouse_foil_film,3305000000,greenhouse_foil_film,3305000000 +544,Snitblomster og snitgrønt,Cut flowers and foliage,flowers_ornamental_plants,3301080000,flowers_ornamental_plants,3301080000 +545,Potteplanter,Houseplants,flowers_ornamental_plants,3301080000,flowers_ornamental_plants,3301080000 +547,"Planteskolekulturer, stauder",Nursery cultivation perennials,nurseries_nursery,3303070000,nurseries_nursery,3303070000 +548,"Småplanter, en-årige",Seedlings annuals,arable_land_seed_seedlings,3301100000,arable_land_seed_seedlings,3301100000 +551,Moskusgræskar,Pumpkins,pumpkin_squash_gourd,3301140400,pumpkin_squash_gourd,3301140400 +552,Mandelgræskar,Garden pumpkin,pumpkin_squash_gourd,3301140400,pumpkin_squash_gourd,3301140400 +553,Centnergræskar,Giant pumpkin,pumpkin_squash_gourd,3301140400,pumpkin_squash_gourd,3301140400 +563,"Svampe, champignon",Mushrooms champignon,other_mushrooms_energy_crops_genetically_modified_crops,3304990000,mushrooms_energy_genetically_modified_crops,3304000000 +564,Containerplads,Container area,not_known_and_other,3399000000,not_known_and_other,3399000000 +570,Humle,Hops,hops,3301060200,hops,3301060200 +576,skovrejsning (statslig) - forbedring af vandmiljøog grundvandsbeskyttelse,Afforestation - the improvement of aquatic environment and groundwater protection,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +577,Skov med biodiversitetsformål,Forest for biodiversity purposes,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +578,Skovrejsning (privat) – forbedring af vandmiljø og grundvandsbeskyttelse,Afforestation (private) - improvement of aquatic environment and groundwater protection,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +579,"Tagetes, sygdomssanerende plante",African marigold,calendula_marigold,3301061210,calendula_marigold,3301061210 +580,"Skovdrift, alm.",Forestry common,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +581,Nyplantning i skov med træhøjde under 3 m,Afforestation with treehight below 3 m,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +582,"Pyntegrønt, økologisk jordbrug",Ornamental green branches organic farming,tree_wood_forest,3306000000,flowers_ornamental_plants,3301080000 +583,Juletræer og pyntegrønt på landbrugsjord,Christmas trees and ornamental greenery on agricultural land,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +585,"Skovrejsning i projektområde, som ikke er omfattet af tilsagn",Forest establisment in project areas not included by a scheme,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +586,Offentlig skovrejsning,Public forest establisment,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +587,Skovrejsning på tidl. landbrugsjord 3,Forest establisment on former farmland 3,afforestation_reforestation,3306010000,afforestation_reforestation,3306010000 +589,Bæredygtig skovdrift,Sustainable forestry,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +590,Bæredygtig skovdrift i Natura 2000-område,Sustainable forestry in Natura 2000 area,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +591,Lavskov,Coppice forest,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +592,Pil,Willow,willows_osiers,3306080000,willows_osiers,3306080000 +593,Poppel (0-100 andre træer pr. ha),Poplar (0-100 other trees per hectare),populus,3306070000,populus,3306070000 +593,Poppel,Poplar,populus,3306070000,populus,3306070000 +594,El,Alder,other_tree_wood_forest,3306990000,tree_wood_forest,3306000000 +596,Elefantgræs,Elephant grass,poaceae_grasses,3301090200,poaceae_grasses,3301090200 +597,Rørgræs,Reed canary grass,poaceae_grasses,3301090200,temporary_grass,3301090100 +602,MFO - Pil,EFA - Willow,willows_osiers,3306080000,willows_osiers,3306080000 +603,MFO - Poppel,EFA - Poplar,populus,3306070000,populus,3306070000 +605,MFO - Lavskov,EFA - Coppice forest,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +606,MFO - Poppel (100-400 andre træer pr. ha),EFA - Poplar (100-400 other trees per hectare),other_tree_wood_forest,3306990000,tree_wood_forest,3306000000 +650,"Chrysanthemum Garland, frø",Chrysanthemum Garland seeds,chrysanthemum,3301080900,chrysanthemum,3301080900 +651,Dildfrø,Dill seeds,anethum_dill,3301061203,anethum_dill,3301061203 +652,Kinesisk kålfrø,Chinese cabbage seeds,chinese_cabbage,3301210205,chinese_cabbage,3301210205 +653,Karsefrø,Cress seeds,cress,3301210300,cress,3301210300 +654,Rucolafrø,Rocket Arugula seeds,rocket_arugula,3301310600,rocket_arugula,3301310600 +655,Radisefrø (inklusiv olieræddikefrø),Radish seeds (including oil radish seeds),radish,3301290600,radish,3301290600 +656,"Bladbedefrø, rødbedefrø",Beetroot seeds beetroot seeds,beetroot_beets,3301290200,beetroot_beets,3301290200 +657,Grønkålfrø,Curly Kale seeds,kale,3301210208,kale,3301210208 +659,Kålfrø (hvid- og rødkål),Cabbage seeds (white and red cabbage),brassica_oleracea_cabbage,3301210200,brassica_oleracea_cabbage,3301210200 +660,Persillefrø,Parsley seeds,parsly,3301061227,parsly,3301061227 +661,Kørvelfrø,Chervil seeds,chervil,3301061214,chervil,3301061214 +662,Majroefrø,Turnip seeds,turnips,3301290800,turnips,3301290800 +663,Pastinakfrø,Parsnip seeds,parsnips,3301290500,parsnips,3301290500 +664,Skorzonerrod/skorzonerrodfrø,Scorzonera/Scorzonera seeds,root_vegetables,3301290000,root_vegetables,3301290000 +666,Purløgsfrø,Chives seeds,chives,3301220100,chives,3301220100 +667,Timianfrø,Thyme seeds,thyme,3301061237,thyme,3301061237 +668,Blomsterfrø,Flower seeds,flowers_ornamental_plants,3301080000,flowers_ornamental_plants,3301080000 +701,Grønkorn af vårbyg,Green grain of spring barley,spring_barley,3301010402,spring_barley,3301010402 +702,Grønkorn af vårhvede,Green grain of spring wheat,spring_common_soft_wheat,3301010102,spring_common_soft_wheat,3301010102 +703,Grønkorn af vårhavre,Green grain of spring oats,spring_oats,3301010502,spring_oats,3301010502 +704,Grønkorn af vårrug,Green grain of spring rye,spring_rye,3301010302,spring_rye,3301010302 +706,Grønkorn af vinterbyg,Green grain of winter barley,winter_barley,3301010401,winter_barley,3301010401 +707,Grønkorn af vinterhvede,Green grain of winter wheat,winter_common_soft_wheat,3301010101,winter_common_soft_wheat,3301010101 +708,Grønkorn af vinterhavre,Green grains of winter oats,winter_oats,3301010501,winter_oats,3301010501 +709,Grønkorn af vinterrug,Green grains of winter rye,winter_rye,3301010301,winter_rye,3301010301 +710,Grønkorn af hybridrug,Green grains of hybrid rye,rye,3301010300,rye,3301010300 +711,Grønkorn af vintertriticale,Green grains of winter triticale,winter_triticale,3301010801,winter_triticale,3301010801 +900,Øvrige afgrøder,Other crops,other_arable_land_crops,3301990000,other_arable_land_crops,3301990000 +903,Lysåbne arealer i skov,Light and open areas in wood,tree_wood_forest,3306000000,tree_wood_forest,3306000000 +907,"Naturarealer, økologisk jordbrug",Nature areas organic farming,other_arable_land_crops,3301990000,other_arable_land_crops,3301990000 +921,Intern kode: Bar jord,Internal code: Bare soil,not_known_and_other,3399000000,not_known_and_other,3399000000 diff --git a/tests/data-files/improve/be_vlg_2024_fiboa_0_2.parquet b/tests/data-files/improve/be_vlg_2024_fiboa_0_2.parquet new file mode 100644 index 0000000000000000000000000000000000000000..35b43cd8e7595e58963d95bba5fc21bcb3cb8cef GIT binary patch literal 36817 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 X#{U2X|AUo-|2ubQbZ+i!Fzfzb1lgz; literal 0 HcmV?d00001 diff --git a/tests/data-files/improve/dk_2024_fiboa_0_2.parquet b/tests/data-files/improve/dk_2024_fiboa_0_2.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e755dd6e54642e0c96f495d9149a7ea16513c512 GIT binary patch literal 74976 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 literal 0 HcmV?d00001 diff --git a/tests/test_improve.py b/tests/test_improve.py new file mode 100644 index 00000000..2e2dd5de --- /dev/null +++ b/tests/test_improve.py @@ -0,0 +1,50 @@ +from pathlib import Path + +import geopandas +from pytest import mark +from vecorel_cli.validate import ValidateData + +from fiboa_cli.improve import Improve + +files = [ + "fiboa-example.json", + "improve/be_vlg_2024_fiboa_0_2.parquet", + "improve/dk_2024_fiboa_0_2.parquet", +] + + +@mark.parametrize("base", files) +def test_improve_base(tmp_parquet_file, base): + source = Path("tests/data-files") / base + + # Fiboa-0_2 file is not fiboa or vecorel compliant + assert ValidateData().validate(source).is_valid() == ("fiboa_0_2" not in base) + + Improve().improve_file(source=source, target=tmp_parquet_file) + result = ValidateData().validate(tmp_parquet_file) + assert result.is_valid(), result.errors + + +@mark.parametrize("base,hcat", list(zip(files[1:], ["be_vlg/be_vlg_2021.csv", "dk/dk_2019.csv"]))) +def test_improve_hcat(tmp_parquet_file, base, hcat): + source = Path("tests/data-files") / base + hcat = "tests/data-files/convert/" + hcat + + Improve().improve_file(source=source, target=tmp_parquet_file, add_hcat=hcat) + result = ValidateData().validate(tmp_parquet_file, num=100) + assert result.is_valid(), result.errors + + gdf = geopandas.read_parquet(tmp_parquet_file) + for col in ["hcat:code", "hcat:name", "hcat:name_en"]: + assert col in gdf.columns + + mapping = dict(gdf[["crop:name", "hcat:name_en"]].values) + check = { + "Wintertarwe": "winter wheat", + "Grasland": "Grassland", + "Vinterrug": "Winter rye", + "Lupin": "Sweet lupine", + } + + count = sum(mapping[k] == v for k, v in check.items() if k in mapping) + assert count == 2, f"Missing {len(check) - count} of {len(check)} values in {mapping.keys()}" From dfaf91a21d4d1f3831134b320933397cec43d0f4 Mon Sep 17 00:00:00 2001 From: Ivor Bosloper Date: Thu, 16 Oct 2025 23:01:17 +0200 Subject: [PATCH 2/4] fallback to file_name if fiboa2-collection.id is missing --- fiboa_cli/improve.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fiboa_cli/improve.py b/fiboa_cli/improve.py index 2fbd1af6..1214b472 100644 --- a/fiboa_cli/improve.py +++ b/fiboa_cli/improve.py @@ -46,7 +46,7 @@ def improve_file( metadata = input_encoding.get_metadata() if b"fiboa" in metadata: fiboa_2 = json.loads(metadata[b"fiboa"].decode("utf-8")) - geodata, collection = self.migrate_fiboa_2(geodata, fiboa_2) + geodata, collection = self.migrate_fiboa_2(geodata, fiboa_2, source.name) geodata, collection = self.improve(geodata, collection=collection, **kwargs) @@ -89,7 +89,9 @@ class HCAT(AddHCATMixin, FiboaBaseConverter): return HCAT().add_hcat(gdf), collection - def migrate_fiboa_2(self, geodata, original: Collection) -> tuple[GeoDataFrame, Collection]: + def migrate_fiboa_2( + self, geodata, original: Collection, file_name: str + ) -> tuple[GeoDataFrame, Collection]: if original["fiboa_version"] != "0.2.0": self.warning( f"Not migrating from fiboa version {original['fiboa_version']}, can only migrate fiboa from 0.2.0" @@ -103,8 +105,10 @@ def migrate_fiboa_2(self, geodata, original: Collection) -> tuple[GeoDataFrame, schemas.add(EXTENSION_MAPPING[e]) base = {k: original[k] for k in ("title", "description", "attribution") if k in original} + collection_id = original.get("id") or file_name.split(".")[0] + collection = Collection( - {"schemas": {original["id"]: list(schemas)}, "collection": original["id"]} | base + {"schemas": {collection_id: list(schemas)}, "collection": collection_id} | base ) # Migrate custom schemas From d38684286632dec0542f3daf524c9ed64c80b3f4 Mon Sep 17 00:00:00 2001 From: Ivor Bosloper Date: Thu, 16 Oct 2025 23:07:00 +0200 Subject: [PATCH 3/4] Update README fiboa improve, add new fiboa improve features --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 255f8260..370fde9f 100644 --- a/README.md +++ b/README.md @@ -144,11 +144,13 @@ Check `fiboa validate-schema --help` for more details. Various "improvements" can be applied to a fiboa GeoParquet file. The commands allows to +- detect fiboa-0.2 files and convert them to fiboa-0.3 - change the CRS (`--crs`) - change the GeoParquet version (`-gp1`) and compression (`-pc`) - add/fill missing perimeter/area values (`-sz`) - fix invalid geometries (`-g`) - rename columns (`-r`) +- add HCAT columns (`--hcat=mapping.csv`) based on the input crop:code (from crop-extension) and a hcat-mapping csv file Example: From 47fe04caaad95e4b201f4c497f5d19638dced9c1 Mon Sep 17 00:00:00 2001 From: Ivor Date: Mon, 27 Oct 2025 20:27:05 +0100 Subject: [PATCH 4/4] Update fiboa_cli/improve.py Co-authored-by: Matthias Mohr --- fiboa_cli/improve.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fiboa_cli/improve.py b/fiboa_cli/improve.py index 1214b472..09a81008 100644 --- a/fiboa_cli/improve.py +++ b/fiboa_cli/improve.py @@ -139,7 +139,7 @@ def migrate_fiboa_2( for k, v in ( ("determination_datetime", "determination:datetime"), ("determination_method", "determination:method"), - ("metrics_perimeter", "metrics:perimeter"), + ("perimeter", "metrics:perimeter"), ) if k in original }