Methodology and open questions
About the map
What the interactive map shows, where the data comes from, and what the map deliberately does not model. This page is a companion to the 3D explore map so a reader can check the sources, understand the assumptions, and see the project-level open questions that the visualization cannot resolve.
What the map shows
The explore map combines four data layers on a CARTO Positron basemap rendered in MapLibre GL JS:
- Proposed subway corridor: a polyline from Salesforce Transit Center, west along Geary Boulevard, south on 19th Avenue, to Daly City BART. The path follows the corridor described in the SFCTA Geary/19th Avenue Subway Study Update (Feb 2026). The line is illustrative; it does not represent a final alignment.
- Existing rail and future extensions: BART, the Central Subway (T Third), the proposed Central Subway extension, DTX (The Portal), Link21, and Penn Ave Extension are drawn in for context. Each is sourced from publicly available agency project pages.
- Family Zoning Plan height districts: every parcel in San Francisco gets a base height (pre-FZP) and a Local Program height (post-FZP). The map renders the post-FZP heights as 3D extrusions, color-coded by the height bonus the FZP added.
- Likely-to-redevelop parcels: parcels with a non-trivial probability of redeveloping in the next 10 years are highlighted. The "Likely outcome (10-yr)" toggle reweights heights by this probability so the map shows the more realistic version of corridor change rather than the maximum allowed.
Where the data comes from
FZP heights
The height data is fetched directly from the San Francisco Planning Department's public ArcGIS REST endpoint:
https://sfplanninggis.org/arcgiswa/rest/services/PlanningData/MapServer (Layer 5: Height Districts)
That data was republished January 11, 2026, one day before the Family Zoning Plan took effect. Each height polygon is labeled in the form 40//65-R-4, where 40 is the pre-FZP base height in feet, 65 is the post-FZP Local Program height in feet, and R-4 is any applicable condition or overlay. The pre-FZP base height is recovered from that label format, not from a separate dataset, because SF Planning replaced the live dataset rather than versioning it.
The Python pipeline that fetches and processes the data is in this repository, in scripts/fetch_planning_layers.py and scripts/parse_heights.py. The fetch script requires no API key and runs against the public endpoint. Anyone can reproduce the data by running it.
Likely-to-redevelop parcels
Parcel boundaries and the 10-year redevelopment-probability score (pdev_10yr) come from kfarr/zoningviz, an open-source SF zoning data project by Kieran Farr, the creator of 3DStreet. Kieran reached out after our Family Zoning Plan piece on Fogline and shared the redevelopment-probability work he had built. Only parcels with pdev_10yr ≥ 0.05 (about 4,400 parcels citywide) are shown, on the principle that the goal is to surface where change is plausible, not where it is theoretically permitted but operationally unlikely.
Kieran has also produced a 3D walkthrough video showing how the Richmond District corridor might evolve over a 10-year window under the Family Zoning Plan, using the same probability-weighted heights that drive this map's "Likely outcome" toggle:
Corridor and transit lines
Subway corridor and rail-line coordinates were transcribed from SFCTA, BART, and TJPA project documents and refined against OpenStreetMap intersection nodes. The corridor polyline is approximate. Where the corridor follows Geary Boulevard, the line tracks the OSM centerline of Geary Boulevard. Where the corridor crosses major intersections, the line is anchored to verified OSM coordinates for those intersections. None of the line is a final engineered alignment; the project has not produced one.
On the height-accuracy concern
The 3D building heights in the map come directly from the SF Planning data, converted from feet to meters and extruded vertically using MapLibre's fill-extrusion layer at one-to-one scale. There is no compression, no aesthetic flattening, no scaling factor applied to make the rendering look smaller. If a parcel is permitted to 240 feet under the Family Zoning Plan, it renders at 240 feet (73 meters).
What can make the heights look smaller than expected:
- Camera pitch and zoom: at a steep pitch and low zoom, tall buildings get foreshortened by perspective.
- The "Likely outcome (10-yr)" toggle: this mode deliberately reweights heights down to reflect actual redevelopment probability. A parcel permitted to 240 feet with a 20% likelihood-of-redeveloping renders at roughly 48 feet, because 240 × 0.2 = 48. This is intentional and labeled.
- Permitted vs. built: the FZP heights are what is permitted. Existing buildings on the same parcel may be much shorter. The 3D extrusion shows the permitted height, not the current built height, except in the "Likely outcome" mode which blends both.
The source data is the official SF Planning dataset, the same one the city uses for its own zoning lookup tools. The processing scripts are open and reproducible.
What the map deliberately does not model
The map is a snapshot of corridor possibility, not an engineering document. Several things that matter to the actual subway are missing because they have not been decided.
The downtown alignment is not pinned down. The SFCTA Feb 2026 study update presents the eastern terminus as Salesforce Transit Center but does not commit to a specific path from the Tenderloin into that terminus. Whether the line enters via a direct surface-to-tunnel transition near Mission and Beale, or routes through the DTX corridor, or surfaces somewhere else, has not been published. The polyline on the map approximates a corridor centerline; the actual downtown alignment is one of the open questions that the Project Development phase, if authorized in June 2026, is meant to resolve.
The technology choice is not made. The Feb 2026 study presents three technology options: BART-compatible heavy rail (required for the 310,000-rider regional through-running scenario), Muni Metro / light rail, and automated metro (Vancouver-SkyTrain style). The technology decision constrains the alignment, the tunnel diameter, the station spacing, and the operating-cost profile. None of these are reflected in the map; the corridor is shown as a single illustrative line at whatever technology you imagine.
The Market Street tunnel is not shared. The existing BART/Muni four-track tunnel under Market Street is fully occupied. The Geary subway would require a separate downtown tunnel, regardless of the technology chosen. The map shows the existing BART/Muni lines for context but does not imply the Geary line would share any of them. (The Central Subway tunnel is the only existing tunnel that could theoretically be tied in if Geary went light-rail, but that scenario has never been part of the published study.)
Ridership is not modeled. The SFCTA study reports 160,000-180,000 daily trips as an SF-only scenario and up to 310,000 in a regionally connected scenario. Neither number is rendered on the map. The corridor parcels are shown without any travel-demand context. The map shows where the line goes and how dense the corridor could become; it does not show how many people would ride.
How to read this against the dependency board
The project board tracks the conditions the Geary Subway depends on. Several of those conditions are exactly the things this map does not model: downtown alignment, technology choice, ridership scenarios, Link21 regional connection. The map is the geographic surface; the board is the project-management surface. The two are complementary.
Source code and reproducibility
The map is built with MapLibre GL JS 4.7.1 and a CARTO Positron basemap. The data pipeline (fetch from SF Planning ArcGIS, parse heights, simplify geometry, export web GeoJSON) is in the parent zoning repository at scripts/fetch_planning_layers.py, scripts/parse_heights.py, and scripts/make_3d_map.py. The parcel-likelihood data comes from Kieran Farr's kfarr/zoningviz.
If you find an error in the heights, the corridor, or any of the other layers, send a primary-source correction to hello@foglinesf.com and I will fix it.