Skip to content

plot-finder

Find land parcels across Europe by id, address or coordinates โ€” one API, one object.

plot-finder wraps the official open cadastre of each supported country behind a single Plot class. You pick the country, pass a query, and get back a normalized parcel with geometry, area, centroid and country-specific attributes.

from plot_finder import Plot

plot = Plot(country="PL", plot_id="141201_1.0001.6509")
plot.voivodeship   # 'mazowieckie'  โ€” country attribute (from the Poland class)
plot.area          # 6509.0         โ€” shared, computed from geometry
plot.centroid      # (x, y)

Supported countries

Coordinates are lon/lat (EPSG:4326) everywhere; geometry is returned in EPSG:4326 by default (set srid= for another output CRS).

Country country Attribute class Data source Coordinates
Poland ๐Ÿ‡ต๐Ÿ‡ฑ "PL" Poland ULDK / GUGiK lon/lat (EPSG:4326)
France ๐Ÿ‡ซ๐Ÿ‡ท "FR" France IGN apicarto cadastre lon/lat (EPSG:4326)
Spain ๐Ÿ‡ช๐Ÿ‡ธ "ES" Spain Direcciรณn General del Catastro lon/lat (EPSG:4326)
Netherlands ๐Ÿ‡ณ๐Ÿ‡ฑ "NL" Netherlands PDOK Kadaster lon/lat (EPSG:4326)
Switzerland ๐Ÿ‡จ๐Ÿ‡ญ "CH" Switzerland swisstopo / geo.admin.ch lon/lat (EPSG:4326)
Estonia ๐Ÿ‡ช๐Ÿ‡ช "EE" Estonia Maa-amet lon/lat (EPSG:4326)
Cyprus ๐Ÿ‡จ๐Ÿ‡พ "CY" Cyprus DLS (Lands & Surveys) lon/lat (EPSG:4326)
Lithuania ๐Ÿ‡ฑ๐Ÿ‡น "LT" Lithuania Registrลณ centras (geoportal.lt) lon/lat (EPSG:4326)
Latvia ๐Ÿ‡ฑ๐Ÿ‡ป "LV" Latvia VZD (kadastrs.lv) lon/lat (EPSG:4326)
Portugal ๐Ÿ‡ต๐Ÿ‡น "PT" Portugal DGT SNIC lon/lat (EPSG:4326)
Slovenia ๐Ÿ‡ธ๐Ÿ‡ฎ "SI" Slovenia GURS (e-prostor) lon/lat (EPSG:4326)
Italy ๐Ÿ‡ฎ๐Ÿ‡น "IT" Italy Agenzia delle Entrate lon/lat (EPSG:4326)
Germany ๐Ÿ‡ฉ๐Ÿ‡ช "DE" Germany state ALKIS / INSPIRE (10 states) lon/lat (EPSG:4326)
Norway ๐Ÿ‡ณ๐Ÿ‡ด "NO" Norway Kartverket (Matrikkelen) lon/lat (EPSG:4326)
Denmark ๐Ÿ‡ฉ๐Ÿ‡ฐ "DK" Denmark DAWA / SDFI (Matriklen) lon/lat (EPSG:4326)
Belgium ๐Ÿ‡ง๐Ÿ‡ช "BE" Belgium FPS Finance CadGIS lon/lat (EPSG:4326)

Installation

pip install plot-finder

Requirements: Python 3.10+ ยท pydantic httpx shapely pyproj

How it works

country is required and selects which cadastre to query. Every country has a matching class in plot_finder.countries (Poland, France, Spain, Netherlands) that:

  1. defines the country-specific attributes (e.g. voivodeship, department),
  2. knows how to fetch a parcel from that country's API.

The Plot sources those attributes from the matching class and exposes them flat, next to the shared fields:

Plot(country="FR", x=-0.5792, y=44.8378).department   # from the France class
Plot(country="ES", x=-3.6999, y=40.4211).province      # from the Spain class

Three ways to query

Every country supports the same three entry points (details and formats differ per country โ€” see each page):

Plot(country="PL", plot_id="...")                 # by cadastral id / reference
Plot(country="PL", x=639231, y=486743)            # by coordinates
Plot(country="PL", address="Warszawa, ...")       # by address (geocoded)

Addresses are geocoded with OpenStreetMap Nominatim; you must provide at least one of plot_id, address, or both x and y.

Shared properties

Regardless of country, every Plot exposes:

Property Type Description
geojson dict Geometry as GeoJSON
area float Geodesic area in mยฒ (WGS84 ellipsoid)
centroid (float, float) Centroid of the geometry
bbox (float, float, float, float) Bounding box (minx, miny, maxx, maxy)

Coordinate systems

Input coordinates are lon/lat (EPSG:4326) for every country. Geometry is returned as geojson in EPSG:4326 by default; set srid for another output CRS:

Plot(country="PL", x=21.0122, y=52.2297)             # geometry in EPSG:4326
Plot(country="PL", x=21.0122, y=52.2297, srid=2180)  # geometry in EPSG:2180

Serialization

Plot is a Pydantic v2 model, so a parcel round-trips to plain data:

plot.model_dump()        # flat dict: common fields + country attributes + computed props
plot.model_dump_json()   # JSON string

Errors

from plot_finder import (
    PlotNotFoundError,     # no parcel for the given query
    AddressNotFoundError,  # geocoder returned no result
    ULDKError,             # Poland (ULDK) API failure
    IGNError,              # France (IGN) API failure
    CatastroError,         # Spain (Catastro) API failure
    KadasterError,         # Netherlands (PDOK Kadaster) API failure
    GeoAdminError,         # Switzerland (geo.admin.ch) API failure
    MaaametError,          # Estonia (Maa-amet) API failure
    DLSError,              # Cyprus (DLS) API failure
    RCError,               # Lithuania (geoportal.lt) API failure
    VZDError,              # Latvia (VZD) API failure
    DGTError,              # Portugal (DGT SNIC) API failure
    GURSError,             # Slovenia (GURS) API failure
    AdEError,              # Italy (Agenzia delle Entrate) API failure
    ALKISError,            # Germany (state ALKIS) API failure
    KartverketError,       # Norway (Kartverket) API failure
    DAWAError,             # Denmark (DAWA / SDFI) API failure
    CadGISError,           # Belgium (FPS Finance CadGIS) API failure
)

See the reference for the full field list and model details.