Claude-skill-registry gcs-landbrugsareal-data

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/landbrugsareal" ~/.claude/skills/majiayu000-claude-skill-registry-gcs-landbrugsareal-data && rm -rf "$T"
manifest: skills/data/landbrugsareal/SKILL.md
source content

GCS Landbrugsareal (Agricultural Land) Data Catalog

Field boundaries, crop data, land use, and agricultural production data.

Frontend Metrics Supported

Metric KeyDanish NameDescription
land_use
ArealanvendelseLand use categories
organic_farming
Økologisk arealOrganic farming area
production
AfgrødeproduktionCrop production estimates
crop_diversity
AfgrødediversitetDiversity of crops grown

Available Datasets

Silver Layer

FVM Marker - Field Boundaries (617K rows/year)

Path:

gs://$GCS_BUCKET/silver/fvm_marker_{year}/*/data.parquet
Years Available: 2008-2025

ColumnTypeDescriptionExample
field_idstringUnique field identifier610341-27-1-0
area_hafloatField area in hectares12.45
cvr_numberstringCompany CVR (8 digits)31373077
crop_codeintCrop type code1
crop_namestringCrop type nameVårbyg
block_idstringAgricultural block ID610341-27
geometrybinaryField polygon (WKB, EPSG:4326)-
yearintData year2024
field_uuidstringUUID for field-
municipalitystringMunicipality code0101
is_organicboolOrganic certificationtrue
organic_conversion_datedateDate of organic conversion2020-01-15

Schema (introspected):

field_id: string
area_ha: double
cvr_number: string
crop_code: int64
crop_name: string
block_id: string
geometry: binary (WKB)
year: int64
field_uuid: string
municipality: string
is_organic: bool
organic_conversion_date: date32
[20 columns total]

Agricultural Blocks

Path:

gs://$GCS_BUCKET/silver/agricultural_blocks_{year}/*/data.parquet

ColumnTypeDescription
block_idstringBlock identifier
geometrybinaryBlock polygon (WKB)
total_area_hafloatTotal block area

Cadastral (2.16M rows)

Path:

gs://$GCS_BUCKET/silver/cadastral/*/data.parquet

ColumnTypeDescriptionExample
bfe_numberint64Cadastral parcel ID1234567
business_eventstringLast registration event-
registration_fromtimestampRegistration date-
is_worker_housingboolWorker housing flagfalse
is_common_lotboolCommon lot flagfalse
agricultural_notationstringAgricultural notation-
geometrybinaryParcel polygon (WKB)-

BBR Buildings (579K rows)

Path:

gs://$GCS_BUCKET/silver/bbr_buildings/*/joined_buildings.parquet

ColumnTypeDescription
building_uuidstringUnique building ID
geo_building_polygonbinaryBuilding footprint (WKB)
geo_building_centroidbinaryBuilding center point
building_typestringBuilding type code
building_floor_area_sqmfloatFloor area in m²
building_usage_categorystringUsage category
current_usestringCurrent use description
addressstringBuilding address

DAGI Kommuner (99 rows)

Path:

gs://$GCS_BUCKET/silver/dagi_kommuner/*/data.parquet

ColumnTypeDescription
codestringMunicipality code
namestringMunicipality name
region_codestringRegion code
geometrybinaryMunicipality polygon (WKB)
area_m2floatArea in m²
centroid_xfloatCentroid longitude
centroid_yfloatCentroid latitude

Gold Layer

Field Production (617K rows/year)

Path:

gs://$GCS_BUCKET/gold/field_production_{year}/*/data.parquet

ColumnTypeDescriptionExample
field_idstringField identifier610341-27-1-0
block_idstringBlock identifier610341-27
cvr_numberstringCompany CVR31373077
yearintProduction year2024
area_hafloatField area12.45
crop_typestringCrop type nameVårbyg
organic_farmingboolOrganic flagtrue
landsdel_codestringRegion code-
landsdel_namestringRegion nameNordjylland
dst_regionsstringDST region classification-
kommune_namestringMunicipality nameKøbenhavn
yield_estimate_hkg_hafloatYield estimate hkg/ha52.3
production_estimate_hkgfloatTotal production hkg651.14
field_uuidstringUUID-
primary_field_idstringPrimary field reference-

Schema (introspected):

field_id: string
block_id: string
cvr_number: string
year: int64
area_ha: double
crop_type: string
organic_farming: bool
landsdel_code: string
landsdel_name: string
dst_regions: string
kommune_name: string
yield_estimate_hkg_ha: double
production_estimate_hkg: double
field_uuid: string
primary_field_id: string
[18 columns total]

Common Queries

Get All Fields for a CVR

