Структура посевных площадей Франции 2015-2024.
Датасет создан ASP (Agence de Service et de Paiement – Агентство по обслуживанию и платежам) при технической поддержке IGN (Национальный институт географической информации Франции).
Описание
Датасет создан ASP (Agence de Service et de Paiement – Агентство по обслуживанию и платежам) при технической поддержке IGN (Национальный институт географической информации Франции). Данные формируются на основе ежегодных деклараций фермеров, подаваемых для получения субсидий в рамках Единой аграрной политики (CAP). RPG версии 2.1 предоставляет анонимную картографическую информацию о местоположении, границах и основных характеристиках (код культуры, площадь) сельскохозяйственных участков. Используется для анализа землепользования, планирования в агросфере, контроля субсидий и научных исследований. **поле с кодом культуры - „CODE_CULTU“
Работа с RPG GeoParquet на S3
Что понадобится
Le Registre Parcellaire Graphique (RPG) содержит границы заявленных сельскохозяйственных участков Франции за 2015–2024. DuckDB — встраиваемая аналитическая база: отдельный сервер и загрузка всех данных в память не нужны. DuckDB позволяет работать со всеми годами через Python, не поднимая отдельную базу данных.
uv add duckdb geopandas
# или: python -m pip install duckdb geopandas
Для дальнейших возможностей DuckDB смотрите Python API, S3 API и spatial functions.
Подключение ко всему датасету
import duckdb
def open_rpg() -> duckdb.DuckDBPyConnection:
con = duckdb.connect()
con.execute("""
INSTALL httpfs;
LOAD httpfs;
INSTALL spatial;
LOAD spatial;
CREATE OR REPLACE SECRET esoil_s3 (
TYPE s3,
ENDPOINT 's3.esoil.ru',
URL_STYLE 'path',
USE_SSL true,
SCOPE 's3://datasets/'
);
CREATE OR REPLACE VIEW rpg AS
SELECT *
FROM read_parquet(
's3://datasets/rpg/year=*/rpg.parquet',
hive_partitioning = true,
hive_types = {'year': INTEGER}
);
""")
return con
con = open_rpg()
print(con.sql("SELECT min(year), max(year), count(*) AS parcels FROM rpg").df())
rpg — это view, то есть сохранённое имя для удалённых Parquet-файлов.
Создание view не скачивает весь датасет. Результаты .df() — обычные Pandas
DataFrame; вызывайте их только после достаточно узкого запроса.
Культуры и площадь по всем годам
surf_parc измеряется в гектарах. code_cultu — детальный код культуры,
code_group, culture_d1 и culture_d2 удобны для укрупнения классов.
by_crop = con.sql("""
SELECT year,
code_group,
code_cultu,
culture_d1,
count(*) AS parcels,
sum(surf_parc) AS area_ha
FROM rpg
WHERE code_cultu IS NOT NULL
GROUP BY year, code_group, code_cultu, culture_d1
ORDER BY year, area_ha DESC
""")
print(by_crop.limit(30).df())
cat_cult_p добавлено в 2024; в предыдущих годах это поле равно NULL.
Выборка по ROI-полигону
Предположим, имеется файл study_area.geojson с полигоном территории
исследования. GeoPandas читает его и перепроецирует в Lambert-93 / EPSG:2154,
CRS RPG.
import geopandas as gpd
roi_file = gpd.read_file("study_area.geojson").to_crs("EPSG:2154")
roi_geometry = roi_file.geometry.union_all()
minx, miny, maxx, maxy = roi_geometry.bounds
roi_wkt = roi_geometry.wkt
roi = con.execute(
"""
SELECT year, id_parcel, code_cultu, culture_d1, surf_parc,
ST_AsText(ST_GeomFromWKB(geometry)) AS geometry_wkt
FROM rpg
WHERE year BETWEEN ? AND ?
AND geometry IS NOT NULL
AND bbox.xmin <= ? AND bbox.xmax >= ?
AND bbox.ymin <= ? AND bbox.ymax >= ?
AND ST_Intersects(ST_GeomFromWKB(geometry), ST_GeomFromText(?))
""",
[2020, 2024, maxx, minx, maxy, miny, roi_wkt],
).fetchdf()
print(roi)
Не убирайте bbox-условия: они резко сокращают удалённое чтение. Для
табличных агрегаций не выбирайте geometry вообще.
Характеристики
- Тип данных
- Вектор
- Формат
- geoparquet
- Границы
- 1242198.046, 7108926.6707 : 100166.7061, 6049685.1801 (EPSG:2154)
- Временной диапазон
- [01.01.2015, 00:00, 31.12.2024, 23:59]
- Объем данных
- Не указано
- Создано
- Обновлено
Переменные
| Имя | Стандартное имя | CF Standard Name | Единицы | Описание |
|---|---|---|---|---|
| code_cultu | plant_categories |
Связи
Для этого датасета нет связей.