$ Atlas · Tech Stack
The real technology choices behind the spatial join, and what’s genuine GIS work versus a lighter-weight stand-in for a production GIS stack.
## TECH_STACK
| Layer | Choice | Why |
|---|---|---|
| Backend | FastAPI, Python | Same framework as this site’s own api/, kept as a genuinely separate service rather than shared — the point is proving the isolation convention’s heavy-dependency trigger, not reusing infrastructure. |
| Spatial join | Shapely (in-memory STRtree) | A genuine point-in-polygon index at real request time — the actual GIS work this piece exists to prove, not pins dropped on a map and called “GIS.” |
| Boundary ingestion | GeoPandas (one-time script) | A lighter-weight stand-in role, not a runtime dependency: reprojection, simplification, and the population-density join all happen once, locally, before this piece ever ships. |
| Database | Postgres | Tracked buildings and their records — ordinary relational data, matching this site’s existing Postgres pattern. No PostGIS extension; see Design Notes for why. |
| Map | Leaflet / react-leaflet | No API key or vendor account needed, unlike Mapbox — the standard, well-documented choice for rendering clustered markers and a real GeoJSON polygon overlay. |
## WHAT_MAKES_THIS_REAL_GIS
The distinction that matters: Shapely’s in-memory STRtreeis a real spatial index queried on every request, not a decorative map. GeoPandas, by contrast, never runs in the deployed service at all — it’s a one-time local ingestion tool, the same “heavy/native dependency kept out of the shared runtime” pattern this site’s portfolio-piece isolation convention exists to describe.
