Key Takeaways:
- Before any location gets scored or ranked, it first has to clear a plainer test: is it undeveloped, large enough, near enough people, and zoned for what you want to build there
- That's a filtering problem across four normally separate data layers, parcels, buildings, population and zoning, not a scoring problem, and it needs solving first
- A worked example: parcels above 2,000 m², no existing building footprint, at least 15,000 people within a defined radius, and an FNP or B-Plan designation that actually permits the intended use
- Excluding hazard zones (flood, in this example) belongs in the same filter pass, not as an afterthought once a shortlist already exists
- The output is a shortlist that still needs a formal §34/§35 or Bebauungsplan check before anyone commits capital, and only then does a ranking or scoring model make sense to run against it
Most site-selection advice starts from a list of candidate sites and asks how to rank them. That skips the harder, earlier question: does a large enough, empty, legally buildable site even exist where you're looking? Answering that means combining four data layers that normally live in separate systems, cadastral parcels, building footprints, population, and zoning permissibility, into one filter pass. This post walks through building that filter, using a concrete example: finding undeveloped parcels large enough for a public EV charging hub, near enough people and traffic to justify it, where zoning actually allows it.
What does "buildable and undeveloped" actually require checking?
Four separate questions have to resolve together before a site clears this filter, and any one of them failing removes the site from the shortlist regardless of how well it scores on the others:
- Is it actually undeveloped? A parcel with an existing building on it is a redevelopment case, not a greenfield one, and the two need very different underwriting
- Is it big enough? A parcel below your minimum footprint doesn't clear the bar no matter how well-located it is
- Is there enough population nearby? Facilities that need staff, customers or delivery density need people within reach, not just land
- Does zoning actually permit the use you have in mind? A large, empty, well-populated parcel zoned for agriculture or conservation isn't a candidate; it's a dead end with good demographics
Each of those questions has its own data layer behind it. The filter is the work of running them together instead of one at a time.
Step 1: Define the search region and the population threshold
Start with the geography you're actually screening, a state, a radius around existing sites, or a set of candidate metro areas, and a population threshold that reflects what the facility actually needs nearby. For a worked example here, take public EV charging: charging deserts are, by definition, places where too few people have a plug within reach, so a search region of interest paired with a requirement that at least 15,000 people live within a defined radius of any candidate parcel, using Mapular's demographic layer joined against the same geometry model as everything else in this workflow, is exactly how you'd start closing one.
This step alone eliminates most of the map before you've touched a single parcel, which is the point: population is cheap to check and expensive to skip, since a perfectly zoned, perfectly empty parcel in the wrong place still doesn't clear a real business requirement.
Step 2: Filter parcels by size and the absence of an existing building
Within what's left of the search region, query ALKIS parcel data for parcels above your minimum size, 2,000 m² in this example, enough for a handful of charging bays, a canopy and room to queue, and cross-reference each candidate against building footprints (from ALKIS itself or the LOD2 3D building layer) to exclude anything that already carries a structure. A parcel that passes both checks is a genuine greenfield candidate: large enough to be worth developing, and not already spoken for by an existing building.
This is exactly the kind of query that a browsable interface struggles with at scale and a schema built for filtering handles natively: "parcels over 2,000 m² with no building footprint" is a single, repeatable query against harmonised geometry, not a manual scan across dozens of individual parcel lookups.
Step 3: Overlay zoning permissibility
Every parcel that survives step 2 still needs a zoning answer before it's a real candidate. Check each one against the Bebauungsplan layer first: where a B-Plan exists and designates the area for a compatible use, Sondergebiet or Gewerbegebiet for this example, both of which commonly permit charging and fuel-adjacent infrastructure, with GRZ headroom that actually fits your footprint, the parcel is buildable today, not just in principle.
Where no B-Plan exists, check the Flächennutzungsplan layer instead: an FNP designation of Gewerbliche Baufläche signals municipal intent even without binding rules yet, which is a materially different, weaker signal than an actual B-Plan, and should be tagged as such rather than treated identically in the output. Parcels with neither a compatible B-Plan nor a compatible FNP designation drop out of the shortlist here, regardless of size or population.
Step 4: Exclude hazard zones
Run the surviving candidates against relevant risk layers before calling the shortlist final, flood hazard zones for this example, using the same flood hazard layer covered elsewhere on this blog. A parcel that's undeveloped, correctly sized, well-populated and correctly zoned but sits inside an HQ100 flood zone is not a clean candidate; it's a candidate with a cost and a conversation attached, and that needs to be visible in the output rather than discovered later.
Whether a flagged hazard removes a parcel outright or just tags it for a closer look depends on your risk tolerance and use case, but the check belongs in this same pass, not as a separate step run only against whatever survives everything else.
Step 5: Review what's left, attribute by attribute
What comes out of steps 1 through 4 is a shortlist, not a final answer, and every parcel on it should carry its full attribute trail: parcel ID and area from ALKIS, plan ID and legal status from whichever zoning layer applied, the population figure that qualified it, and any hazard flag from step 4. That's the difference between a shortlist someone can act on and a shortlist someone has to re-verify from scratch before trusting it.
Where does this fit relative to ranking the sites you find?
This filter answers a different, earlier question than a scoring or ranking model does. Ranking assumes you already have a set of viable candidates and asks which one is best, weighing catchment strength, competitor density, foot traffic and similar factors against each other. This workflow answers whether a viable candidate set exists at all, and hands a ranking model something worth scoring instead of a list padded with sites that were never actually buildable. Run this filter first; run a ranking pass second, on whatever survives it.
Every parcel that clears this filter still needs a formal permit-level check, a Bebauungsplan reading exact enough to sign off on, or a §34/§35 BauGB assessment where no B-Plan exists, before anyone commits capital. The filter narrows a whole region to a defensible shortlist; it doesn't replace due diligence on the sites that make it through.
Where to go from here
Every layer this workflow depends on, parcels, buildings, zoning, demographics and hazard zones, ships in the same harmonised model with exact per-state coverage stated openly in the geospatial data catalog. Whether you build this as a one-off search in Mapular Explorer or as a repeatable query against the GIS, CAD or BI-ready delivery, the underlying schema is the same, so the filter you build once keeps working as you point it at a new region. For the demand side of this specific example, where Europe's public charging network is thinnest is the map worth screening against first.



