Sandbox — LSD is in active testing. All systems operational·payments are test-mode (no real charges).
Overview Use Cases News Docs Tool Store Support Community Get LSD
Use cases/ GIS/ Joining 80k parcels to zoning without a single script
80,000 parcels recolored by zoning conflict over the styled base map replace with screenshot · 1600 × 900

Joining 80k parcels to zoning without a single script

Drop a parcels Shapefile on the canvas, pull the zoning polygons live from PostGIS, reproject both to one CRS, and spatially join them — 80,000 parcels tagged with their zone in seconds. Parcels that straddle two zones flag themselves on the map. Export styled layers and a clean table for the planning team, then re-run the whole thing when the zoning database changes.

Intermediate ⏱ 25 min parcelszoningspatial-joinpostgisreprojection

The join nobody wants to own#

Ask who owns the parcels-to-zoning join and everyone points at someone else. It usually lives in a geopandas notebook a contractor wrote, half a dozen reprojection calls deep, that breaks the moment the zoning table grows a new column. Meanwhile the planning team just wants a spreadsheet that says which parcels sit in which zone and which ones straddle a zone line. On the canvas that's a handful of live nodes, and the answer is always current.

What you'll need#

A parcels Shapefile from your county's cadastre — ours is about 80,000 lots — and read access to the PostGIS instance holding the zoning polygons. That's all: no geopandas, no shapely, no SQL beyond picking a table from a dropdown. If you don't have a PostGIS box handy, the bundled sample connection serves the same zoning layer so you can follow along.

When zoning changes#

Councils rezone. When the zoning table gets updated in PostGIS, you don't rebuild anything — the @load node reads it live, the reproject and spatial join recompute from cache, and the conflict flags shift on their own. Re-export and the planning team gets a fresh table the same afternoon, without a single line of code changing hands.

Step by step

How it's built

  1. #054 · Load 01

    Drop the parcels on the canvas

    Drag the county parcels Shapefile — all 80,000 polygons — onto the canvas. The @load node reads the geometry and the full attribute table without choking, and the preview draws every lot colored by its current land-use code. The inspector shows the file's CRS so you know exactly what you're reprojecting from.

    All 80,000 parcel polygons previewed on the canvas, colored by land-use code replace with screenshot · 1200 × 750
  2. 02

    Pull zoning live from PostGIS

    Add a second @load node pointed at your PostGIS connection and pick the zoning table from the dropdown. LSD pulls the polygons live with their geometry and SRID intact, so you're joining against the planning database of record, not a stale export. The two layers preview together, already stacked in map space.

    Zoning polygons loaded live from PostGIS, stacked over the parcels replace with screenshot · 1200 × 750
  3. 03

    Reproject both layers to one CRS

    The parcels arrive in a state-plane CRS and the zoning table in web mercator, so add a @shape reproject node and set both to a shared EPSG code. The preview snaps the layers into exact alignment, and every downstream step inherits the new projection automatically. The reprojected layers cache, so the join never warps geometry twice.

    Parcels and zoning snapping into alignment after reprojection replace with screenshot · 1200 × 750
  4. #055 · Shape 04

    Spatially join parcels to zones

    Chain a spatial-join node and set the predicate to intersects, matching each parcel to the zoning polygon it falls in. LSD tags all 80,000 parcels with their zone code in one pass, and the preview recolors the map by zone as the join completes. The joined layer is a cached intermediate the rest of the canvas reuses.

    Parcels recolored by joined zone code across the county replace with screenshot · 1200 × 750
  5. #056 · Shape 05

    Flag the boundary conflicts

    Add a filter node that flags any parcel intersecting more than one zone — the boundary straddlers the planning team actually cares about. The map lights those lots up in red while clean matches fade back, and the live count tells you exactly how many need review. Drag the overlap tolerance to ignore slivers from imperfect edges.

    Boundary-straddling parcels flagged red with the live conflict count replace with screenshot · 1200 × 750
  6. #057 · Deliver 06

    Style the map and export the table

    Style the joined layer with a zone-color palette, then wire a @deliver node that writes styled Shapefile layers plus a clean parcel-to-zone table. Export drops the layers for GIS and a flat CSV the planning team can open in a spreadsheet — parcel ID, zone, and conflict flag, no geometry. When the zoning table updates in PostGIS, re-run and both exports refresh.

    Export node writing styled Shapefile layers and a clean parcel-to-zone CSV replace with screenshot · 1200 × 750
The pipeline

Every step used, at a glance

Load

Parcels & zoning

Read an 80k-parcel Shapefile and pull the zoning polygons live from the PostGIS planning database.

ShapefilePostgreSQL
Shape

Reproject, join & flag

Reproject both layers to one CRS, spatially join parcels to zones, and flag boundary conflicts.

Deliver

Styled layers & clean table

Export zone-styled map layers and a flat parcel-to-zone table for the planning team.

ShapefileCSV
80k parcels
joined to zoning in one pass
0 scripts
no PostGIS SQL, no geopandas
Live from PostGIS
joined against the database of record

More use cases