@kahwee/sf-map-svg 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/README.md +96 -6
- package/SOURCES.md +18 -1
- package/dist/data/README.md +11 -1
- package/dist/data/catalog.json +3 -3
- package/dist/data/guide/bart-stations.json +1 -0
- package/dist/data/guide/coast.json +1 -0
- package/dist/data/guide/highways-detailed.json +1 -0
- package/dist/data/guide/highways.json +1 -0
- package/dist/data/guide/key-roads.json +1 -0
- package/dist/data/guide/landmarks.json +1 -0
- package/dist/data/guide/neighborhoods-realtor.json +1 -0
- package/dist/data/key-roads.json +3837 -6741
- package/dist/data/types.d.ts +1 -0
- package/dist/src/custom-map.d.ts +3 -0
- package/dist/src/custom-map.js +1 -0
- package/dist/src/explorer-core.d.ts +5 -0
- package/dist/src/explorer-core.js +1085 -0
- package/dist/src/explorer-data.d.ts +9 -0
- package/dist/src/explorer-data.js +1 -0
- package/dist/src/explorer.d.ts +2 -2
- package/dist/src/explorer.js +28 -959
- package/dist/src/guide.d.ts +10 -0
- package/dist/src/guide.js +107 -0
- package/dist/src/index.d.ts +5 -6
- package/dist/src/index.js +12 -116
- package/dist/src/interactive-data.d.ts +6 -0
- package/dist/src/interactive-data.js +5 -0
- package/dist/src/interactive.d.ts +1 -1
- package/dist/src/layers.js +6 -1
- package/dist/src/map-core.d.ts +55 -0
- package/dist/src/map-core.js +132 -0
- package/dist/src/overlays.d.ts +1 -0
- package/dist/src/types.d.ts +22 -0
- package/package.json +16 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,27 @@ User-visible changes are recorded here. Unreleased entries describe changes on `
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
- Add a lightweight guide map preset with subpixel overview geography, lazy detailed datasets, curated highways and streets, independent road labels, and smaller consumer bundle size.
|
|
8
|
+
- Curate six guide streets and prioritize their visibility by zoom while preserving road geometry across park fills.
|
|
9
|
+
|
|
10
|
+
- Validate SVG overlay numeric attributes and add an interactive data-injected entry point so consumers can provide only the geographic datasets they use.
|
|
11
|
+
|
|
12
|
+
- Make the measures atlas a full-screen map with floating controls, expandable mobile results, touch pan/zoom, overlay tables and sources, and a distraction-free focus view.
|
|
13
|
+
|
|
14
|
+
- Redesign the measures explorer around visible district maps, side-by-side comparisons, Yes/No and district-color modes, keyboard zoom/pan, district fitting, stable labels, and SVG/CSV exports.
|
|
15
|
+
|
|
16
|
+
- Add a Pages ballot-measures explorer for certified June 2026 local results, with district comparisons, shareable selections, and official data downloads.
|
|
17
|
+
|
|
18
|
+
- Build public Pages demos and SVG downloads from the published npm version, with visible release metadata, installation copying, release links, and social previews.
|
|
19
|
+
- Refresh Pages after successful publishing and improve mobile layout and release documentation.
|
|
20
|
+
|
|
21
|
+
## 1.2.0
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- Add `@kahwee/sf-map-svg/custom-map`, a data-injected renderer entry point that lets consumers bundle only the geographic datasets they provide.
|
|
26
|
+
- Add public styled geographic overlays, explorer theme tokens, configurable labels, and optional controls.
|
|
27
|
+
|
|
7
28
|
## 1.1.0
|
|
8
29
|
|
|
9
30
|
### Added
|
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# San Francisco SVG maps
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@kahwee/sf-map-svg)
|
|
4
|
+
|
|
3
5
|
[Explore the live map](https://kahwee.github.io/sf-map-svg/) · [Data guide](data/README.md) · [Geographic sources](SOURCES.md) · [Contributing](CONTRIBUTING.md)
|
|
4
6
|
|
|
5
7
|
Self-contained SVG maps of San Francisco, with precise coastlines, soft district colors, parks, roads, BART stations, and searchable neighborhoods. Render static SVGs in Node or add an interactive map to a browser. All geometry is bundled; there are no runtime dependencies, map tiles, API keys, or external data requests.
|
|
@@ -17,8 +19,12 @@ Use Node 22.12+ for server-side rendering. Browser components need a DOM and a b
|
|
|
17
19
|
| Start with | Entry point | What you get |
|
|
18
20
|
| --- | --- | --- |
|
|
19
21
|
| Static SVG | `@kahwee/sf-map-svg` | SVG markup, projection helpers, optional layers |
|
|
22
|
+
| Data-injected SVG | `@kahwee/sf-map-svg/custom-map` | Tree-shakeable renderer core with only the geographic data you provide |
|
|
20
23
|
| Neighborhood explorer | `@kahwee/sf-map-svg/explorer` | Search, source selection, map controls, GeoJSON downloads |
|
|
21
24
|
| Interactive map | `@kahwee/sf-map-svg/interactive` | Embeddable map and controls without the explorer sidebar |
|
|
25
|
+
| Data-injected interactive map | `@kahwee/sf-map-svg/interactive-data` | Interactive shell without bundled geographic JSON |
|
|
26
|
+
| Lightweight guide map | `@kahwee/sf-map-svg/guide` | Curated overview geography, with detailed data loaded explicitly |
|
|
27
|
+
| Animated transit demo | `@kahwee/sf-map-svg/transit` | Optional, schematic BART journey with playback controls |
|
|
22
28
|
| Geographic data | `@kahwee/sf-map-svg/data` | Source-aware lookup and canonical GeoJSON |
|
|
23
29
|
|
|
24
30
|
## Render a static map
|
|
@@ -38,6 +44,73 @@ const svg = renderSFMap({
|
|
|
38
44
|
await writeFile('san-francisco.svg', svg);
|
|
39
45
|
```
|
|
40
46
|
|
|
47
|
+
For smaller browser bundles, import `createSFMapWithData` from
|
|
48
|
+
`@kahwee/sf-map-svg/custom-map` and pass only the geographic assets your map uses.
|
|
49
|
+
That entry point does not import the package's built-in JSON collections. Its `SFMapData`
|
|
50
|
+
requires the coast and accepts selected district vintages plus optional neighborhood,
|
|
51
|
+
road, park, and station arrays. Use the canonical JSON subpaths documented in
|
|
52
|
+
[`data/README.md`](data/README.md) as source; map each feature collection to the
|
|
53
|
+
corresponding `SFMapData` records. The root entry remains convenient and includes the
|
|
54
|
+
built-in datasets for backward compatibility.
|
|
55
|
+
|
|
56
|
+
The same split is available for browser controls with
|
|
57
|
+
`@kahwee/sf-map-svg/interactive-data`. Pass an `InteractiveSFMapData` object containing
|
|
58
|
+
`map` (the `SFMapData` used by the static renderer) and only the neighborhood collections
|
|
59
|
+
you want available. This keeps alternative neighborhood sources, unused district vintages,
|
|
60
|
+
and optional layers out of that entry's bundle. The normal `/interactive` entry retains its
|
|
61
|
+
built-in datasets and synchronous source switching.
|
|
62
|
+
|
|
63
|
+
For the curated guide map, import `@kahwee/sf-map-svg/guide`. Its overview preset contains
|
|
64
|
+
only the simplified coastline, SFAR areas, major parks, BART points, US 101 / I-280 /
|
|
65
|
+
Highway 1, and Market, Van Ness, Geary, Lombard, 19th Avenue, and the Embarcadero. It does
|
|
66
|
+
not import historical districts, other neighborhood sources, or the full street network.
|
|
67
|
+
Collision-filtered neighborhood labels are enabled by default. Road geometry and road labels
|
|
68
|
+
have independent `layers.keyRoads` and `layers.roadLabels` controls. Lombard geometry and its
|
|
69
|
+
label appear after 1.8× zoom; major street labels can appear at city scale in a smaller type size.
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { createGuideMap, loadGuideDetailedData } from '@kahwee/sf-map-svg/guide';
|
|
73
|
+
import { createInteractiveSFMapWithData } from '@kahwee/sf-map-svg/interactive-data';
|
|
74
|
+
|
|
75
|
+
const map = createGuideMap({ layers: { roadLabels: false } });
|
|
76
|
+
document.querySelector('#map')!.append(map);
|
|
77
|
+
|
|
78
|
+
// Load only when the user asks for closer geographic detail.
|
|
79
|
+
const detailedData = await loadGuideDetailedData();
|
|
80
|
+
const detailedMap = createInteractiveSFMapWithData(detailedData, {
|
|
81
|
+
mode: 'neighborhoods',
|
|
82
|
+
layers: { highways: true, keyRoads: true, roadLabels: true },
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Run `pnpm data:guide` to rebuild the subpixel overview geometries from canonical files.
|
|
87
|
+
`docs/guide-bundle-report.md` records compressed bundle sizes and verifies the included data.
|
|
88
|
+
|
|
89
|
+
```js
|
|
90
|
+
import coast from '@kahwee/sf-map-svg/data/coast.json' with { type: 'json' };
|
|
91
|
+
import realtor from '@kahwee/sf-map-svg/data/neighborhoods-realtor.json' with { type: 'json' };
|
|
92
|
+
import { createInteractiveSFMapWithData } from '@kahwee/sf-map-svg/interactive-data';
|
|
93
|
+
|
|
94
|
+
const map = createInteractiveSFMapWithData(
|
|
95
|
+
{
|
|
96
|
+
map: { coast: coast.features[0].geometry },
|
|
97
|
+
neighborhoods: { realtor },
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
layers: {
|
|
101
|
+
districtFills: false,
|
|
102
|
+
districtLines: false,
|
|
103
|
+
districtLabels: false,
|
|
104
|
+
landmarks: false,
|
|
105
|
+
bartStations: false,
|
|
106
|
+
highways: false,
|
|
107
|
+
keyRoads: false,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
document.querySelector('#map').append(map);
|
|
112
|
+
```
|
|
113
|
+
|
|
41
114
|
Embed the returned SVG markup directly in a page; in Astro, use `<div set:html={svg} />`. User-supplied text and attributes are XML escaped. Use a distinct `idPrefix` for each map when combining independently rendered SVGs.
|
|
42
115
|
|
|
43
116
|
## Static options
|
|
@@ -57,7 +130,8 @@ Embed the returned SVG markup directly in a page; in Astro, use `<div set:html={
|
|
|
57
130
|
| `width`, `height` | `800`, `800` | SVG viewBox and intrinsic size |
|
|
58
131
|
| `padding` | `28` | Space around the coast |
|
|
59
132
|
| `markers` | `[]` | Points with `id`, `lng`, `lat`, optional `label`, `color`, `selected` |
|
|
60
|
-
| `keyRoads` | `false` |
|
|
133
|
+
| `keyRoads` | `false` | Six selected street corridors: Market, Van Ness, Geary, Lombard, 19th Avenue, and the Embarcadero |
|
|
134
|
+
| `roadLabels` | Same as `keyRoads` | Road labels independently of their geometry |
|
|
61
135
|
| `colors` | Built-in palette | Override `water`, `land`, `district`, `neighborhood`, `highway`, `road`, `park`, `landmark`, `bart`, `label`, `marker`, `selected` |
|
|
62
136
|
| `title` | `San Francisco map` | Accessible SVG title |
|
|
63
137
|
| `idPrefix` | Unique per process | Set explicitly for deterministic output or independent server renders |
|
|
@@ -68,7 +142,7 @@ For a plain outline map, set `districtFills: false`. Neighborhood areas are **Au
|
|
|
68
142
|
|
|
69
143
|
Use `theme: 'transit'` for pale water, ivory land, green parks, and blue BART symbols. Custom `colors` override the preset. Park and station overlays represent current source geography, independently of the district year; stations outside San Francisco, including Daly City, are excluded.
|
|
70
144
|
|
|
71
|
-
`keyRoads: true` adds
|
|
145
|
+
`keyRoads: true` adds the six curated orientation streets using DataSF centerlines. These are orientation features, not routing guidance. The lightweight guide shows primary corridors at city scale and Lombard after zooming.
|
|
72
146
|
|
|
73
147
|
|
|
74
148
|
## Neighborhood explorer
|
|
@@ -146,9 +220,9 @@ aliases. Import types including `InteractiveSFMapOptions`, `InteractiveSFMapElem
|
|
|
146
220
|
| `source` | `realtor` | `realtor`, `sf-find`, or `analysis`; explicit source recommended for reusable integrations |
|
|
147
221
|
| `theme` | `transit` | `transit` or `districts` |
|
|
148
222
|
| `year` | `2022` | District vintage: 2002, 2012, or 2022 |
|
|
149
|
-
| `layers` | Mode defaults | Independent booleans: `districtFills`, `districtLines`, `districtLabels`, `neighborhoodLines`, `neighborhoodLabels`, `landmarks`, `bartStations`, `highways`, `keyRoads` |
|
|
223
|
+
| `layers` | Mode defaults | Independent booleans: `districtFills`, `districtLines`, `districtLabels`, `neighborhoodLines`, `neighborhoodLabels`, `landmarks`, `bartStations`, `highways`, `keyRoads` (geometry), `roadLabels` |
|
|
150
224
|
| `labels` | `true` | Master visible-text switch; accessible descriptions and station symbols remain |
|
|
151
|
-
| `labelSize` | `{ min: 11, max: 12 }` |
|
|
225
|
+
| `labelSize` | `{ min: 11, max: 12 }` | Neighborhood and other labels use this screen-pixel range (8–32 allowed); road labels stay smaller at 9px, capped by `max`. Sizes never grow with zoom |
|
|
152
226
|
| `selectableNeighborhoods` | `true` | Enables pointer/keyboard selection; false retains geography and labels |
|
|
153
227
|
| `neighborhood` | Unset | Initial name, alias, or ID in the selected source |
|
|
154
228
|
| `fitPadding` | `24` | Screen pixels, number or `{ top, right, bottom, left }`, used by selection and geometry fitting after mounting |
|
|
@@ -156,6 +230,10 @@ aliases. Import types including `InteractiveSFMapOptions`, `InteractiveSFMapElem
|
|
|
156
230
|
| `markerRadius` / `markerHitSize` | `6` / `44` | Screen-pixel visible radius and tap-target diameter, independent of zoom; selected radius grows by 2px |
|
|
157
231
|
| `markerColor` / `selectedMarkerColor` | `#245b61` / `#f04f32` | Default marker colors; individual `marker.color` overrides the unselected color |
|
|
158
232
|
| `onMarkerActivate` | Unset | Called when a non-null marker selection changes, including programmatic changes |
|
|
233
|
+
| `overlays` | `[]` | GeoJSON line or polygon overlays with stable IDs and optional SVG styles |
|
|
234
|
+
| `style` | Built-in tokens | Explorer CSS tokens: `ink`, `surface`, `accent`, `border`, `focus`, `controlGap`, `font` |
|
|
235
|
+
| `strings` | English defaults | Replace visible map labels and gesture help for localization |
|
|
236
|
+
| `controls` | All enabled | Independently hide `zoom`, `pan`, `reset`, `labels`, `touch`, or `legend`; source attribution remains visible |
|
|
159
237
|
|
|
160
238
|
Explicit layer options override mode defaults even after `setMode()`. District fills, outlines,
|
|
161
239
|
and badges can therefore be composed with neighborhood names without requiring district
|
|
@@ -201,6 +279,11 @@ unknown identities. `getSelection()` and `getSelectedMarker()` read current sele
|
|
|
201
279
|
when needed. `setMode(mode)` resets the viewport. Repeating the same viewport or selection
|
|
202
280
|
emits no change event, avoiding state feedback loops. All events bubble. Call `destroy()`
|
|
203
281
|
before removing the element to release listeners, observers, frames, and download URLs.
|
|
282
|
+
`setOverlays(overlays)` replaces all consumer overlays; each overlay has a unique `id`,
|
|
283
|
+
WGS84 `LineString`, `MultiLineString`, `Polygon`, or `MultiPolygon` geometry, optional
|
|
284
|
+
`stroke`, `strokeWidth`, `fill`, `fillOpacity`, `visible`, and accessible `label`. Overlays
|
|
285
|
+
track every pan, zoom, resize, and source change and render above geography but below markers.
|
|
286
|
+
They are decorative and do not participate in label collision layout.
|
|
204
287
|
|
|
205
288
|
### Dense markers
|
|
206
289
|
|
|
@@ -301,12 +384,15 @@ synthetic pointer tests do not establish physical-device compatibility.
|
|
|
301
384
|
The [live explorer](https://kahwee.github.io/sf-map-svg/) provides neighborhood search, 2022 district views, SVG examples, and GeoJSON downloads. Its source is in `website/` and uses the public explorer API.
|
|
302
385
|
|
|
303
386
|
```sh
|
|
304
|
-
pnpm build:pages
|
|
387
|
+
pnpm build:pages # local preview
|
|
388
|
+
pnpm build:pages --released # use the current npm release
|
|
305
389
|
python3 -m http.server 8765 --directory pages-dist
|
|
306
390
|
# Open http://localhost:8765
|
|
307
391
|
```
|
|
308
392
|
|
|
309
|
-
The build bundles
|
|
393
|
+
The build bundles assets into `pages-dist/` with relative URLs for GitHub’s project path. Local builds use the working package; deployed builds use npm’s latest stable package for both browser components and SVG downloads. The page shows that version and links to its release notes. `pages-dist/release.json` records the build’s version and source.
|
|
394
|
+
|
|
395
|
+
`.github/workflows/pages.yml` validates and deploys on pushes to `main` and after successful npm publishing. Release-triggered builds wait for registry processing before using the newly published version. Pages deployment does not publish npm packages or releases.
|
|
310
396
|
|
|
311
397
|
## License and attribution
|
|
312
398
|
|
|
@@ -324,3 +410,7 @@ document.querySelector('#transit').append(animation);
|
|
|
324
410
|
This optional browser component starts paused, with Play/Pause and a keyboard-accessible journey slider. A loop lasts 28 seconds; timing is illustrative. It connects the bundled official BART station centroids with straight segments, not actual tracks or live service. It pauses when the page is hidden. No autoplay means reduced-motion users can inspect the static map or scrub manually. Existing map defaults are unchanged.
|
|
325
411
|
|
|
326
412
|
Embed the Pages demo with `<iframe src="https://kahwee.github.io/sf-map-svg/transit.html" title="Schematic BART journey" loading="lazy" style="width:100%;height:clamp(650px, calc(100vw + 240px), 930px);border:0"></iframe>`.
|
|
413
|
+
|
|
414
|
+
## Ballot measures explorer
|
|
415
|
+
|
|
416
|
+
[Explore June 2026 ballot measures](https://kahwee.github.io/sf-map-svg/measures.html): certified local Measures A–D, citywide outcomes, full-screen district maps with floating controls, expandable mobile results, touch pan/zoom, a focus view, side-by-side measure comparisons, Yes/No or original district colors, zoom and district fitting, a sortable comparison table, shareable views, and SVG/CSV/JSON downloads. The page uses the released map renderer and separately bundled official election results. It is an archive, not a live results service or voting guide. Methodology and source links are available on the page and in [SOURCES.md](SOURCES.md).
|
package/SOURCES.md
CHANGED
|
@@ -78,4 +78,21 @@ The cleanup retains all 92 identities, names, and source codes. It uses no round
|
|
|
78
78
|
|
|
79
79
|
## Key road landmarks
|
|
80
80
|
|
|
81
|
-
Downloaded September 26, 2026 (UTC; September 25 in San Francisco) from [DataSF Streets – Active and Retired](https://data.sf.gov/resource/3psu-pn9h.geojson), filtering `active = true` and exact source street names. `data/key-roads.json` groups
|
|
81
|
+
Downloaded September 26, 2026 (UTC; September 25 in San Francisco) from [DataSF Streets – Active and Retired](https://data.sf.gov/resource/3psu-pn9h.geojson), filtering `active = true` and exact source street names. `data/key-roads.json` groups 513 source segments into six explicitly selected streets: Market, Van Ness, Geary, Lombard, 19th Avenue, and the Embarcadero, preserving source coordinates and CNN segment IDs. Geary St and Geary Blvd are grouped under the Geary Blvd display label. These are geographic orientation features, not a complete network or vehicle-access guidance. Label anchors select existing source vertices near editorial targets. Regenerate with `node scripts/import-key-roads.mjs` then `pnpm data:catalog`. The full query and retrieval date are embedded in the JSON. DataSF terms apply.
|
|
82
|
+
|
|
83
|
+
## Lightweight guide geometry
|
|
84
|
+
|
|
85
|
+
On September 26, 2026, `pnpm data:guide` generated `data/guide/*.json` from the canonical coastline, SFAR neighborhood, park, highway, selected-street, and BART files above. The overview omits unused properties and simplifies lines at subpixel tolerance for an approximately 800px city map. Realtor boundaries are simplified as shared arcs and reused on adjacent polygons. Coastline and park overview polygons are simplified independently while preserving ring closure. The guide preset keeps US 101, I-280, Highway 1 and the six named orientation streets. Detailed selected geography loads only when requested. Derived files retain source metadata and source dates; no new geographic source is asserted.
|
|
86
|
+
|
|
87
|
+
## June 2026 ballot measures explorer
|
|
88
|
+
|
|
89
|
+
Downloaded September 26, 2026 from the San Francisco Department of Elections:
|
|
90
|
+
|
|
91
|
+
- Final district workbook: https://sfelections.org/results/20260602/data/20260625/dsov.xlsx
|
|
92
|
+
- Citywide summary, official measure titles, ballot questions, and thresholds: https://sfelections.org/results/20260602/index.html
|
|
93
|
+
- Certification dated June 25, 2026: https://sfelections.org/results/20260602/data/20260625/CertificationLetterJun22026.pdf
|
|
94
|
+
- Final report index: https://sfelections.org/results/20260602w/detail.html
|
|
95
|
+
|
|
96
|
+
`data/elections/2026-06-02.json` contains Measures A–D, their citywide counts, and the 11 `SUP DIST n - Total` rows from workbook sheets 20–23. Each row retains its worksheet row number; metadata retains the workbook SHA-256. `scripts/import-election-results.py` extracts these with openpyxl (ingestion only), checks all district sums including under/overvotes, and cross-checks Yes/No citywide counts against the official HTML summary. Rerun with the downloaded workbook and summary paths. No original Site ballot overlays are reused.
|
|
97
|
+
|
|
98
|
+
The Pages-only explorer calculates Yes / (Yes + No), excluding under/overvotes. Measure A uses the two-thirds threshold; B–D use a strict majority, as stated in the official summary. These are citywide outcomes, not district-level passage decisions. District counts are reported directly by Elections, not spatially assigned to neighborhoods. The existing 2022 district display map is reused unchanged. Election JSON is a separate website dataset, not a new npm package API; no live service or forthcoming-election coverage is claimed.
|
package/dist/data/README.md
CHANGED
|
@@ -16,7 +16,7 @@ The renderer, `neighborhoods` convenience export, and `getNeighborhood` default
|
|
|
16
16
|
| `neighborhoods-realtor.json` | All 92 SFAR areas in the August 2010 dataset |
|
|
17
17
|
| `coast.json` | The renderer's common display coastline |
|
|
18
18
|
| `highways.json` | The original map's highway geometry |
|
|
19
|
-
| `key-roads.json` |
|
|
19
|
+
| `key-roads.json` | Six selected orientation streets with source segment IDs and label anchors |
|
|
20
20
|
| `landmarks.json` | Six selected park/landmark property areas |
|
|
21
21
|
| `bart-stations.json` | Eight San Francisco station points |
|
|
22
22
|
| `catalog.json` | Dataset index and searchable neighborhood metadata without geometry |
|
|
@@ -99,3 +99,13 @@ Edit the canonical JSON only. Keep coordinate precision and source labels; recor
|
|
|
99
99
|
The 92 realtor neighborhoods have disjoint interiors. Shared borders and corner points are allowed. The source contained tiny overlapping boundary slivers; the normalized JSON assigns each such area once using stable-ID order, preserving the combined footprint without rounding or buffering. `topology` records this processing. This guarantee applies within the realtor collection; alternative neighborhood sources and district/park layers describe different concepts and must not be treated as additional mutually exclusive neighborhoods.
|
|
100
100
|
|
|
101
101
|
Run `pnpm data:normalize-realtor` when updating realtor geometry, then `pnpm data:catalog` and `pnpm check`. Cleanup aborts if it would erase a neighborhood, leave overlapping interiors, or change the combined footprint. Tests reject any nonempty polygon intersection; they do not excuse small slivers with an area threshold.
|
|
102
|
+
|
|
103
|
+
## Lightweight guide preset
|
|
104
|
+
|
|
105
|
+
Import `@kahwee/sf-map-svg/guide` for the guide preset. It statically imports only a simplified coastline, simplified SFAR neighborhoods, six major park outlines, selected US 101 / I-280 / Highway 1 segments, six curated streets, and eight BART points. It does not import historical districts, alternate neighborhood sources, or the full catalog. `createGuideMap()` uses this overview by default. `loadGuideDetailedData()` explicitly loads detailed versions of those same selected datasets; it does not add historical or alternative datasets. Regenerate derived geometry with `pnpm data:guide` after updating canonical source files.
|
|
106
|
+
|
|
107
|
+
Neighborhood overview boundaries use a shared coordinate graph: connected boundary arcs are simplified once and retained vertices are applied to all adjacent polygons. The 0.00009 degree tolerance is approximately subpixel at an 800px city map; overview coastline and park geometry use similarly subpixel tolerances. Roads crossing park polygons remain separate overlays and are drawn above park fills. Detailed collections retain their canonical source coordinates.
|
|
108
|
+
|
|
109
|
+
## Election result snapshots (Pages only)
|
|
110
|
+
|
|
111
|
+
`elections/2026-06-02.json` holds certified local-measure results for the June 2026 Pages explorer. It contains four measures, citywide counts, and eleven supervisorial district totals per measure, plus source URLs, workbook checksum, and source row references. It is not a GeoJSON collection or a public npm export. It does not change the default SFAR neighborhood dataset. See `SOURCES.md` and `scripts/import-election-results.py` for extraction and validation.
|
package/dist/data/catalog.json
CHANGED
|
@@ -107,16 +107,16 @@
|
|
|
107
107
|
"id": "key-roads",
|
|
108
108
|
"file": "key-roads.json",
|
|
109
109
|
"title": "Selected San Francisco road landmarks",
|
|
110
|
-
"featureCount":
|
|
110
|
+
"featureCount": 6,
|
|
111
111
|
"definition": {
|
|
112
112
|
"kind": "selected-road-centerlines",
|
|
113
|
-
"description": "
|
|
113
|
+
"description": "Six selected road corridors for orientation, using active DataSF street segments. Geary St and Geary Blvd form one corridor. Not a complete road network or a claim of vehicle access."
|
|
114
114
|
},
|
|
115
115
|
"sources": [
|
|
116
116
|
{
|
|
117
117
|
"id": "datasf-streets",
|
|
118
118
|
"title": "DataSF Streets – Active and Retired",
|
|
119
|
-
"url": "https://data.sf.gov/resource/3psu-pn9h.geojson?%24where=active+%3D+true+AND+streetname+in+%28%27MARKET+ST%27%2C%
|
|
119
|
+
"url": "https://data.sf.gov/resource/3psu-pn9h.geojson?%24where=active+%3D+true+AND+streetname+in+%28%27MARKET+ST%27%2C%27GEARY+BLVD%27%2C%27GEARY+ST%27%2C%27VAN+NESS+AVE%27%2C%27LOMBARD+ST%27%2C%2719TH+AVE%27%2C%27THE+EMBARCADERO%27%29&%24limit=5000&%24order=cnn",
|
|
120
120
|
"retrievedAt": "2026-09-26",
|
|
121
121
|
"licenseUrl": "https://datasf.org/opendata/terms-of-use/"
|
|
122
122
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "type": "FeatureCollection", "schemaVersion": 1, "id": "guide-bart-stations", "title": "San Francisco BART stations", "coordinateSystem": "WGS84 longitude, latitude (EPSG:4326)", "definition": { "kind": "station-centroids", "description": "Eight station centroids within San Francisco. Entrances, tracks, and other cities are excluded." }, "sources": [{ "id": "bart-stations", "title": "BART official geospatial data", "url": "https://www.bart.gov/sites/default/files/2025-12/BART-Stations-tracks-entrances-121025.kmz_.zip", "retrievedAt": "2026-09-25", "licenseUrl": "https://www.bart.gov/schedules/developers/geo" }], "features": [{ "type": "Feature", "id": "embarcadero", "bbox": [-122.3969009943399, 37.79285391372556, -122.3969009943399, 37.79285391372556], "properties": { "name": "Embarcadero" }, "geometry": { "type": "Point", "coordinates": [-122.3969009943399, 37.79285391372556] } }, { "type": "Feature", "id": "montgomery-st", "bbox": [-122.4011747105981, 37.78944952039284, -122.4011747105981, 37.78944952039284], "properties": { "name": "Montgomery St" }, "geometry": { "type": "Point", "coordinates": [-122.4011747105981, 37.78944952039284] } }, { "type": "Feature", "id": "powell-st", "bbox": [-122.4070176588271, 37.78487089662774, -122.4070176588271, 37.78487089662774], "properties": { "name": "Powell St" }, "geometry": { "type": "Point", "coordinates": [-122.4070176588271, 37.78487089662774] } }, { "type": "Feature", "id": "civic-center-un-plaza", "bbox": [-122.4139364152156, 37.77939386076284, -122.4139364152156, 37.77939386076284], "properties": { "name": "Civic Center/UN Plaza" }, "geometry": { "type": "Point", "coordinates": [-122.4139364152156, 37.77939386076284] } }, { "type": "Feature", "id": "16th-st-mission", "bbox": [-122.4197081435103, 37.76505423932072, -122.4197081435103, 37.76505423932072], "properties": { "name": "16th St/Mission" }, "geometry": { "type": "Point", "coordinates": [-122.4197081435103, 37.76505423932072] } }, { "type": "Feature", "id": "24th-st-mission", "bbox": [-122.4184678760468, 37.75223145165559, -122.4184678760468, 37.75223145165559], "properties": { "name": "24th St/Mission" }, "geometry": { "type": "Point", "coordinates": [-122.4184678760468, 37.75223145165559] } }, { "type": "Feature", "id": "glen-park", "bbox": [-122.4337900883829, 37.73311239451952, -122.4337900883829, 37.73311239451952], "properties": { "name": "Glen Park" }, "geometry": { "type": "Point", "coordinates": [-122.4337900883829, 37.73311239451952] } }, { "type": "Feature", "id": "balboa-park", "bbox": [-122.4475873574919, 37.72135058802738, -122.4475873574919, 37.72135058802738], "properties": { "name": "Balboa Park" }, "geometry": { "type": "Point", "coordinates": [-122.4475873574919, 37.72135058802738] } }] }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "type": "FeatureCollection", "schemaVersion": 1, "id": "guide-coast-overview", "title": "Guide coastline overview", "coordinateSystem": "WGS84 longitude, latitude (EPSG:4326)", "definition": { "kind": "display-coast", "description": "Common clipped land mask from the original Site, including Treasure Island and excluding the Farallon Islands." }, "sources": [{ "id": "land-mask", "title": "Display land mask", "url": "https://data.sf.gov/resource/hcgx-vtsb.geojson", "retrievedAt": "2026-09-25", "licenseUrl": "https://datasf.org/opendata/terms-of-use/" }], "features": [{ "type": "Feature", "id": "coast", "bbox": [-122.51494798458785, 37.70813199967883, -122.35696700050588, 37.83242700044341], "properties": { "name": "San Francisco" }, "geometry": { "type": "MultiPolygon", "coordinates": [[[[-122.42562247656319, 37.70831616007394], [-122.429841781, 37.708530291], [-122.44739779795987, 37.708244536132455], [-122.44815957533682, 37.70851693846695], [-122.44863415082004, 37.70824043161256], [-122.45346848640251, 37.708224708322334], [-122.453608348, 37.708484936], [-122.45435151804031, 37.708231999635046], [-122.502777262504, 37.70813299958074], [-122.50603890139797, 37.71908906073846], [-122.50804576033174, 37.729755436802975], [-122.50872381952291, 37.740254550336324], [-122.50968276929112, 37.74443971391659], [-122.50933586068263, 37.74593861448263], [-122.509713, 37.749084], [-122.51102746344195, 37.75254680648806], [-122.51185940942172, 37.76088378720577], [-122.512471999, 37.762518], [-122.5122749997709, 37.7631990004542], [-122.51310781678522, 37.7672423237982], [-122.51311599984498, 37.77599200013542], [-122.51351148963131, 37.77760251472979], [-122.51462964367589, 37.77850639732981], [-122.51472341204752, 37.78113364646814], [-122.513759, 37.781477], [-122.51349899900548, 37.782700633421804], [-122.5124659995058, 37.783743000078914], [-122.51268096205607, 37.78412001052793], [-122.51211200046262, 37.78379299964425], [-122.51191100062118, 37.784325999673406], [-122.50980800009482, 37.78481600004583], [-122.50605199989332, 37.78819199960187], [-122.50270431741205, 37.788039643461715], [-122.49957779800255, 37.78870386497085], [-122.49654710296048, 37.78728701797894], [-122.49480341029593, 37.78783226997738], [-122.49470080821759, 37.7881379934989], [-122.494002, 37.787581], [-122.493462, 37.787628], [-122.49128142374417, 37.78828118339819], [-122.4898287465386, 37.78948200198018], [-122.48736900010958, 37.789429999927385], [-122.48576538464472, 37.790672843455184], [-122.483592999, 37.794035], [-122.482079, 37.798472], [-122.48155399956126, 37.79874799971265], [-122.480202, 37.801417], [-122.47872883475314, 37.80549264781968], [-122.47840500012403, 37.8080930005458], [-122.477896, 37.808449], [-122.47773564878918, 37.810927242220195], [-122.47648749755751, 37.81084889843413], [-122.476049, 37.80964], [-122.47480200047606, 37.80917899954168], [-122.47060081384791, 37.808598861774264], [-122.46992362184089, 37.8094349364806], [-122.46944647056186, 37.809067953006874], [-122.47004699977322, 37.809289000447954], [-122.470537, 37.808582], [-122.46879000048132, 37.80700299975854], [-122.46814828750884, 37.8069805470069], [-122.4669960003269, 37.80590999971966], [-122.46641763807544, 37.806046851906125], [-122.466652, 37.805791], [-122.46357961470801, 37.804879881320694], [-122.458423, 37.805477], [-122.45448300077636, 37.80646899996972], [-122.452439, 37.806267], [-122.44872828916216, 37.80670157927226], [-122.44718026456493, 37.80747705884892], [-122.4430599949121, 37.80788238692801], [-122.44700719, 37.806547819], [-122.446831516, 37.80539116], [-122.44251599975422, 37.80595100000914], [-122.4422639995008, 37.80677500000322], [-122.4356861090081, 37.807714278616494], [-122.43554545105309, 37.806877466960046], [-122.43416500003714, 37.80697199966466], [-122.43353501802494, 37.80558986786683], [-122.43216515257353, 37.80609920907052], [-122.43260900796155, 37.80850226396037], [-122.43207899985552, 37.80722300035001], [-122.43138599968805, 37.80731399974551], [-122.4317271219686, 37.80902359451273], [-122.43134194374419, 37.809056690660114], [-122.43091599945808, 37.80732000038555], [-122.4303030003585, 37.80745699987419], [-122.43062118028507, 37.809166692931925], [-122.43010818627229, 37.80921498254278], [-122.429835, 37.807825], [-122.42823668281531, 37.80840566112987], [-122.427000999, 37.808109], [-122.42754514480073, 37.80864083842721], [-122.4280139999623, 37.80857000000572], [-122.42753323759783, 37.80878250147908], [-122.42661323201868, 37.80815201066661], [-122.42672024564848, 37.8095211273093], [-122.426341406855, 37.80761668574975], [-122.42578890635471, 37.80740595222087], [-122.42613200058445, 37.80735228235583], [-122.42395961228662, 37.80662272794094], [-122.4219166131334, 37.80774655760214], [-122.42153205983378, 37.80807146479975], [-122.42178917768433, 37.808374243348524], [-122.42132400029308, 37.808279000153306], [-122.42158500042763, 37.80854300009901], [-122.42130099937053, 37.808301999581545], [-122.42106162302592, 37.80855640313718], [-122.42284373847815, 37.810255806159915], [-122.42091100028149, 37.80879699951139], [-122.42036100001339, 37.80900400000414], [-122.4206686779243, 37.80895835651509], [-122.4204619998446, 37.80830299958906], [-122.41784397577705, 37.80882986388343], [-122.41734499985911, 37.8081410003539], [-122.41574773, 37.808157252], [-122.41634668219606, 37.80826522973579], [-122.41618699975513, 37.80885399986301], [-122.41742798477556, 37.80892723716339], [-122.41942294939717, 37.810454630353945], [-122.41972436265208, 37.811134853169015], [-122.41893534542463, 37.81088261821501], [-122.41935085639821, 37.811486352280376], [-122.41884636036305, 37.81147300899098], [-122.41535240470715, 37.80916086951749], [-122.41537068051503, 37.80940630265627], [-122.41488880185955, 37.80924118486687], [-122.41518028173887, 37.80948071790404], [-122.41249877526597, 37.80906570835373], [-122.41223371234008, 37.80957445805853], [-122.41047300019568, 37.80880399958489], [-122.4103181455029, 37.809229679927604], [-122.41130130566806, 37.81098877373097], [-122.41039588609809, 37.81142802679761], [-122.4093876918129, 37.80871987978142], [-122.40743132450919, 37.807903432240266], [-122.406644, 37.807818], [-122.406816, 37.809995], [-122.40612549670035, 37.810035489351286], [-122.4059044392015, 37.80715967344681], [-122.40532220572858, 37.806866922646584], [-122.40437226633524, 37.808871], [-122.4039081557617, 37.808718046486604], [-122.40471727887088, 37.80697146191799], [-122.4039559997589, 37.806579000329506], [-122.40276073089967, 37.80801512163345], [-122.40235183359594, 37.8078356255909], [-122.40342200025773, 37.80647099988127], [-122.40280437117052, 37.80602307404304], [-122.40094027856352, 37.807638759202405], [-122.40039903429854, 37.807261777769874], [-122.4009635939847, 37.803563389537295], [-122.40048, 37.803466], [-122.39852174272056, 37.80460002137844], [-122.39822556089459, 37.80425644380741], [-122.39997200044068, 37.803225000557866], [-122.39960274367951, 37.80280795091089], [-122.39781743086465, 37.80381206933367], [-122.39751480467146, 37.803470603868355], [-122.39961599944063, 37.80228200012581], [-122.39940966791225, 37.80182423786562], [-122.39710450660525, 37.8030236746417], [-122.39614385363528, 37.801952701751155], [-122.39838400000392, 37.80067300033485], [-122.39798900032325, 37.800230000076034], [-122.39575903223853, 37.801474865080365], [-122.39544429525077, 37.8011645582107], [-122.3975884087541, 37.799916314098475], [-122.39725700036036, 37.79944200034358], [-122.39689762275587, 37.79963228561377], [-122.39725156594827, 37.799401202631635], [-122.3965789998322, 37.798832999941474], [-122.3943387194934, 37.80015740631918], [-122.39657465186184, 37.79865051441526], [-122.39586066071908, 37.79787089099389], [-122.39380884939862, 37.79893717653993], [-122.39355806531395, 37.79863680301785], [-122.39549385903727, 37.79746956214999], [-122.3950159627847, 37.797123574969824], [-122.39319974353468, 37.79825044462857], [-122.39292104768789, 37.79796157499769], [-122.39468192193175, 37.79658162351102], [-122.3931689995961, 37.79750800040448], [-122.394127, 37.796862999], [-122.3929977657149, 37.795560733356076], [-122.39158999936502, 37.796204999833044], [-122.39119635709832, 37.795779174029825], [-122.39241100010568, 37.794820000321835], [-122.3916496140018, 37.79454747860815], [-122.39198201234144, 37.79387190392659], [-122.38880860453241, 37.7909781166636], [-122.388612001, 37.790313], [-122.38804897498, 37.790507520587184], [-122.38824400033306, 37.79000699965057], [-122.38734800090573, 37.78931099976726], [-122.38528448030664, 37.789757777331836], [-122.38514853924615, 37.78922031127896], [-122.38718801901145, 37.78877358776065], [-122.38704956674022, 37.78822849172339], [-122.38526168122591, 37.78851956372173], [-122.38513787575802, 37.78811828764879], [-122.38738105052838, 37.787720502120145], [-122.387407, 37.787241], [-122.38452007072524, 37.78738927289337], [-122.38434551697964, 37.78573011523009], [-122.387565, 37.785458], [-122.38770999992755, 37.78387599982706], [-122.38736044706805, 37.783347201986174], [-122.38777700035283, 37.78286800017092], [-122.38475167411198, 37.782938795193914], [-122.38468192053227, 37.78255105981172], [-122.38778799958457, 37.78227499990533], [-122.38775480910786, 37.781795651540904], [-122.385486126, 37.781752089], [-122.38762900011079, 37.78145100007824], [-122.38734099966071, 37.77835999968625], [-122.38529300030125, 37.77845100019215], [-122.38769112530255, 37.77833696044211], [-122.39041033420776, 37.777142439507166], [-122.39248024070336, 37.77511978890256], [-122.39817085760953, 37.770836515999385], [-122.39783035909586, 37.77044438511593], [-122.39459484528584, 37.773293464624786], [-122.39427307529525, 37.773024638083534], [-122.38996172875291, 37.77661816324873], [-122.38753637250112, 37.77674142820583], [-122.38708238728287, 37.776103866692374], [-122.38500456341089, 37.77632809560351], [-122.38487731806524, 37.77533018196434], [-122.386996001, 37.775082], [-122.38692306581841, 37.77432780215158], [-122.381814, 37.774615], [-122.3814565176791, 37.77191756024899], [-122.38474091330514, 37.77336421233438], [-122.38675999983646, 37.77327300037887], [-122.38584, 37.770682999], [-122.38562199909826, 37.77216199949081], [-122.3856818864475, 37.771444192808055], [-122.38528710091373, 37.77163439603435], [-122.38572427874843, 37.7705919760463], [-122.38315513589036, 37.769708769562065], [-122.38337592822391, 37.769333122677544], [-122.38557020093204, 37.77017965757931], [-122.38478800053423, 37.768657000826], [-122.38652000035223, 37.765411999876946], [-122.38660470135164, 37.76390217190762], [-122.387272, 37.763605], [-122.38631439131838, 37.7631020399505], [-122.38518200021434, 37.76337300028575], [-122.38510425391658, 37.762319303146406], [-122.38429164704539, 37.76213451999171], [-122.3844612636819, 37.76404704690856], [-122.38413211961496, 37.762256559083234], [-122.383427, 37.762301], [-122.38389933999773, 37.76408823538617], [-122.38329703641386, 37.76408402897687], [-122.38310956125683, 37.76232028549336], [-122.381748, 37.762405], [-122.38169499964904, 37.76473800001672], [-122.3811730009979, 37.76493299999427], [-122.38102934601237, 37.76222397810977], [-122.38330765060273, 37.76208157445985], [-122.38178994637649, 37.76056974009187], [-122.381716126, 37.759986137], [-122.379507, 37.76025], [-122.37953314184313, 37.7634661203481], [-122.37920200103622, 37.75993800038619], [-122.38146912248597, 37.75957348970635], [-122.38140000028807, 37.756404999995944], [-122.38075042297989, 37.75525870167735], [-122.38407313263959, 37.754951430875614], [-122.38407700000965, 37.754658999664564], [-122.38301599983212, 37.75459199959807], [-122.38265312097982, 37.753389157120814], [-122.37988033483772, 37.75288614800792], [-122.37995990211888, 37.75202988586154], [-122.37608733051087, 37.75224882537185], [-122.37577100043163, 37.74870699997347], [-122.38474399959445, 37.748303000062336], [-122.38733894937059, 37.74759102521558], [-122.38775721510883, 37.747850775699476], [-122.39041572220691, 37.747713389588206], [-122.39253474972281, 37.74846636452747], [-122.39297940515004, 37.747588456373315], [-122.39049185124422, 37.74669443442443], [-122.38746145236995, 37.74710217255324], [-122.37613401807835, 37.74714817569362], [-122.37412391402245, 37.74497605478401], [-122.37276200722101, 37.74550499560783], [-122.36763100023558, 37.740134000041216], [-122.36827462148314, 37.73982796597564], [-122.37395291237695, 37.73956737603957], [-122.3736106827799, 37.73882119888803], [-122.37260299993329, 37.738281999769896], [-122.36739439370564, 37.73822281750438], [-122.371297, 37.737063001], [-122.37292299955004, 37.73704300042665], [-122.37553747784428, 37.73834760525907], [-122.37633398522017, 37.73838505015297], [-122.37514168674561, 37.73780627157288], [-122.37488314340033, 37.73729580757025], [-122.37523690600038, 37.736225408180324], [-122.37596646474685, 37.73581567839854], [-122.37587445215917, 37.73504835073973], [-122.37531940075029, 37.73539436797341], [-122.37487649638238, 37.734975995160056], [-122.37496323074194, 37.73388958382183], [-122.37568832902728, 37.732881259582776], [-122.37417636410906, 37.73258633239894], [-122.37193776212139, 37.734206966066964], [-122.3692086102399, 37.73199260331634], [-122.36838778861915, 37.732291640145235], [-122.3674608534259, 37.73194683940149], [-122.36667729250364, 37.7322150610017], [-122.36525152187392, 37.73380126575213], [-122.36654200023604, 37.73218400041865], [-122.36533079198318, 37.732998650983646], [-122.36619076159508, 37.73191614607498], [-122.36501353984433, 37.732829587348654], [-122.36565100023516, 37.731625999846514], [-122.36482820572803, 37.73254238044864], [-122.36510850236931, 37.732065821439], [-122.3637009998674, 37.73128399971966], [-122.36287615349995, 37.73214268764048], [-122.36262300022719, 37.73200600012302], [-122.36340400079396, 37.73111500051861], [-122.36285289540533, 37.73080084541848], [-122.36206043066242, 37.73167472773923], [-122.36177600032705, 37.731538999916246], [-122.362568, 37.730643001], [-122.361907, 37.73009], [-122.36087811659962, 37.72990600423481], [-122.36074099993145, 37.73023299963161], [-122.35991499992598, 37.73033199973259], [-122.35879026368355, 37.729783134348665], [-122.36228300033741, 37.72852100014598], [-122.35773127020053, 37.72944293571173], [-122.35747937201938, 37.729245291516385], [-122.36040853712443, 37.72821000260562], [-122.35696700050588, 37.72870999983798], [-122.35770079929702, 37.72628217051206], [-122.36164100045505, 37.72521899999028], [-122.36125599959226, 37.72416499986791], [-122.35796185437937, 37.72494362420365], [-122.35783800021166, 37.724623999546196], [-122.36152359001585, 37.72377509408359], [-122.36490379623552, 37.725700016945844], [-122.36532415677318, 37.72550005415727], [-122.36236700032295, 37.723678999645855], [-122.36275032151731, 37.72325878677685], [-122.3599760000655, 37.72162900003848], [-122.36023531600992, 37.72135852409167], [-122.36299748561204, 37.722979151802114], [-122.3638106524897, 37.72210204482894], [-122.35913105272125, 37.719323417605985], [-122.359986, 37.718478], [-122.36271400033267, 37.720071000298375], [-122.363657, 37.719055], [-122.3585840004121, 37.71588299957593], [-122.362644992038, 37.71802106662596], [-122.36386606603507, 37.71672684560301], [-122.36003614879623, 37.714297998711864], [-122.36397478269897, 37.71658090699752], [-122.36521645659869, 37.71535158449372], [-122.36117135548902, 37.71275175076213], [-122.36538818425794, 37.71523658644932], [-122.36462196257604, 37.71646491415775], [-122.365637613, 37.716080085], [-122.36774678604505, 37.71765838109377], [-122.36951323544288, 37.71784186908899], [-122.37050191821415, 37.718723043119], [-122.37222849610325, 37.71903829514961], [-122.37399565972883, 37.71890546459162], [-122.37446869091009, 37.71976802171535], [-122.37555628943575, 37.72045461104069], [-122.37594650613795, 37.72269365620368], [-122.37708010931745, 37.72424099650655], [-122.37894336063734, 37.72380028494585], [-122.38059395434658, 37.72178999106817], [-122.38236200333128, 37.722304261471486], [-122.38340253613258, 37.720378528091594], [-122.38129499980779, 37.71878299956732], [-122.38042199994668, 37.718721000732614], [-122.3761633356925, 37.716151270535704], [-122.3773559999303, 37.714341000084666], [-122.3788975026068, 37.71309422267677], [-122.38005699946922, 37.71148999988474], [-122.38010438900858, 37.71077510454442], [-122.37794200028057, 37.70860800009701], [-122.37686390140539, 37.70890016458694], [-122.37602200048111, 37.70969099965325], [-122.37455205982187, 37.70900814619391], [-122.37456260211309, 37.70854226334115], [-122.37939999410942, 37.70842021492831], [-122.38451610717314, 37.70929532563916], [-122.38602323915862, 37.709999236371694], [-122.3880629997743, 37.70867300024679], [-122.3897180000687, 37.70962000031737], [-122.39061999994682, 37.70920500008273], [-122.39150999982165, 37.7096950000442], [-122.39314469418976, 37.70844647030215], [-122.42011081579068, 37.70833256788383], [-122.42335300031276, 37.709251000101155], [-122.42377635869232, 37.70834194401491], [-122.425359743, 37.708612508], [-122.42562247656319, 37.70831616007394]], [[-122.46289320163415, 37.71056275046378], [-122.46417562588739, 37.71054824592799], [-122.46289320163415, 37.71056275046378]], [[-122.4636765119546, 37.71141911161741], [-122.4636765119546, 37.71141911161741]]], [[[-122.4415365402417, 37.80812703385164], [-122.43992809827509, 37.80877905002839], [-122.440411001, 37.80815], [-122.44271355341645, 37.807793177409714], [-122.4415365402417, 37.80812703385164]]], [[[-122.441490203017, 37.80794375825696], [-122.44197599958497, 37.807876999711745], [-122.441490203017, 37.80794375825696]]], [[[-122.43263215247613, 37.805892763112446], [-122.43263215247613, 37.805892763112446]]], [[[-122.41887314801079, 37.80883613271764], [-122.41993820819755, 37.809120528585794], [-122.41789740623845, 37.80902815812045], [-122.41887314801079, 37.80883613271764]]], [[[-122.40979444539182, 37.80948535514294], [-122.40979444539182, 37.80948535514294]]], [[[-122.4097326825584, 37.80943500745665], [-122.4097326825584, 37.80943500745665]]], [[[-122.363881, 37.823927], [-122.36298099948509, 37.822527000443166], [-122.36424203286602, 37.81888188892412], [-122.36489875663027, 37.81834342683861], [-122.36528099995115, 37.81852700005355], [-122.371081001, 37.816027], [-122.36980426212074, 37.813402259092946], [-122.3675577434081, 37.81232537549601], [-122.35930891969248, 37.81498788660059], [-122.35891447767243, 37.814767214867295], [-122.35928100133778, 37.813726999304336], [-122.36104009118405, 37.812474403907856], [-122.361197987957, 37.81037986789158], [-122.36238100114507, 37.807227997189074], [-122.36738099976196, 37.80772799800727], [-122.37279999951068, 37.81110000016902], [-122.37204113699308, 37.81162320810846], [-122.37126554633154, 37.814712690038], [-122.37912454390779, 37.82678384475163], [-122.37769319322405, 37.83043592744325], [-122.37328100038383, 37.83242700044341], [-122.36871423701048, 37.83117050823964], [-122.363881, 37.823927]]]] } }] }
|