From 88020f807d6bf81e9461406609049cd3bd04a507 Mon Sep 17 00:00:00 2001 From: Ivor Bosloper Date: Fri, 15 May 2026 21:48:43 +0200 Subject: [PATCH 1/2] Rename es to es_base, so we can introduce a generic Spain-wide converter --- fiboa_cli/datasets/es_an.py | 2 +- fiboa_cli/datasets/es_ar.py | 2 +- fiboa_cli/datasets/es_base.py | 50 +++++++++++++++++++++++++++++++++++ fiboa_cli/datasets/es_cb.py | 2 +- fiboa_cli/datasets/es_cl.py | 2 +- fiboa_cli/datasets/es_cm.py | 2 +- fiboa_cli/datasets/es_ex.py | 2 +- fiboa_cli/datasets/es_ga.py | 2 +- fiboa_cli/datasets/es_ib.py | 2 +- fiboa_cli/datasets/es_md.py | 2 +- fiboa_cli/datasets/es_nc.py | 2 +- fiboa_cli/datasets/es_pv.py | 2 +- fiboa_cli/datasets/es_vc.py | 2 +- fiboa_cli/registry.py | 2 +- 14 files changed, 63 insertions(+), 13 deletions(-) create mode 100644 fiboa_cli/datasets/es_base.py diff --git a/fiboa_cli/datasets/es_an.py b/fiboa_cli/datasets/es_an.py index 44abd2fe..b484f3a0 100644 --- a/fiboa_cli/datasets/es_an.py +++ b/fiboa_cli/datasets/es_an.py @@ -1,7 +1,7 @@ from loguru import logger from .commons.data import read_data_csv -from .es import ESBaseConverter +from .es_base import ESBaseConverter class ANConverter(ESBaseConverter): diff --git a/fiboa_cli/datasets/es_ar.py b/fiboa_cli/datasets/es_ar.py index ac8d1f60..9e5b059b 100644 --- a/fiboa_cli/datasets/es_ar.py +++ b/fiboa_cli/datasets/es_ar.py @@ -1,6 +1,6 @@ import pandas as pd -from .es import ESBaseConverter +from .es_base import ESBaseConverter class ARConverter(ESBaseConverter): diff --git a/fiboa_cli/datasets/es_base.py b/fiboa_cli/datasets/es_base.py new file mode 100644 index 00000000..4d2fd9d4 --- /dev/null +++ b/fiboa_cli/datasets/es_base.py @@ -0,0 +1,50 @@ +from vecorel_cli.vecorel.extensions import ADMIN_DIVISION + +from fiboa_cli.conversion.fiboa_converter import FiboaBaseConverter +from fiboa_cli.datasets.commons.data import read_data_csv + + +class ESBaseConverter(FiboaBaseConverter): + """ + Base Converter for Spain + Asssumes a source column with the SIGPAC-Land Use code + The Land Use code is filtered for agricultural use and transformed into a high-level crop type + + "Cultivo Declarado" is what we would prefer, but the "Recinto" is the best to be found so far + + For Spanish Sources, see https://www.cartodruid.es/en/-/descargar-sigpac-comunidad-autonoma + There seems to be a National Layer; https://inspire-geoportal.ec.europa.eu/srv/api/records/87ce5171-d713-4eec-a1f3-2b9dd94cad91 + """ + + use_code_attribute = "uso_sigpac" + + extensions = { + "https://fiboa.org/crop-extension/v0.2.0/schema.yaml", + ADMIN_DIVISION, + } + column_additions = { + # https://www.euskadi.eus/contenidos/informacion/pac2015_pagosdirectos/es_def/adjuntos/Anexos_PAC_marzo2015.pdf + # https://www.fega.gob.es/sites/default/files/files/document/AD-CIRCULAR_2-2021_EE98293_SIGC2021.PDF + # Very generic list + "admin:country_code": "ES", + "crop:code_list": "https://fiboa.org/code/es/sigpac/land_use.csv", + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.id.startswith("es_"), "Assuming Spanish subclass" + + def code_filter(col): + return ~col.isin("AG/CA/ED/FO/IM/IS/IV/TH/ZC/ZU/ZV/MT".split("/") + [None]) + + self.column_filters = {self.use_code_attribute: code_filter} + self.column_additions["admin:subdivision_code"] = self.id[len("es_") :].upper() + + def migrate(self, gdf): + # This actually is a land use code. Not sure if we should put this in crop:code + rows = read_data_csv("es_coda_uso.csv") + mapping = {row["original_code"]: row["original_name"] for row in rows} + mapping_en = {row["original_code"]: row["name_en"] for row in rows} + gdf["crop:name"] = gdf[self.use_code_attribute].map(mapping) + gdf["crop:name_en"] = gdf[self.use_code_attribute].map(mapping_en) + return super().migrate(gdf) diff --git a/fiboa_cli/datasets/es_cb.py b/fiboa_cli/datasets/es_cb.py index 9d63ee5e..a2ca7096 100644 --- a/fiboa_cli/datasets/es_cb.py +++ b/fiboa_cli/datasets/es_cb.py @@ -1,7 +1,7 @@ import re from fiboa_cli.conversion.converter_rest import EsriRESTConverterMixin -from fiboa_cli.datasets.es import ESBaseConverter +from fiboa_cli.datasets.es_base import ESBaseConverter class ESCBConverter(EsriRESTConverterMixin, ESBaseConverter): diff --git a/fiboa_cli/datasets/es_cl.py b/fiboa_cli/datasets/es_cl.py index 573f0ceb..1d2cf4d9 100644 --- a/fiboa_cli/datasets/es_cl.py +++ b/fiboa_cli/datasets/es_cl.py @@ -4,7 +4,7 @@ import requests from loguru import logger -from .es import ESBaseConverter +from .es_base import ESBaseConverter regex = re.compile(r"\d+_(RECFE|BURGOS).*\.shp$") diff --git a/fiboa_cli/datasets/es_cm.py b/fiboa_cli/datasets/es_cm.py index c6e6f6ce..789ce436 100644 --- a/fiboa_cli/datasets/es_cm.py +++ b/fiboa_cli/datasets/es_cm.py @@ -3,7 +3,7 @@ import requests from fiboa_cli.conversion.converter_rest import EsriRESTConverterMixin -from fiboa_cli.datasets.es import ESBaseConverter +from fiboa_cli.datasets.es_base import ESBaseConverter class ESCMConverter(EsriRESTConverterMixin, ESBaseConverter): diff --git a/fiboa_cli/datasets/es_ex.py b/fiboa_cli/datasets/es_ex.py index 4ca7fe1f..867c08e3 100644 --- a/fiboa_cli/datasets/es_ex.py +++ b/fiboa_cli/datasets/es_ex.py @@ -3,7 +3,7 @@ import requests -from fiboa_cli.datasets.es import ESBaseConverter +from fiboa_cli.datasets.es_base import ESBaseConverter class EXConverter(ESBaseConverter): diff --git a/fiboa_cli/datasets/es_ga.py b/fiboa_cli/datasets/es_ga.py index 0e94d161..0e2889a6 100644 --- a/fiboa_cli/datasets/es_ga.py +++ b/fiboa_cli/datasets/es_ga.py @@ -1,5 +1,5 @@ from fiboa_cli.conversion.converter_rest import EsriRESTConverterMixin -from fiboa_cli.datasets.es import ESBaseConverter +from fiboa_cli.datasets.es_base import ESBaseConverter class ESGAConverter(EsriRESTConverterMixin, ESBaseConverter): diff --git a/fiboa_cli/datasets/es_ib.py b/fiboa_cli/datasets/es_ib.py index 2c2f9d7e..a7ff02cf 100644 --- a/fiboa_cli/datasets/es_ib.py +++ b/fiboa_cli/datasets/es_ib.py @@ -3,7 +3,7 @@ import pandas as pd from fiboa_cli.conversion.converter_rest import EsriRESTConverterMixin -from fiboa_cli.datasets.es import ESBaseConverter +from fiboa_cli.datasets.es_base import ESBaseConverter class ESIBConverter(EsriRESTConverterMixin, ESBaseConverter): diff --git a/fiboa_cli/datasets/es_md.py b/fiboa_cli/datasets/es_md.py index a69fd6f2..9f4f748d 100644 --- a/fiboa_cli/datasets/es_md.py +++ b/fiboa_cli/datasets/es_md.py @@ -1,4 +1,4 @@ -from .es import ESBaseConverter +from .es_base import ESBaseConverter class ESCLConverter(ESBaseConverter): diff --git a/fiboa_cli/datasets/es_nc.py b/fiboa_cli/datasets/es_nc.py index a06d3dd0..b84cf58f 100644 --- a/fiboa_cli/datasets/es_nc.py +++ b/fiboa_cli/datasets/es_nc.py @@ -6,7 +6,7 @@ from loguru import logger from vecorel_cli.vecorel.util import name_from_uri -from .es import ESBaseConverter +from .es_base import ESBaseConverter class NCConverter(ESBaseConverter): diff --git a/fiboa_cli/datasets/es_pv.py b/fiboa_cli/datasets/es_pv.py index e4fbe3b5..1ff293bd 100644 --- a/fiboa_cli/datasets/es_pv.py +++ b/fiboa_cli/datasets/es_pv.py @@ -2,7 +2,7 @@ import requests from loguru import logger -from .es import ESBaseConverter +from .es_base import ESBaseConverter class ESPVConverter(ESBaseConverter): diff --git a/fiboa_cli/datasets/es_vc.py b/fiboa_cli/datasets/es_vc.py index a03b9dae..9289babd 100644 --- a/fiboa_cli/datasets/es_vc.py +++ b/fiboa_cli/datasets/es_vc.py @@ -3,7 +3,7 @@ import requests -from .es import ESBaseConverter +from .es_base import ESBaseConverter class ESVCConverter(ESBaseConverter): diff --git a/fiboa_cli/registry.py b/fiboa_cli/registry.py index 56e0f04d..76562bc8 100644 --- a/fiboa_cli/registry.py +++ b/fiboa_cli/registry.py @@ -22,7 +22,7 @@ class FiboaRegistry(VecorelRegistry): "determination:details", ] required_extensions = [re.compile(spec_pattern)] - ignored_datasets = VecorelRegistry.ignored_datasets + ["es.py"] + ignored_datasets = VecorelRegistry.ignored_datasets + ["es_base.py"] def register_commands(self): from .convert import ConvertData From 42db7be45f6d18d2a26fcaf508f0ffc05de40e9c Mon Sep 17 00:00:00 2001 From: Ivor Bosloper Date: Fri, 15 May 2026 21:54:01 +0200 Subject: [PATCH 2/2] Converter for Spain (whole), based on the FEGA 2025+ data --- CHANGELOG.md | 2 + fiboa_cli/datasets/es.py | 125 ++++++++++++++---- .../es/1501_ALAVA_cd_2025_20250105.gpkg.zip | Bin 0 -> 30369 bytes tests/test_convert.py | 2 + 4 files changed, 102 insertions(+), 27 deletions(-) create mode 100644 tests/data-files/convert/es/1501_ALAVA_cd_2025_20250105.gpkg.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index 98daeccf..b0bbc5d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [Unreleased] +- Converter for Spain (whole), based on the FEGA 2025+ data + ## [v0.21.0] - 2026-02-16 - Update vecorel-cli diff --git a/fiboa_cli/datasets/es.py b/fiboa_cli/datasets/es.py index 4d2fd9d4..2352d444 100644 --- a/fiboa_cli/datasets/es.py +++ b/fiboa_cli/datasets/es.py @@ -1,50 +1,121 @@ +import re + +import requests from vecorel_cli.vecorel.extensions import ADMIN_DIVISION -from fiboa_cli.conversion.fiboa_converter import FiboaBaseConverter -from fiboa_cli.datasets.commons.data import read_data_csv +from ..conversion.fiboa_converter import FiboaBaseConverter + +class Converter(FiboaBaseConverter): + id = "es" + short_name = "Spain" + title = "Spain Declared Crops (Cultivos Declarados SIGPAC)" + description = """ +National declared-crop dataset (Cultivos Declarados SIGPAC) published by the Spanish Agricultural Guarantee Fund +(FEGA) via the unified SIGPAC Hub Cloud portal (sigpac-hubcloud.es). Each record is a declaration line within a +farmer's Single Application (Solicitud Única) for Common Agricultural Policy (CAP) direct payments, mapped onto +SIGPAC cadastral divisions. Data is distributed as one GeoPackage per Spanish province, harmonised across the +country since the 2025 campaign year. -class ESBaseConverter(FiboaBaseConverter): +This is a high-value dataset (HVD) under EU Implementing Regulation 2023/138. """ - Base Converter for Spain - Asssumes a source column with the SIGPAC-Land Use code - The Land Use code is filtered for agricultural use and transformed into a high-level crop type + provider = "Fondo Español de Garantía Agraria (FEGA) " + attribution = "©FEGA / Ministerio de Agricultura, Pesca y Alimentación" + license = "CC-BY-4.0" - "Cultivo Declarado" is what we would prefer, but the "Recinto" is the best to be found so far + variants = {"2025": "2025"} - For Spanish Sources, see https://www.cartodruid.es/en/-/descargar-sigpac-comunidad-autonoma - There seems to be a National Layer; https://inspire-geoportal.ec.europa.eu/srv/api/records/87ce5171-d713-4eec-a1f3-2b9dd94cad91 - """ + columns = { + "geometry": "geometry", + "id": "id", + "provincia": "admin_province_code", + "municipio": "admin_municipality_code", + "dn_surface": "metrics:area", + "parc_producto": "crop:code", + "parc_sistexp": "irrigation_system", + "parc_supcult": "cultivation_surface", + } - use_code_attribute = "uso_sigpac" + area_is_in_ha = False extensions = { "https://fiboa.org/crop-extension/v0.2.0/schema.yaml", ADMIN_DIVISION, } + column_additions = { - # https://www.euskadi.eus/contenidos/informacion/pac2015_pagosdirectos/es_def/adjuntos/Anexos_PAC_marzo2015.pdf - # https://www.fega.gob.es/sites/default/files/files/document/AD-CIRCULAR_2-2021_EE98293_SIGC2021.PDF - # Very generic list "admin:country_code": "ES", - "crop:code_list": "https://fiboa.org/code/es/sigpac/land_use.csv", + # FEGA declared-crop codelist (PARC_PRODUCTO) — separate from the SIGPAC land-use list. + # Reference list shipped inside each provincial GPKG as the `cod_producto` layer. + "crop:code_list": "https://fiboa.org/code/es/cultivos_declarados/parc_producto.csv", + } + + column_migrations = { + # crop:code must be a string per the crop extension; parc_producto is an integer. + "parc_producto": lambda col: col.astype("Int64").astype(str), + # admin_*_code are strings; zero-pad province to 2 digits (INE convention). + "provincia": lambda col: col.astype("Int64").astype(str).str.zfill(2), + "municipio": lambda col: col.astype("Int64").astype(str), + } + + missing_schemas = { + "properties": { + "admin_province_code": {"type": "string"}, + "admin_municipality_code": {"type": "string"}, + "irrigation_system": {"type": "string"}, + "cultivation_surface": {"type": "int32"}, + } } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - assert self.id.startswith("es_"), "Assuming Spanish subclass" - - def code_filter(col): - return ~col.isin("AG/CA/ED/FO/IM/IS/IV/TH/ZC/ZU/ZV/MT".split("/") + [None]) + if not self.variant: + self.variant = next(iter(self.variants)) + self.column_additions = { + **self.column_additions, + "determination:datetime": f"{self.variant}-01-01T00:00:00Z", + } - self.column_filters = {self.use_code_attribute: code_filter} - self.column_additions["admin:subdivision_code"] = self.id[len("es_") :].upper() + def layer_filter(self, layer: str, uri: str) -> bool: + # GPKG contains the data layer plus several codelist tables (cod_*) — only read the data. + return layer == "cultivo_declarado" def migrate(self, gdf): - # This actually is a land use code. Not sure if we should put this in crop:code - rows = read_data_csv("es_coda_uso.csv") - mapping = {row["original_code"]: row["original_name"] for row in rows} - mapping_en = {row["original_code"]: row["name_en"] for row in rows} - gdf["crop:name"] = gdf[self.use_code_attribute].map(mapping) - gdf["crop:name_en"] = gdf[self.use_code_attribute].map(mapping_en) + # The source has no globally unique row identifier. Build one from the SIGPAC cadastral key + # plus the declaration-line index, which is unique per record. + def part(col): + return gdf[col].astype("Int64").astype(str) + + gdf["id"] = ( + part("provincia").str.zfill(2) + + "-" + + part("municipio") + + "-" + + part("agregado") + + "-" + + part("zona") + + "-" + + part("poligono") + + "-" + + part("parcela") + + "-" + + part("recinto") + + "-" + + part("ld_recinto") + ) return super().migrate(gdf) + + def get_urls(self): + if self.variant not in self.variants: + opts = ", ".join(self.variants.keys()) + raise ValueError(f"Unknown variant '{self.variant}', choose from {opts}") + + year = self.variant + base = f"https://sigpac-hubcloud.es/geopackages/{year}/cultivo_declarado/" + response = requests.get(base, timeout=60) + response.raise_for_status() + # The directory listing is a classic Apache-style HTML index; parse out the .zip hrefs. + zip_paths = re.findall(r'HREF="(/geopackages/[^"]+\.zip)"', response.text) + if not zip_paths: + raise RuntimeError(f"No GeoPackage archives found at {base}") + return {f"https://sigpac-hubcloud.es{p}": ["*.gpkg"] for p in zip_paths} diff --git a/tests/data-files/convert/es/1501_ALAVA_cd_2025_20250105.gpkg.zip b/tests/data-files/convert/es/1501_ALAVA_cd_2025_20250105.gpkg.zip new file mode 100644 index 0000000000000000000000000000000000000000..a90e4560f22fdb8b5d2345f4211b859060d830cc GIT binary patch literal 30369 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 ZN5EJ;P5g)dx*q56{{C;y8St;#{{d}RTRZ>& literal 0 HcmV?d00001 diff --git a/tests/test_convert.py b/tests/test_convert.py index 2766e5b5..c614158a 100644 --- a/tests/test_convert.py +++ b/tests/test_convert.py @@ -43,6 +43,7 @@ "lv", "ie", "es_cat", + "es", "nz", "lt", "si", @@ -67,6 +68,7 @@ def _input_files(converter, *names): "br_ba_lem": _input_files("br_ba_lem", "LEM_dataset.zip"), "ch": _input_files("ch", "lwb_nutzungsflaechen_v2_0_lv95.gpkg"), "es_cat": _input_files("es_cat", "Cultius_DUN2023_GPKG.zip"), + "es": {"input_files": {f"{test_path}/es/1501_ALAVA_cd_2025_20250105.gpkg.zip": ["*.gpkg"]}}, "lv": _input_files("lv", "1_100.xml"), "nz": _input_files("nz", "irrigated-land-area-raw-2020-update.zip"), "jecam": _input_files("jecam", "BD_JECAM_CIRAD_2023_feb.shp"),