import pyarrow.parquet as pq
from google.cloud import storage
import io

client = storage.Client()
bucket = client.bucket('$GCS_BUCKET')

# Read FVM marker data for 2024
blob = bucket.blob('silver/fvm_marker_2024/2025-01-10/data.parquet')
buffer = io.BytesIO()
blob.download_to_file(buffer)
buffer.seek(0)
df = pq.read_table(buffer).to_pandas()

# Filter by CVR
company_fields = df[df['cvr_number'] == '31373077']
print(f"Total fields: {len(company_fields)}")
print(f"Total area: {company_fields['area_ha'].sum():.2f} ha")

Calculate Organic Farming Percentage by Municipality

# Group by municipality and organic status
organic_stats = df.groupby(['municipality', 'is_organic']).agg({
    'area_ha': 'sum'
}).unstack(fill_value=0)

organic_stats.columns = ['conventional', 'organic']
organic_stats['organic_pct'] = (
    organic_stats['organic'] /
    (organic_stats['conventional'] + organic_stats['organic']) * 100
)
organic_stats = organic_stats.sort_values('organic_pct', ascending=False)

Get Production Estimates for a Crop

# Read gold production data
blob = bucket.blob('gold/field_production_2024/2025-01-10/data.parquet')
buffer = io.BytesIO()
blob.download_to_file(buffer)
buffer.seek(0)
production = pq.read_table(buffer).to_pandas()

# Filter for wheat
wheat = production[production['crop_type'].str.contains('hvede', case=False)]
print(f"Total wheat area: {wheat['area_ha'].sum():.2f} ha")
print(f"Average yield: {wheat['yield_estimate_hkg_ha'].mean():.2f} hkg/ha")
print(f"Total production: {wheat['production_estimate_hkg'].sum():.2f} hkg")

Crop Diversity Analysis

# Count unique crops per CVR
crop_diversity = df.groupby('cvr_number').agg({
    'crop_name': 'nunique',
    'area_ha': 'sum'
}).reset_index()
crop_diversity.columns = ['cvr_number', 'crop_count', 'total_area']
crop_diversity = crop_diversity.sort_values('crop_count', ascending=False)

Read Geometry with GeoPandas

import geopandas as gpd
import io

# Read with geometry
blob = bucket.blob('silver/fvm_marker_2024/2025-01-10/data.parquet')
buffer = io.BytesIO()
blob.download_to_file(buffer)
buffer.seek(0)

# Read as GeoDataFrame
gdf = gpd.read_parquet(buffer)
gdf = gdf.set_crs('EPSG:4326')  # Set CRS if not set

# Plot a sample
gdf[gdf['cvr_number'] == '31373077'].plot()

Join Keys

This DatasetJoin ColumnTarget DatasetTarget Column
fvm_markercvr_numbersubsidiescvr_number
fvm_markerfield_idfield_productionfield_id
fvm_markerblock_idagricultural_blocksblock_id
fvm_markerfield_uuidpesticide_disaggregationfield_uuid
fvm_markermunicipalitydagi_kommunercode
field_productionfield_idnles5_nitrogenfield_id
cadastralbfe_numberproperty_ownersbestemtFastEjendomBFENr

Data Quality Notes

FVM Marker

  • Update frequency: Annual (new year data released ~Q2)
  • Coverage: All registered agricultural fields in Denmark
  • Years available: 2008-2025 (varies by data source)
  • Geometry: WKB format, EPSG:4326

Field Production

  • Update frequency: Annual after harvest statistics
  • Coverage: Production estimates for all registered fields
  • Caveat: Yield estimates are modeled, not measured

Cadastral

  • Update frequency: Weekly
  • Coverage: All cadastral parcels in Denmark
  • Note: Use for property boundaries, not field boundaries

Related Skills

  • okonomi/ - Subsidies linked to fields via CVR and markbloknummer
  • miljo/ - Environmental data at field level (pesticides, nitrogen)
  • husdyr/ - Livestock density per land area

GCS Paths Reference

# List available FVM marker years
gsutil ls gs://$GCS_BUCKET/silver/ | grep fvm_marker

# List field production years
gsutil ls gs://$GCS_BUCKET/gold/ | grep field_production

# List cadastral snapshots
gsutil ls gs://$GCS_BUCKET/silver/cadastral/

# List DAGI municipality data
gsutil ls gs://$GCS_BUCKET/silver/dagi_kommuner/

Yearly Data Pattern

For datasets with yearly data, use this pattern:

# Query specific year
year = 2024
path = f'silver/fvm_marker_{year}/*/data.parquet'

# Query all years (use with caution - large data)
path = 'silver/fvm_marker_*/*/data.parquet'