From Evaluation to Design — A Vector-Similarity Tool for Land-Use Planning
A planning tool I built during my MDR thesis that pairs every parcel with a stronger real-world analogue, turning city-wide land-use evaluation into concrete design prompts.
Cities have plenty of dashboards that tell them which parcels are underperforming. They have far fewer tools that tell them what to do about it. In my MDR thesis at the University of Calgary I built a fiscal–spatial diagnostic for the City of Airdrie that scores every one of its ~25,000 parcels on Return on Investment (ROI) and a Land-Use Fitness Index (LUFI). The diagnostic identifies problems cleanly — but on its own, it never proposes alternatives. Planners were left with a heat-map and no next move.
LUFI closes that gap. The tool turns each parcel into a small numerical "fingerprint" — a 41-dimensional vector that captures the parcel's own ROI, fitness score, and land use, plus the type and distance of its three nearest neighbours. Parcels that play similar roles in the city end up with similar fingerprints. To find a better alternative to any given parcel, the tool just looks for the closest fingerprint among parcels that are actually performing well. It is the same technique behind "find similar images" or product recommendations — applied here to land use.
The tool offers three retrieval modes, each answering a slightly different planning question. Most Similar finds the closest higher-scoring parcel anywhere in the city — useful when a planner just wants to see a stronger analogue, regardless of land-use class. Same-Use Benchmarking restricts results to the same land use as the query (e.g., "show me a better-performing residential parcel"), with a built-in relaxation cascade that loosens constraints only when no perfect match exists. Context-Aware Alternatives goes the opposite direction: it crosses land-use classes and proposes parcels whose surroundings look like the query's, ranking by a composite of similarity, ROI gain, fitness gain, and neighbourhood context.
The original prototype ran in Python with a Streamlit interface and took several seconds per query. The version you're interacting with above is a full client-side port. All 24,797 parcels, their embeddings, and the nearest-neighbour tables are pre-computed by a Python build script and shipped as compact binary files. Every search — cosine similarity over 24,797 normalized vectors — runs in your browser in under 30 ms. There is no server, no database, no cold start. The map you see is the tool.