71 lines
3.1 KiB
Markdown
71 lines
3.1 KiB
Markdown
# map-checker
|
|
|
|
Cross-references our Sumter/Lake county address data against a reference map
|
|
(e.g. [thevillages.com/map](https://www.thevillages.com/map/)) to catch city
|
|
boundary or misnaming issues (e.g. addresses that are really in The Villages
|
|
but our data has as Lady Lake, Sumterville, Leesburg, etc.).
|
|
|
|
## Why this is manual, not automated
|
|
|
|
thevillages.com's Terms of Use explicitly prohibit automated access:
|
|
|
|
> "You must not use any robot, spider or other automatic device, process or
|
|
> means to access the Website for any purpose, including monitoring or
|
|
> copying any of the material on the Website."
|
|
|
|
So this subproject never fetches, scrapes, or otherwise programmatically
|
|
touches their site. Every input here comes from a human looking at the
|
|
official map in their own browser and either tracing a boundary or recording
|
|
an observation by hand.
|
|
|
|
## Workflow 1: hand-traced boundary (recommended)
|
|
|
|
Recording individual addresses one at a time doesn't scale to tens of
|
|
thousands of records. Instead, trace the boundary **once** and check every
|
|
address against it in one pass.
|
|
|
|
1. Open `https://www.thevillages.com/map/` (or another reference map) in one
|
|
browser tab.
|
|
2. Open **`/map-checker`** in the app (the "Boundary Tracer" link on the main
|
|
page) in another tab.
|
|
3. Click "New polygon", then click the map to place vertices tracing the
|
|
boundary you see on the reference map. The Villages is disjoint across
|
|
three counties, so you'll likely want several separate polygons - just
|
|
name them all the same (e.g. "The Villages") and add another with "New
|
|
polygon" once you finish the current one.
|
|
4. Click "Finish polygon", give it a name, repeat for each disjoint piece.
|
|
5. Click "Save to server" (requires login) - this writes
|
|
`/data/map-checker/boundary.geojson`. "Download GeoJSON" also works if you
|
|
just want a local copy.
|
|
6. Run the point-in-polygon check:
|
|
|
|
```bash
|
|
docker compose exec web python3 map-checker/check-boundary.py --county lake --county sumter
|
|
```
|
|
|
|
This flags:
|
|
- addresses **inside** the traced boundary whose county/OSM city fields
|
|
don't say "The Villages" (probably under-tagged), and
|
|
- addresses **outside** it that do say "The Villages" anyway (probably
|
|
over-tagged or the boundary needs another pass).
|
|
|
|
Pass `--expect-city "Some Other City"` to check a different boundary/name,
|
|
and `--output flagged.geojson` to save the flagged points for review in
|
|
the main map viewer.
|
|
|
|
## Workflow 2: individual spot-checks
|
|
|
|
For one-off verification of a specific address (not a bulk boundary check),
|
|
[`reference.yml`](reference.yml) + `check.py` still works the same way as
|
|
before: hand-record what the reference map says for a specific street/area,
|
|
then run `python check.py` to compare it against our data. See the comments
|
|
at the top of `reference.yml` for the entry format.
|
|
|
|
## Scope
|
|
|
|
`check-boundary.py` is only as accurate as the hand-traced polygon - it's a
|
|
spot-check/audit tool, not a source of truth. For a systematic (but coarser)
|
|
look at where the county's own postal-community and city/jurisdiction fields
|
|
disagree with each other and with OSM, see the "City Boundaries" report in
|
|
the main app (`/reports/city-boundaries`).
|