krz/omaha-metro-blotter

Archive of police activity and ALPR surveillance across the Omaha metro. alpr archive omaha police surveillance

Commit c6728e43f6

c6728e43f60c7dd0dc64acb0d96801601398b643

parent: f3030ed557

Verified · cmc

cmc <hello@cleberg.net> · 2026-08-23 19:21 UTC

Outline city limits and the county line on the map

The map floated grid cells and camera dots in blank space with a few
hardcoded labels. fetch_boundaries.py pulls city limits from Douglas
County and Sarpy County GIS plus the Douglas County boundary, rounded
to ~11 m and drawn beneath the data.

It also makes the reporting gap legible rather than something the
caption has to assert: Omaha's limits enclose cameras and no stops at
all, because the city publishes no stop data and the Sheriff publishes
no incident feed. Payload 38 KB to 67 KB.

Pottawattamie County, Iowa publishes no equivalent, so Council Bluffs
is unoutlined.

Layout: unified · split

README.nfo +12
@@ -55,6 +55,18 @@ SITE
55 55
56 .venv/bin/python build_site.py && open site/index.html 56 .venv/bin/python build_site.py && open site/index.html
57 57
58 the map's outlines come from raw_data/boundaries.geojson: douglas
59 county city limits and boundary, plus sarpy county municipal
60 boundaries. static reference geometry, so refreshing it is a rare
61 manual step rather than part of the daily pull.
62
63 .venv/bin/python fetch_boundaries.py
64
65 pottawattamie county, iowa publishes neither, so council bluffs is
66 unoutlined. douglas county sheriff publishes no incident or calls
67 feed at all -- only a flock portal with counts -- so the area
68 inside omaha's limits carries cameras and no stops.
69
58ARCHIVE 70ARCHIVE
59 .github/workflows/daily-pull.yml runs at 11:17 and 23:17 utc and 71 .github/workflows/daily-pull.yml runs at 11:17 and 23:17 utc and
60 keeps the database as metro.db.gz on the "archive" release, so the 72 keeps the database as metro.db.gz on the "archive" release, so the
build_site.py +19
@@ -84,6 +84,24 @@ def weekly(conn):
84 return out 84 return out
85 85
86 86
87def boundaries():
88 """City limits and the county line, rounded to ~11 m for the wire."""
89 src = ROOT / "raw_data" / "boundaries.geojson"
90 if not src.exists():
91 return []
92 gj = json.loads(src.read_text())
93 out = []
94 for f in gj["features"]:
95 g = f["geometry"]
96 polys = ([g["coordinates"]] if g["type"] == "Polygon"
97 else g["coordinates"])
98 rings = [[[round(x, 4), round(y, 4)] for x, y in ring]
99 for poly in polys for ring in poly]
100 out.append({"name": f["properties"]["name"],
101 "kind": f["properties"]["kind"], "rings": rings})
102 return out
103
104
87def map_layers(conn): 105def map_layers(conn):
88 df = analysis.load_incidents(conn) 106 df = analysis.load_incidents(conn)
89 stops = df[df["is_stop"] == 1].dropna(subset=["lat", "lon"]) 107 stops = df[df["is_stop"] == 1].dropna(subset=["lat", "lon"])
@@ -95,6 +113,7 @@ def map_layers(conn):
95 cams = analysis.load_cameras(conn) 113 cams = analysis.load_cameras(conn)
96 return { 114 return {
97 "cell": CELL, 115 "cell": CELL,
116 "boundaries": boundaries(),
98 "cells": [[round(r.clat, 4), round(r.clon, 4), int(r.n)] 117 "cells": [[round(r.clat, 4), round(r.clon, 4), int(r.n)]
99 for r in grid.itertuples()], 118 for r in grid.itertuples()],
100 "cameras": [[round(r.lat, 5), round(r.lon, 5)] for r in cams.itertuples()], 119 "cameras": [[round(r.lat, 5), round(r.lon, 5)] for r in cams.itertuples()],
fetch_boundaries.py added +74
@@ -0,0 +1,74 @@
1"""Refresh raw_data/boundaries.geojson, the map's geographic context.
2
3City limits and the county line are static reference geometry, not archive
4data, so this is a rare manual refresh rather than part of the daily pull.
5Douglas County publishes its own city limits and boundary; Sarpy publishes
6municipal boundaries under a different field name. Council Bluffs sits in
7Pottawattamie County, Iowa, which publishes neither, so it is unoutlined.
8"""
9
10import json
11import ssl
12import urllib.parse
13import urllib.request
14from pathlib import Path
15
16import certifi
17
18OUT = Path(__file__).parent / "raw_data" / "boundaries.geojson"
19CTX = ssl.create_default_context(cafile=certifi.where())
20# ~55 m; enough to keep the shapes honest without shipping full survey detail
21TOLERANCE = 0.0005
22
23LAYERS = [
24 {"kind": "county", "name": "Douglas County", "name_field": None,
25 "url": "https://services.arcgis.com/pDAi2YK0L0QxVJHj/arcgis/rest/services"
26 "/Douglas_County_Boundary/FeatureServer/0"},
27 {"kind": "city", "name_field": "town",
28 "url": "https://dcgis.org/server/rest/services/Hosted"
29 "/City_Limits_(source)_view/FeatureServer/0"},
30 {"kind": "city", "name_field": "NAME",
31 "url": "https://geodata.sarpy.gov/arcgis/rest/services/Cadastral"
32 "/LandRecordsDynamic/MapServer/39"},
33]
34
35
36def fetch(layer):
37 params = {"where": "1=1", "outFields": "*", "outSR": "4326",
38 "maxAllowableOffset": TOLERANCE, "f": "geojson"}
39 url = layer["url"] + "/query?" + urllib.parse.urlencode(params)
40 # Sarpy's MapServer 403s the default Python-urllib agent
41 req = urllib.request.Request(url, headers={"User-Agent": "omaha-incidents/1.0"})
42 with urllib.request.urlopen(req, timeout=120, context=CTX) as r:
43 return json.load(r)
44
45
46def main():
47 features = []
48 for layer in LAYERS:
49 gj = fetch(layer)
50 for f in gj.get("features", []):
51 field = layer["name_field"]
52 name = (f.get("properties") or {}).get(field) if field else layer["name"]
53 features.append({
54 "type": "Feature",
55 "properties": {"name": name, "kind": layer["kind"]},
56 "geometry": f["geometry"],
57 })
58 print(f" {len(gj.get('features', []))} from {layer['url'].split('/')[2]}")
59
60 OUT.write_text(json.dumps(
61 {"type": "FeatureCollection", "features": features},
62 separators=(",", ":")))
63 verts = sum(len(r) for f in features
64 for poly in ([f["geometry"]["coordinates"]]
65 if f["geometry"]["type"] == "Polygon"
66 else f["geometry"]["coordinates"])
67 for r in poly)
68 print(f" wrote {OUT.relative_to(OUT.parent.parent)}: "
69 f"{len(features)} features, {verts} vertices, "
70 f"{OUT.stat().st_size / 1024:.0f} KiB")
71
72
73if __name__ == "__main__":
74 main()
raw_data/boundaries.geojson added +1
@@ -0,0 +1 @@
1{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"name":"Douglas County","kind":"county"},"geometry":{"type":"Polygon","coordinates":[[[-95.90564,41.30064],[-95.90622,41.3013],[-95.92086,41.30132],[-95.92767,41.29878],[-95.92979,41.29213],[-95.92988,41.2852],[-95.92913,41.28149],[-95.91523,41.27195],[-95.91796,41.27053],[-95.92139,41.26723],[-95.92222,41.26264],[-95.92054,41.25598],[-95.91777,41.25022],[-95.9134,41.24403],[-95.91083,41.23579],[-95.91079,41.23251],[-95.91367,41.22501],[-95.92365,41.21485],[-95.92582,41.212],[-95.92716,41.20849],[-95.92796,41.20349],[-95.92729,41.19777],[-95.92365,41.19098],[-96.32787,41.19021],[-96.33255,41.19556],[-96.33654,41.19795],[-96.34619,41.20182],[-96.3526,41.20566],[-96.36155,41.2195],[-96.36548,41.23554],[-96.35714,41.24896],[-96.35081,41.25625],[-96.34966,41.26217],[-96.3506,41.26519],[-96.36057,41.28041],[-96.36715,41.28853],[-96.3753,41.2958],[-96.38079,41.29787],[-96.39053,41.3032],[-96.39861,41.30907],[-96.40256,41.3099],[-96.40917,41.31631],[-96.40864,41.32231],[-96.40695,41.32741],[-96.40744,41.33663],[-96.41382,41.3537],[-96.42139,41.36413],[-96.42556,41.36652],[-96.43963,41.37014],[-96.45836,41.37946],[-96.47095,41.39324],[-95.93749,41.3931],[-95.93766,41.39063],[-95.93601,41.38505],[-95.93051,41.37725],[-95.92898,41.37346],[-95.9295,41.36781],[-95.93215,41.36325],[-95.93634,41.35986],[-95.94023,41.35804],[-95.95136,41.35533],[-95.95461,41.353],[-95.9567,41.35041],[-95.95699,41.3454],[-95.95334,41.3392],[-95.94648,41.33325],[-95.94057,41.3292],[-95.92614,41.32184],[-95.91789,41.32013],[-95.89975,41.32133],[-95.89185,41.3201],[-95.88478,41.31753],[-95.87807,41.31257],[-95.87446,41.30803],[-95.87193,41.30176],[-95.87169,41.29255],[-95.87319,41.28923],[-95.87659,41.28538],[-95.88568,41.2802],[-95.90337,41.27395],[-95.91315,41.27955],[-95.90458,41.29393],[-95.90454,41.29942],[-95.90564,41.30064]]]}},{"type":"Feature","properties":{"name":"Valley","kind":"city"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-96.34864,41.33481],[-96.34037,41.33539],[-96.34872,41.33538],[-96.34872,41.33879],[-96.34945,41.33879],[-96.34914,41.33538],[-96.35446,41.33541],[-96.35839,41.33819],[-96.35839,41.33547],[-96.36819,41.33548],[-96.36818,41.33171],[-96.37111,41.33171],[-96.38738,41.34106],[-96.38741,41.33537],[-96.37932,41.33535],[-96.37761,41.33437],[-96.37763,41.32095],[-96.39603,41.32106],[-96.39607,41.31963],[-96.39462,41.31853],[-96.39544,41.31752],[-96.39369,41.31575],[-96.39408,41.3154],[-96.38599,41.30957],[-96.38849,41.30786],[-96.3831,41.30408],[-96.386,41.30123],[-96.3795,41.2982],[-96.3744,41.30282],[-96.3536,41.31261],[-96.35361,41.3046],[-96.34892,41.3044],[-96.34893,41.30368],[-96.3512,41.30368],[-96.35121,41.30262],[-96.34046,41.30268],[-96.34077,41.29167],[-96.33073,41.29172],[-96.33066,41.29549],[-96.32602,41.29548],[-96.32584,41.30507],[-96.31148,41.29829],[-96.31147,41.29906],[-96.30952,41.29908],[-96.31119,41.30086],[-96.31123,41.3064],[-96.3186,41.30638],[-96.31861,41.30993],[-96.32102,41.30992],[-96.32102,41.31249],[-96.31364,41.3143],[-96.31127,41.31696],[-96.31401,41.31446],[-96.32104,41.31298],[-96.32104,41.31356],[-96.32209,41.31356],[-96.32209,41.31483],[-96.31953,41.31499],[-96.31953,41.31991],[-96.32102,41.31991],[-96.32103,41.32091],[-96.32946,41.32089],[-96.32945,41.31933],[-96.3308,41.31933],[-96.33077,41.31581],[-96.33793,41.31615],[-96.33711,41.31511],[-96.33943,41.31536],[-96.33943,41.31473],[-96.34026,41.31473],[-96.34027,41.32087],[-96.33737,41.32114],[-96.34029,41.32339],[-96.34032,41.32804],[-96.34486,41.32804],[-96.34726,41.32994],[-96.34835,41.33166],[-96.34864,41.33481]],[[-96.34909,41.33526],[-96.35023,41.33341],[-96.35433,41.33532],[-96.34909,41.33526]]],[[[-96.31127,41.31867],[-96.3116,41.31992],[-96.3116,41.31868],[-96.31127,41.31867]]]],"crs":null}},{"type":"Feature","properties":{"name":"Boys Town","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.13885,41.25308],[-96.13828,41.24883],[-96.11973,41.24881],[-96.12009,41.26195],[-96.12622,41.26298],[-96.13901,41.26211],[-96.13885,41.25308]]],"crs":null}},{"type":"Feature","properties":{"name":"Carter Lake, Iowa","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-95.90642,41.27365],[-95.90337,41.27395],[-95.91315,41.27955],[-95.90458,41.29393],[-95.90454,41.29942],[-95.90622,41.3013],[-95.92086,41.30132],[-95.92767,41.29878],[-95.92979,41.29213],[-95.92988,41.2852],[-95.92913,41.28149],[-95.91523,41.27195],[-95.90642,41.27365]]],"crs":null}},{"type":"Feature","properties":{"name":"Omaha","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.21566,41.23753],[-96.22028,41.23751],[-96.22028,41.23351],[-96.21568,41.23355],[-96.21565,41.22677],[-96.20586,41.22667],[-96.20593,41.21955],[-96.21573,41.21955],[-96.21573,41.21413],[-96.21059,41.21408],[-96.21057,41.21235],[-96.20598,41.21238],[-96.206,41.20525],[-96.20673,41.20524],[-96.20674,41.20379],[-96.20605,41.20379],[-96.20619,41.19059],[-96.0524,41.19077],[-96.05241,41.19441],[-96.0435,41.19441],[-96.04303,41.2006],[-96.04769,41.20136],[-96.04768,41.19805],[-96.05229,41.19806],[-96.05229,41.20177],[-96.0455,41.20164],[-96.04603,41.20518],[-96.04535,41.20518],[-96.04532,41.20164],[-96.04305,41.20087],[-96.04302,41.21234],[-96.03142,41.2124],[-96.02854,41.2124],[-96.02852,41.20939],[-96.02379,41.20889],[-96.02373,41.19072],[-95.92365,41.19098],[-95.92729,41.19777],[-95.92796,41.20349],[-95.92716,41.20849],[-95.92582,41.212],[-95.92365,41.21485],[-95.91367,41.22501],[-95.91079,41.23251],[-95.91083,41.23579],[-95.9134,41.24403],[-95.91777,41.25022],[-95.92054,41.25598],[-95.92222,41.26264],[-95.92139,41.26723],[-95.91796,41.27053],[-95.91523,41.27195],[-95.92913,41.28149],[-95.92988,41.2852],[-95.92979,41.29213],[-95.92767,41.29878],[-95.92086,41.30132],[-95.90622,41.3013],[-95.90454,41.29942],[-95.90458,41.29393],[-95.91315,41.27955],[-95.90337,41.27395],[-95.88568,41.2802],[-95.87659,41.28538],[-95.87319,41.28923],[-95.87169,41.29255],[-95.87193,41.30176],[-95.87623,41.31076],[-95.88478,41.31753],[-95.89185,41.3201],[-95.89975,41.32133],[-95.91789,41.32013],[-95.92405,41.3212],[-95.94057,41.3292],[-95.95105,41.33695],[-95.95334,41.3392],[-95.95699,41.3454],[-95.95721,41.34865],[-95.95615,41.35146],[-95.95136,41.35533],[-95.93808,41.35889],[-95.9311,41.36462],[-95.9579,41.36462],[-95.9543,41.36977],[-95.95288,41.37414],[-95.95728,41.37692],[-95.96078,41.37607],[-95.96649,41.37663],[-95.96642,41.37364],[-95.95935,41.37369],[-95.95933,41.37185],[-95.96168,41.37183],[-95.96141,41.35557],[-95.96335,41.35559],[-95.96336,41.3573],[-95.96611,41.35731],[-95.96605,41.35305],[-95.97164,41.35377],[-95.97328,41.35309],[-95.97391,41.35379],[-95.97335,41.34637],[-95.97675,41.34683],[-95.98193,41.35156],[-95.98193,41.35011],[-95.99305,41.35011],[-95.99305,41.34749],[-96.01201,41.34662],[-96.01906,41.3435],[-96.02235,41.34311],[-96.02337,41.34329],[-96.02346,41.34474],[-96.02402,41.34474],[-96.02404,41.34293],[-96.02532,41.34293],[-96.02849,41.34051],[-96.0285,41.34295],[-96.03818,41.34295],[-96.0382,41.34657],[-96.03648,41.35028],[-96.04303,41.35028],[-96.043,41.34657],[-96.0442,41.34566],[-96.046,41.34657],[-96.04718,41.34386],[-96.04957,41.34386],[-96.04959,41.34656],[-96.05146,41.35118],[-96.05086,41.35253],[-96.04783,41.35295],[-96.04783,41.35393],[-96.05147,41.35563],[-96.0514,41.35827],[-96.04906,41.35925],[-96.04658,41.365],[-96.05257,41.36502],[-96.05261,41.3683],[-96.0538,41.36829],[-96.05383,41.37191],[-96.05503,41.37281],[-96.05384,41.37371],[-96.05388,41.37822],[-96.05267,41.37906],[-96.05272,41.39317],[-96.05694,41.3932],[-96.05753,41.38911],[-96.05993,41.3891],[-96.05812,41.38639],[-96.05811,41.38367],[-96.05991,41.38276],[-96.05852,41.38095],[-96.05834,41.37923],[-96.05868,41.37733],[-96.05988,41.37688],[-96.05931,41.37441],[-96.06105,41.37371],[-96.05983,41.371],[-96.05981,41.36829],[-96.06232,41.36836],[-96.06702,41.371],[-96.06703,41.37191],[-96.07182,41.37191],[-96.0718,41.3701],[-96.06203,41.36471],[-96.05701,41.36475],[-96.057,41.36379],[-96.0582,41.36378],[-96.05818,41.36253],[-96.05973,41.36297],[-96.0597,41.36103],[-96.06151,41.36103],[-96.06149,41.36005],[-96.05972,41.35914],[-96.05872,41.35743],[-96.06692,41.35742],[-96.06695,41.35379],[-96.06225,41.35379],[-96.06227,41.35173],[-96.06132,41.35172],[-96.06228,41.35117],[-96.06228,41.35008],[-96.06035,41.35008],[-96.05976,41.34745],[-96.05857,41.34656],[-96.05857,41.34542],[-96.06234,41.34471],[-96.06229,41.34112],[-96.05737,41.34112],[-96.05736,41.33561],[-96.05091,41.33564],[-96.05064,41.33339],[-96.05729,41.33147],[-96.06615,41.32546],[-96.07179,41.32483],[-96.07097,41.3238],[-96.07102,41.32064],[-96.07429,41.32139],[-96.10068,41.32115],[-96.10077,41.31857],[-96.09097,41.31744],[-96.091,41.3139],[-96.10071,41.3139],[-96.10091,41.3069],[-96.10441,41.30672],[-96.10653,41.31571],[-96.11015,41.31579],[-96.11338,41.31389],[-96.11978,41.31388],[-96.11981,41.31931],[-96.12568,41.31932],[-96.13526,41.31567],[-96.13706,41.31658],[-96.13707,41.31771],[-96.13996,41.31771],[-96.14008,41.3193],[-96.14352,41.32111],[-96.14326,41.32306],[-96.14631,41.32366],[-96.15097,41.32834],[-96.15478,41.32833],[-96.15461,41.32711],[-96.15194,41.32647],[-96.15004,41.32466],[-96.15034,41.32309],[-96.14858,41.32245],[-96.14856,41.3211],[-96.14612,41.32111],[-96.1437,41.31839],[-96.1437,41.31748],[-96.1449,41.31657],[-96.14006,41.31384],[-96.14006,41.31203],[-96.14365,41.3084],[-96.14365,41.30672],[-96.15788,41.30683],[-96.15804,41.32123],[-96.17323,41.32117],[-96.17274,41.31581],[-96.17597,41.31623],[-96.17595,41.31524],[-96.17763,41.31521],[-96.17753,41.31053],[-96.17865,41.30974],[-96.18009,41.31023],[-96.18322,41.314],[-96.18228,41.31702],[-96.18225,41.32114],[-96.18713,41.32112],[-96.18716,41.32678],[-96.18799,41.32681],[-96.18953,41.32447],[-96.19188,41.32446],[-96.19543,41.32834],[-96.19683,41.33164],[-96.19955,41.3318],[-96.20129,41.33825],[-96.20292,41.33984],[-96.20315,41.34176],[-96.20518,41.34528],[-96.20678,41.34528],[-96.20657,41.33907],[-96.20555,41.33908],[-96.20414,41.33612],[-96.20371,41.3322],[-96.20788,41.33173],[-96.20798,41.33001],[-96.2099,41.32817],[-96.2146,41.32634],[-96.21412,41.32576],[-96.21052,41.32599],[-96.20622,41.32747],[-96.20438,41.3296],[-96.20295,41.32953],[-96.20116,41.32593],[-96.19827,41.3236],[-96.19798,41.32086],[-96.19356,41.32058],[-96.1933,41.31928],[-96.19512,41.31691],[-96.19234,41.31614],[-96.19232,41.31533],[-96.19083,41.31475],[-96.1927,41.31341],[-96.19267,41.31273],[-96.19057,41.31256],[-96.19005,41.31146],[-96.19142,41.3106],[-96.19075,41.30633],[-96.17477,41.30638],[-96.1745,41.30438],[-96.17523,41.30437],[-96.17531,41.30291],[-96.17364,41.30291],[-96.17284,41.30541],[-96.17333,41.30638],[-96.16286,41.30646],[-96.16286,41.29932],[-96.17753,41.2993],[-96.17757,41.29578],[-96.18186,41.29567],[-96.18191,41.29253],[-96.1844,41.29242],[-96.1872,41.29252],[-96.18695,41.29933],[-96.19176,41.29934],[-96.19187,41.29236],[-96.23407,41.29213],[-96.23417,41.2973],[-96.2387,41.2973],[-96.23871,41.29642],[-96.24059,41.29632],[-96.24104,41.29711],[-96.24409,41.29719],[-96.24511,41.29829],[-96.25255,41.29592],[-96.25296,41.29514],[-96.25183,41.29276],[-96.25363,41.29435],[-96.25412,41.29342],[-96.25757,41.29488],[-96.26812,41.29509],[-96.26809,41.29208],[-96.26142,41.292],[-96.26142,41.2873],[-96.25851,41.28727],[-96.25851,41.28157],[-96.25373,41.28322],[-96.25374,41.28464],[-96.24663,41.28467],[-96.23928,41.28283],[-96.23928,41.28096],[-96.24137,41.28112],[-96.24205,41.27734],[-96.25368,41.27749],[-96.25364,41.26834],[-96.25982,41.26839],[-96.25985,41.26658],[-96.25679,41.26656],[-96.25643,41.26287],[-96.25834,41.26169],[-96.25833,41.25934],[-96.25909,41.25933],[-96.25873,41.25675],[-96.26363,41.25108],[-96.26508,41.24868],[-96.26556,41.24572],[-96.25358,41.24473],[-96.25357,41.24111],[-96.25239,41.2411],[-96.251,41.23859],[-96.24876,41.23748],[-96.24877,41.2411],[-96.24744,41.2411],[-96.24769,41.24826],[-96.23463,41.24809],[-96.23481,41.24332],[-96.228,41.24481],[-96.22524,41.24288],[-96.22509,41.24112],[-96.21567,41.24121],[-96.21566,41.23753]],[[-96.19698,41.29142],[-96.19678,41.28827],[-96.19085,41.28847],[-96.19097,41.27968],[-96.19158,41.27867],[-96.19096,41.27742],[-96.17754,41.27734],[-96.1773,41.26723],[-96.17826,41.26573],[-96.17967,41.26505],[-96.19694,41.27474],[-96.19676,41.27089],[-96.20006,41.27052],[-96.20424,41.26732],[-96.20607,41.26691],[-96.20603,41.26343],[-96.21084,41.26339],[-96.21088,41.26712],[-96.21541,41.26672],[-96.21565,41.27439],[-96.21321,41.27471],[-96.20669,41.27346],[-96.20481,41.27492],[-96.20202,41.27522],[-96.21557,41.27683],[-96.21562,41.27734],[-96.21098,41.27741],[-96.21104,41.28839],[-96.21605,41.28838],[-96.21603,41.28474],[-96.22223,41.28469],[-96.22222,41.28389],[-96.22668,41.28385],[-96.22648,41.28304],[-96.22958,41.28259],[-96.23375,41.28331],[-96.23303,41.28458],[-96.22551,41.28465],[-96.22537,41.29172],[-96.19698,41.29142]],[[-96.02407,41.33555],[-96.02418,41.32502],[-96.03319,41.32485],[-96.03324,41.33028],[-96.03842,41.33028],[-96.03841,41.32969],[-96.04087,41.32876],[-96.0396,41.32753],[-96.03998,41.32334],[-96.03814,41.32332],[-96.03814,41.32051],[-96.03599,41.32056],[-96.03605,41.31895],[-96.04177,41.31899],[-96.04533,41.31709],[-96.04715,41.31477],[-96.04761,41.31139],[-96.0522,41.31521],[-96.05632,41.31531],[-96.06222,41.31862],[-96.06222,41.32107],[-96.05738,41.3211],[-96.05737,41.32358],[-96.05912,41.32479],[-96.06229,41.32479],[-96.0636,41.32582],[-96.05257,41.33152],[-96.03958,41.33557],[-96.02407,41.33555]],[[-96.13291,41.26293],[-96.12242,41.26283],[-96.12009,41.26195],[-96.11973,41.24881],[-96.13828,41.24883],[-96.1385,41.25308],[-96.14348,41.25311],[-96.14346,41.24872],[-96.14826,41.24865],[-96.14838,41.26159],[-96.14497,41.26281],[-96.13901,41.26211],[-96.13291,41.26293]],[[-96.02253,41.34033],[-96.01764,41.34291],[-96.0112,41.34492],[-96.00483,41.34566],[-96.00482,41.3358],[-96.02346,41.3358],[-96.02331,41.3399],[-96.02253,41.34033]],[[-96.19908,41.25756],[-96.1984,41.25707],[-96.19949,41.25628],[-96.19788,41.25532],[-96.19661,41.25552],[-96.19659,41.25213],[-96.20112,41.25211],[-96.20109,41.24861],[-96.20348,41.2486],[-96.20351,41.25204],[-96.20592,41.25149],[-96.20622,41.24859],[-96.21527,41.24857],[-96.21539,41.25569],[-96.20593,41.25572],[-96.20595,41.25754],[-96.19908,41.25756]],[[-96.17339,41.29176],[-96.1697,41.29185],[-96.17021,41.28479],[-96.16858,41.28479],[-96.16761,41.28382],[-96.1674,41.28033],[-96.16633,41.27972],[-96.16785,41.27768],[-96.17704,41.2777],[-96.17716,41.29169],[-96.17339,41.29176]],[[-96.14155,41.24849],[-96.13887,41.24849],[-96.13884,41.24136],[-96.15293,41.24131],[-96.15307,41.24841],[-96.14155,41.24849]],[[-96.12451,41.28489],[-96.12451,41.2777],[-96.13401,41.27776],[-96.13405,41.28497],[-96.12451,41.28489]],[[-96.09965,41.27699],[-96.09474,41.27749],[-96.08767,41.26686],[-96.0912,41.26723],[-96.09268,41.27135],[-96.10034,41.27],[-96.10033,41.27136],[-96.09911,41.27136],[-96.09911,41.27316],[-96.10036,41.27315],[-96.10029,41.2767],[-96.09965,41.27699]],[[-96.23927,41.26908],[-96.23927,41.26827],[-96.24404,41.26829],[-96.24376,41.27553],[-96.24181,41.27734],[-96.23523,41.27732],[-96.23488,41.27396],[-96.23775,41.27385],[-96.23682,41.27234],[-96.2371,41.27044],[-96.23928,41.26974],[-96.23927,41.26908]],[[-96.22435,41.26699],[-96.22531,41.26717],[-96.22547,41.27726],[-96.22268,41.2772],[-96.21788,41.27448],[-96.22001,41.27181],[-96.22112,41.27178],[-96.22096,41.27082],[-96.22323,41.27061],[-96.22435,41.26699]],[[-96.04597,41.31064],[-96.04176,41.30972],[-96.03773,41.3068],[-96.04913,41.30684],[-96.04819,41.31029],[-96.04597,41.31064]],[[-96.23304,41.28188],[-96.23083,41.28233],[-96.23084,41.28143],[-96.22675,41.28213],[-96.22471,41.28164],[-96.22338,41.28001],[-96.22183,41.28073],[-96.21979,41.27974],[-96.21943,41.27829],[-96.21594,41.27692],[-96.23303,41.28085],[-96.23303,41.28146],[-96.23435,41.28172],[-96.23304,41.28188]],[[-96.2111,41.25925],[-96.21139,41.2625],[-96.20602,41.26247],[-96.20648,41.25948],[-96.2111,41.25925]],[[-96.23234,41.27747],[-96.23181,41.28059],[-96.22548,41.27926],[-96.22547,41.27753],[-96.23234,41.27747]],[[-96.0566,41.31466],[-96.05564,41.31394],[-96.05728,41.31394],[-96.05729,41.31138],[-96.05912,41.31204],[-96.05911,41.31394],[-96.06224,41.31394],[-96.06223,41.31721],[-96.0566,41.31466]],[[-96.21789,41.25241],[-96.21905,41.25349],[-96.22035,41.25303],[-96.22038,41.25566],[-96.21581,41.25569],[-96.21571,41.25256],[-96.21789,41.25241]],[[-96.04777,41.33416],[-96.05001,41.33357],[-96.05034,41.33561],[-96.04313,41.33565],[-96.04777,41.33416]],[[-96.21742,41.25938],[-96.21993,41.25908],[-96.22035,41.26088],[-96.21593,41.26091],[-96.21592,41.25956],[-96.21742,41.25938]],[[-96.21901,41.26852],[-96.21857,41.26935],[-96.21591,41.27021],[-96.21589,41.2684],[-96.21901,41.26852]],[[-96.20677,41.25909],[-96.206,41.25977],[-96.20599,41.25906],[-96.20677,41.25909]]],"crs":null}},{"type":"Feature","properties":{"name":"Waterloo","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.29851,41.29217],[-96.3066,41.29599],[-96.31047,41.29596],[-96.30747,41.29175],[-96.30306,41.29179],[-96.30306,41.29085],[-96.30585,41.28783],[-96.31169,41.28778],[-96.31159,41.28454],[-96.30182,41.28463],[-96.30174,41.27727],[-96.27705,41.27758],[-96.27889,41.28439],[-96.27785,41.28762],[-96.2787,41.28914],[-96.28261,41.29207],[-96.28517,41.29368],[-96.29227,41.29373],[-96.29267,41.29145],[-96.29191,41.29012],[-96.29616,41.29214],[-96.29851,41.29217]],[[-96.2932,41.28615],[-96.29229,41.28616],[-96.29237,41.28179],[-96.29305,41.28187],[-96.2932,41.28615]]],"crs":null}},{"type":"Feature","properties":{"name":"Ralston","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.02854,41.21229],[-96.04302,41.21234],[-96.04305,41.20087],[-96.04532,41.20164],[-96.04535,41.20518],[-96.04603,41.20518],[-96.0455,41.20164],[-96.05229,41.20177],[-96.05229,41.19806],[-96.04768,41.19805],[-96.04769,41.20136],[-96.04303,41.2006],[-96.0435,41.19441],[-96.05241,41.19441],[-96.0524,41.19077],[-96.02373,41.19072],[-96.02379,41.20889],[-96.02852,41.20939],[-96.02854,41.21229]]],"crs":null}},{"type":"Feature","properties":{"name":"Bennington","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.178,41.37253],[-96.1793,41.37373],[-96.17937,41.37668],[-96.18187,41.37851],[-96.18306,41.37827],[-96.1809,41.37633],[-96.1803,41.37314],[-96.17786,41.37059],[-96.17778,41.36445],[-96.16196,41.3646],[-96.16089,41.36328],[-96.15841,41.36241],[-96.15841,41.36098],[-96.15553,41.36098],[-96.15445,41.35917],[-96.15278,41.36013],[-96.15274,41.36454],[-96.14875,41.36455],[-96.14874,41.36828],[-96.14602,41.36829],[-96.14543,41.37104],[-96.14543,41.37219],[-96.15863,41.37239],[-96.16323,41.37372],[-96.16807,41.37689],[-96.16867,41.37255],[-96.16804,41.37184],[-96.16802,41.36823],[-96.17019,41.36822],[-96.17017,41.36611],[-96.178,41.37253]]],"crs":null}},{"type":"Feature","properties":{"name":"Springfield","kind":"city"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-96.1311,41.078],[-96.1289,41.078],[-96.1289,41.0767],[-96.1253,41.0767],[-96.1254,41.0817],[-96.1243,41.0817],[-96.1238,41.0804],[-96.122,41.0804],[-96.1212,41.0807],[-96.1214,41.0819],[-96.1244,41.0819],[-96.1254,41.0849],[-96.1277,41.0848],[-96.1277,41.0867],[-96.1289,41.0867],[-96.1289,41.0892],[-96.1336,41.0892],[-96.1337,41.0915],[-96.1347,41.0908],[-96.1357,41.0915],[-96.1359,41.0935],[-96.135,41.0949],[-96.136,41.0993],[-96.1376,41.1032],[-96.1395,41.1029],[-96.1389,41.0889],[-96.1382,41.0889],[-96.1382,41.0855],[-96.1388,41.0846],[-96.1384,41.0818],[-96.1389,41.0818],[-96.1384,41.0782],[-96.1359,41.0781],[-96.1359,41.0745],[-96.1316,41.0744],[-96.1311,41.078]]],[[[-96.1385,41.1179],[-96.1576,41.1182],[-96.1576,41.1107],[-96.1528,41.1108],[-96.1528,41.1033],[-96.1369,41.1036],[-96.1377,41.1038],[-96.1382,41.1067],[-96.1385,41.1179]]]]}},{"type":"Feature","properties":{"name":"Papillion","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.0234,41.1656],[-96.0233,41.169],[-96.0189,41.169],[-96.0189,41.1762],[-96.0618,41.1763],[-96.0618,41.1666],[-96.0565,41.1666],[-96.0565,41.1654],[-96.0543,41.166],[-96.0542,41.1625],[-96.064,41.1654],[-96.0812,41.1755],[-96.0812,41.169],[-96.0864,41.169],[-96.0864,41.168],[-96.0906,41.168],[-96.0906,41.169],[-96.1198,41.1689],[-96.1198,41.1618],[-96.1293,41.1618],[-96.1293,41.1544],[-96.1385,41.1544],[-96.1383,41.1459],[-96.1426,41.1468],[-96.1534,41.1468],[-96.1533,41.1399],[-96.1545,41.1399],[-96.1544,41.1362],[-96.1582,41.1362],[-96.1582,41.1324],[-96.153,41.1324],[-96.1528,41.1304],[-96.1511,41.1288],[-96.1507,41.1253],[-96.1483,41.1254],[-96.1483,41.124],[-96.1518,41.124],[-96.153,41.1215],[-96.1528,41.118],[-96.1291,41.118],[-96.1291,41.1254],[-96.1384,41.1251],[-96.1384,41.1323],[-96.1244,41.1324],[-96.1244,41.1399],[-96.1292,41.1399],[-96.1293,41.147],[-96.1198,41.1469],[-96.1193,41.1486],[-96.1182,41.1489],[-96.1143,41.1476],[-96.1127,41.1543],[-96.1101,41.1542],[-96.1106,41.1631],[-96.1076,41.163],[-96.1074,41.1653],[-96.1054,41.1653],[-96.1053,41.167],[-96.1007,41.1671],[-96.1005,41.1544],[-96.0984,41.1544],[-96.0986,41.1567],[-96.0972,41.1616],[-96.0813,41.1616],[-96.0817,41.1596],[-96.0805,41.1569],[-96.0812,41.1544],[-96.0797,41.1543],[-96.0785,41.1567],[-96.0783,41.1601],[-96.077,41.1616],[-96.0746,41.1616],[-96.0746,41.167],[-96.0716,41.1646],[-96.0715,41.1663],[-96.0623,41.1617],[-96.0623,41.1575],[-96.0633,41.1548],[-96.0664,41.1543],[-96.067,41.1535],[-96.0662,41.1527],[-96.0679,41.15],[-96.067,41.1497],[-96.0656,41.1524],[-96.0632,41.1528],[-96.0631,41.1472],[-96.0671,41.1472],[-96.0677,41.1479],[-96.0671,41.1496],[-96.0679,41.1498],[-96.0686,41.1476],[-96.0814,41.1479],[-96.0815,41.1348],[-96.0821,41.1326],[-96.081,41.1326],[-96.0791,41.1344],[-96.0757,41.1339],[-96.0756,41.1324],[-96.0665,41.1325],[-96.0644,41.1311],[-96.0649,41.1325],[-96.0635,41.1325],[-96.0635,41.1363],[-96.0577,41.1363],[-96.0574,41.1325],[-96.0433,41.1325],[-96.0431,41.125],[-96.0412,41.125],[-96.0412,41.1264],[-96.0373,41.1283],[-96.0346,41.1324],[-96.0333,41.1325],[-96.0333,41.1317],[-96.0295,41.1317],[-96.0234,41.1325],[-96.0234,41.1346],[-96.0217,41.1346],[-96.0207,41.1363],[-96.0189,41.1363],[-96.0189,41.1436],[-96.0233,41.1437],[-96.0227,41.1472],[-96.0274,41.1472],[-96.0274,41.154],[-96.0237,41.1533],[-96.0237,41.1507],[-96.0215,41.1507],[-96.0215,41.1525],[-96.0226,41.1527],[-96.0234,41.1614],[-96.021,41.1615],[-96.021,41.155],[-96.0143,41.155],[-96.0136,41.1523],[-96.0062,41.151],[-95.9957,41.1515],[-95.9958,41.1544],[-95.9862,41.1539],[-95.9883,41.1562],[-95.9882,41.1621],[-96.0044,41.1619],[-96.0046,41.1653],[-96.0143,41.1653],[-96.0143,41.1619],[-96.0189,41.1619],[-96.0198,41.1651],[-96.0234,41.165],[-96.0234,41.1656]],[[-96.0804,41.1744],[-96.07,41.169],[-96.0716,41.169],[-96.0716,41.1677],[-96.0807,41.174],[-96.0804,41.1744]],[[-96.1194,41.1547],[-96.1171,41.1547],[-96.1164,41.1539],[-96.1166,41.1526],[-96.1195,41.1507],[-96.1194,41.1547]],[[-96.1405,41.1436],[-96.1395,41.1436],[-96.1394,41.1401],[-96.1486,41.1399],[-96.1487,41.1436],[-96.1405,41.1436]],[[-96.137,41.1194],[-96.1342,41.1194],[-96.1342,41.1183],[-96.137,41.1183],[-96.137,41.1194]],[[-96.0609,41.1617],[-96.0571,41.161],[-96.0599,41.1601],[-96.0591,41.1594],[-96.0607,41.159],[-96.0599,41.1585],[-96.0613,41.156],[-96.0621,41.1564],[-96.0618,41.1611],[-96.0609,41.1617]],[[-96.0432,41.1465],[-96.0432,41.1404],[-96.0522,41.1404],[-96.0524,41.1459],[-96.0477,41.1453],[-96.0432,41.1465]],[[-96.0725,41.1464],[-96.0737,41.1435],[-96.0764,41.1435],[-96.0764,41.147],[-96.0688,41.1465],[-96.0725,41.1464]],[[-96.0786,41.1466],[-96.0798,41.1464],[-96.0798,41.147],[-96.0786,41.1466]],[[-96.0524,41.1383],[-96.0521,41.1395],[-96.0477,41.1396],[-96.0477,41.136],[-96.0523,41.136],[-96.0524,41.1383]]]}},{"type":"Feature","properties":{"name":"La Vista","kind":"city"},"geometry":{"type":"Polygon","coordinates":[[[-96.0777,41.1736],[-96.0643,41.1655],[-96.0618,41.1648],[-96.0618,41.1763],[-96.0141,41.1761],[-96.0131,41.1768],[-96.0139,41.1816],[-96.0189,41.1817],[-96.019,41.1846],[-96.0142,41.1846],[-96.0131,41.1836],[-96.0105,41.1836],[-96.0105,41.1843],[-96.0094,41.1841],[-96.0094,41.1871],[-96.019,41.1871],[-96.019,41.1907],[-96.0622,41.1908],[-96.0628,41.1885],[-96.0622,41.1836],[-96.0686,41.1835],[-96.0716,41.1814],[-96.0693,41.1835],[-96.0765,41.1835],[-96.0767,41.1908],[-96.1105,41.1907],[-96.1106,41.1857],[-96.1083,41.1828],[-96.1133,41.1817],[-96.1191,41.1771],[-96.1134,41.1756],[-96.1101,41.176],[-96.1096,41.1738],[-96.1032,41.1735],[-96.1075,41.1689],[-96.0908,41.169],[-96.0908,41.17],[-96.0864,41.1701],[-96.0864,41.169],[-96.0812,41.169],[-96.081,41.176],[-96.0776,41.1761],[-96.0777,41.1736]],[[-96.0697,41.1761],[-96.0692,41.1692],[-96.0773,41.1736],[-96.0773,41.1761],[-96.0697,41.1761]]]}},{"type":"Feature","properties":{"name":"Bellevue","kind":"city"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-95.8898,41.1079],[-95.89,41.1093],[-95.8906,41.1084],[-95.89,41.1078],[-95.8907,41.1083],[-95.8941,41.1058],[-95.9054,41.1021],[-95.9082,41.0998],[-95.9075,41.0985],[-95.9086,41.0967],[-95.891,41.0972],[-95.8897,41.0991],[-95.8898,41.1079]]],[[[-95.8812,41.1221],[-95.889,41.1222],[-95.887,41.1216],[-95.8812,41.1221]]],[[[-95.9097,41.099],[-95.9098,41.0998],[-95.9119,41.1008],[-95.9148,41.1006],[-95.9246,41.1103],[-95.9276,41.1119],[-95.9269,41.1129],[-95.9264,41.1185],[-95.9264,41.1355],[-95.9215,41.1364],[-95.9194,41.1358],[-95.9085,41.1362],[-95.9085,41.135],[-95.9076,41.135],[-95.9076,41.1334],[-95.9043,41.1339],[-95.9045,41.1312],[-95.9073,41.128],[-95.9074,41.1247],[-95.8995,41.1252],[-95.8994,41.1188],[-95.8898,41.1189],[-95.8898,41.1268],[-95.8916,41.128],[-95.8915,41.1295],[-95.8883,41.1349],[-95.8883,41.1363],[-95.8872,41.1362],[-95.8879,41.1331],[-95.8833,41.133],[-95.8833,41.1322],[-95.8807,41.1319],[-95.875,41.1258],[-95.8706,41.1258],[-95.8722,41.1286],[-95.8765,41.133],[-95.8749,41.133],[-95.8815,41.1422],[-95.8831,41.1483],[-95.8829,41.1548],[-95.8862,41.155],[-95.8871,41.1593],[-95.8905,41.1596],[-95.891,41.1576],[-95.8921,41.1576],[-95.8919,41.1597],[-95.8932,41.1598],[-95.8929,41.1618],[-95.8969,41.1621],[-95.8969,41.1657],[-95.8993,41.1657],[-95.8993,41.1674],[-95.8977,41.168],[-95.8986,41.17],[-95.9064,41.1693],[-95.9064,41.1742],[-95.9036,41.1733],[-95.9036,41.1748],[-95.9094,41.1748],[-95.9094,41.1776],[-95.9175,41.1784],[-95.9175,41.1791],[-95.9187,41.1791],[-95.919,41.1823],[-95.9238,41.1829],[-95.9239,41.1874],[-95.9212,41.1884],[-95.9237,41.191],[-96.0092,41.1907],[-95.998,41.1776],[-95.9968,41.1739],[-95.9866,41.1742],[-95.9866,41.169],[-95.9768,41.169],[-95.9768,41.172],[-95.9753,41.172],[-95.9757,41.1745],[-95.9733,41.1745],[-95.9733,41.1757],[-95.9721,41.1757],[-95.972,41.1681],[-95.9694,41.1682],[-95.9694,41.1668],[-95.9673,41.1663],[-95.9675,41.1621],[-95.9719,41.1621],[-95.9718,41.1581],[-95.9604,41.1582],[-95.9599,41.1607],[-95.948,41.1592],[-95.9478,41.1583],[-95.9492,41.1583],[-95.9492,41.1566],[-95.9479,41.1566],[-95.9477,41.1475],[-95.9553,41.1469],[-95.9559,41.1463],[-95.954,41.1465],[-95.9539,41.1454],[-95.9474,41.1467],[-95.9474,41.1474],[-95.9394,41.1478],[-95.9393,41.1444],[-95.9406,41.1403],[-95.9437,41.1403],[-95.9477,41.1419],[-95.9472,41.1389],[-95.9529,41.1381],[-95.9529,41.1387],[-95.9639,41.141],[-95.9666,41.1428],[-95.9665,41.1487],[-95.9718,41.1496],[-95.9788,41.1469],[-95.9764,41.1456],[-95.9763,41.1431],[-95.986,41.143],[-95.986,41.1398],[-95.9906,41.1397],[-95.9905,41.1363],[-95.9953,41.1363],[-95.9952,41.1327],[-95.9916,41.1327],[-95.9938,41.1305],[-95.9953,41.1301],[-95.9954,41.1253],[-95.985,41.1255],[-95.9849,41.1291],[-95.9759,41.1291],[-95.9759,41.1283],[-95.978,41.1275],[-95.9765,41.1216],[-95.9668,41.1216],[-95.9667,41.1182],[-95.9681,41.1182],[-95.9685,41.1196],[-95.9694,41.1199],[-95.9713,41.1192],[-95.9714,41.1109],[-95.9762,41.1109],[-95.9762,41.1037],[-95.9666,41.1037],[-95.9664,41.0961],[-95.9568,41.0963],[-95.9569,41.1037],[-95.9521,41.1037],[-95.9521,41.1001],[-95.9544,41.1001],[-95.9544,41.0963],[-95.9496,41.0963],[-95.9496,41.0948],[-95.9472,41.0944],[-95.9472,41.0964],[-95.9424,41.0965],[-95.9424,41.1008],[-95.9376,41.1008],[-95.9367,41.1],[-95.9376,41.0965],[-95.9376,41.082],[-95.9358,41.082],[-95.9354,41.0806],[-95.9327,41.0801],[-95.9303,41.0784],[-95.9228,41.0784],[-95.9211,41.0811],[-95.9187,41.0808],[-95.9166,41.0844],[-95.9138,41.093],[-95.9112,41.093],[-95.909,41.0974],[-95.9086,41.0987],[-95.9097,41.099]],[[-95.9401,41.1834],[-95.9369,41.1835],[-95.9382,41.1802],[-95.9382,41.1772],[-95.9392,41.1762],[-95.9391,41.1747],[-95.9383,41.1747],[-95.9383,41.1728],[-95.937,41.1728],[-95.937,41.1716],[-95.9336,41.1716],[-95.9336,41.1709],[-95.937,41.1703],[-95.937,41.1693],[-95.9459,41.1698],[-95.9466,41.1714],[-95.9474,41.1714],[-95.9474,41.1728],[-95.9464,41.1728],[-95.9465,41.1737],[-95.9442,41.1737],[-95.9442,41.1721],[-95.9431,41.1721],[-95.9431,41.1729],[-95.9405,41.1729],[-95.9407,41.1764],[-95.94,41.1801],[-95.9394,41.1801],[-95.9401,41.1834]],[[-95.9398,41.1677],[-95.94,41.169],[-95.9336,41.1684],[-95.9336,41.1672],[-95.938,41.1671],[-95.9381,41.1622],[-95.9405,41.1619],[-95.9414,41.164],[-95.9408,41.1643],[-95.9429,41.1667],[-95.943,41.1676],[-95.9398,41.1677]],[[-95.9051,41.1435],[-95.9016,41.1428],[-95.9016,41.1413],[-95.9027,41.1413],[-95.9025,41.1395],[-95.9072,41.1395],[-95.9072,41.1421],[-95.9048,41.1412],[-95.9051,41.1435]],[[-95.9314,41.1397],[-95.928,41.1391],[-95.9271,41.1379],[-95.9269,41.1274],[-95.9348,41.127],[-95.9349,41.1363],[-95.934,41.1378],[-95.9317,41.1381],[-95.9314,41.1397]],[[-95.9367,41.1269],[-95.9367,41.1257],[-95.9378,41.1257],[-95.9377,41.1185],[-95.9484,41.1189],[-95.9569,41.1219],[-95.9664,41.1219],[-95.9664,41.1289],[-95.9613,41.1291],[-95.9613,41.1328],[-95.9563,41.1328],[-95.9562,41.1311],[-95.9457,41.1315],[-95.9457,41.1328],[-95.9426,41.1328],[-95.9427,41.1373],[-95.9448,41.1374],[-95.9456,41.1366],[-95.9457,41.1375],[-95.9456,41.1384],[-95.9429,41.1391],[-95.9378,41.136],[-95.9376,41.1329],[-95.9367,41.1329],[-95.9367,41.1269]],[[-95.9497,41.1188],[-95.9475,41.1183],[-95.9475,41.117],[-95.9509,41.1167],[-95.951,41.1193],[-95.9497,41.1188]],[[-95.9569,41.1192],[-95.9569,41.1182],[-95.9664,41.1182],[-95.9664,41.1217],[-95.957,41.1218],[-95.9562,41.1215],[-95.9569,41.1212],[-95.9569,41.1192]]]]}},{"type":"Feature","properties":{"name":"Gretna","kind":"city"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-96.2583,41.0886],[-96.2577,41.0907],[-96.2598,41.0905],[-96.2597,41.0886],[-96.2583,41.0886]]],[[[-96.1392,41.1691],[-96.1438,41.169],[-96.1438,41.1654],[-96.1468,41.1654],[-96.1474,41.1618],[-96.1582,41.1617],[-96.1582,41.1544],[-96.1775,41.1543],[-96.1774,41.1398],[-96.1966,41.1397],[-96.1966,41.1347],[-96.2012,41.1349],[-96.2011,41.1325],[-96.2251,41.1326],[-96.2252,41.1362],[-96.2306,41.136],[-96.231,41.1378],[-96.2301,41.1397],[-96.2252,41.1397],[-96.2252,41.1538],[-96.2263,41.1538],[-96.2253,41.1542],[-96.2253,41.1576],[-96.2342,41.151],[-96.2341,41.1558],[-96.2356,41.1543],[-96.2536,41.1543],[-96.2535,41.1442],[-96.2612,41.1451],[-96.2535,41.1441],[-96.2535,41.1426],[-96.2565,41.1426],[-96.2565,41.1395],[-96.2535,41.1395],[-96.2535,41.1368],[-96.2588,41.1295],[-96.263,41.1259],[-96.263,41.125],[-96.2581,41.125],[-96.2581,41.1177],[-96.2543,41.1177],[-96.2545,41.1106],[-96.2629,41.1105],[-96.2629,41.1031],[-96.2538,41.1031],[-96.2539,41.0931],[-96.2567,41.0924],[-96.256,41.0888],[-96.2581,41.0888],[-96.2581,41.0873],[-96.2548,41.0879],[-96.2548,41.0873],[-96.253,41.0873],[-96.253,41.0886],[-96.2483,41.0886],[-96.2482,41.096],[-96.25,41.0954],[-96.25,41.0969],[-96.2374,41.1032],[-96.2374,41.1037],[-96.2437,41.1035],[-96.2437,41.1001],[-96.253,41.1001],[-96.2506,41.1002],[-96.2506,41.1034],[-96.2525,41.1034],[-96.2529,41.1049],[-96.2528,41.1175],[-96.25,41.1178],[-96.25,41.1193],[-96.2485,41.1193],[-96.2485,41.1251],[-96.2477,41.1251],[-96.2469,41.1271],[-96.2473,41.1297],[-96.2438,41.1303],[-96.2438,41.129],[-96.2417,41.1282],[-96.2384,41.1289],[-96.2357,41.1284],[-96.2344,41.1291],[-96.2344,41.1251],[-96.2156,41.1253],[-96.2157,41.1193],[-96.217,41.1183],[-96.2191,41.1181],[-96.2166,41.1177],[-96.2121,41.1205],[-96.17,41.1361],[-96.1657,41.1398],[-96.1614,41.1449],[-96.1603,41.1481],[-96.1573,41.1495],[-96.153,41.1533],[-96.1423,41.1603],[-96.1396,41.1637],[-96.1352,41.1648],[-96.1301,41.169],[-96.1392,41.1691]]]]}}]}\ No newline at end of file
site_template.html +15 −2
@@ -15,6 +15,7 @@
15 --text-secondary: #52514e; 15 --text-secondary: #52514e;
16 --text-muted: #78766f; 16 --text-muted: #78766f;
17 --grid: #e8e6e1; 17 --grid: #e8e6e1;
18 --outline: #c9c6bd;
18 --series-1: #2a78d6; 19 --series-1: #2a78d6;
19 --series-2: #eb6834; 20 --series-2: #eb6834;
20 --seq-1: #cde2fb; --seq-2: #9ec5f4; --seq-3: #6da7ec; 21 --seq-1: #cde2fb; --seq-2: #9ec5f4; --seq-3: #6da7ec;
@@ -30,6 +31,7 @@
30 --text-secondary: #c3c2b7; 31 --text-secondary: #c3c2b7;
31 --text-muted: #96958c; 32 --text-muted: #96958c;
32 --grid: #2c2c28; 33 --grid: #2c2c28;
34 --outline: #45443e;
33 --series-1: #3987e5; 35 --series-1: #3987e5;
34 --series-2: #d95926; 36 --series-2: #d95926;
35 --seq-1: #104281; --seq-2: #184f95; --seq-3: #256abf; 37 --seq-1: #104281; --seq-2: #184f95; --seq-3: #256abf;
@@ -126,7 +128,7 @@ footer a { color: var(--text-secondary); }
126 <div class="legend" id="lg-map"></div> 128 <div class="legend" id="lg-map"></div>
127 <div id="c-map"></div> 129 <div id="c-map"></div>
128 </div> 130 </div>
129 <p class="note">Omaha is blank because Omaha PD publishes no stop data &mdash; the empty area is a gap in what the city reports, not an absence of stops. Camera locations come from OpenStreetMap, mapped by volunteers through the DeFlock project, and are certainly incomplete: Council Bluffs, Sarpy County and Douglas County together report 89 cameras on their own portals, and those three are not the only agencies running them.</p> 131 <p class="note">Outlines are city limits from Douglas County and Sarpy County GIS, with the Douglas County line dashed. Council Bluffs sits in Pottawattamie County, Iowa, which publishes neither, so it has no outline. Omaha is blank because Omaha PD publishes no stop data &mdash; the empty area is a gap in what the city reports, not an absence of stops. Camera locations come from OpenStreetMap, mapped by volunteers through the DeFlock project, and are certainly incomplete: Council Bluffs, Sarpy County and Douglas County together report 89 cameras on their own portals, and those three are not the only agencies running them.</p>
130</section> 132</section>
131 133
132<section> 134<section>
@@ -311,7 +313,8 @@ function table(id, cols, rows) {
311 const m = DATA.map; 313 const m = DATA.map;
312 if (!m || !m.cells.length) return; 314 if (!m || !m.cells.length) return;
313 const seq = ['--seq-1', '--seq-2', '--seq-3', '--seq-4', '--seq-5', '--seq-6'].map(v => `var(${v})`); 315 const seq = ['--seq-1', '--seq-2', '--seq-3', '--seq-4', '--seq-5', '--seq-6'].map(v => `var(${v})`);
314 legend('lg-map', [[seq[1], 'Fewer stops'], [seq[5], 'More stops'], [S2, 'ALPR camera']]); 316 legend('lg-map', [[seq[1], 'Fewer stops'], [seq[5], 'More stops'], [S2, 'ALPR camera'],
317 ['var(--outline)', 'City limits, Douglas County line']]);
315 // bounds must cover the cameras too, or they render outside the frame 318 // bounds must cover the cameras too, or they render outside the frame
316 const lats = m.cells.map(c => c[0]).concat(m.cameras.map(c => c[0])); 319 const lats = m.cells.map(c => c[0]).concat(m.cameras.map(c => c[0]));
317 const lons = m.cells.map(c => c[1]).concat(m.cameras.map(c => c[1])); 320 const lons = m.cells.map(c => c[1]).concat(m.cameras.map(c => c[1]));
@@ -334,6 +337,16 @@ function table(id, cols, rows) {
334 const q = p => counts[Math.floor(p * (counts.length - 1))]; 337 const q = p => counts[Math.floor(p * (counts.length - 1))];
335 const breaks = [q(.4), q(.65), q(.82), q(.93), q(.98)]; 338 const breaks = [q(.4), q(.65), q(.82), q(.93), q(.98)];
336 const colour = n => seq[breaks.filter(b => n > b).length]; 339 const colour = n => seq[breaks.filter(b => n > b).length];
340 // outlines first, so the data sits on top of them
341 (m.boundaries || []).forEach(b => {
342 const d = b.rings.map(r => r.map((pt, i) =>
343 `${i ? 'L' : 'M'}${x(pt[0]).toFixed(1)},${y(pt[1]).toFixed(1)}`).join(' ') + 'Z').join(' ');
344 plot.appendChild(el('path', { d, fill: 'none', stroke: 'var(--outline)',
345 'stroke-width': b.kind === 'county' ? 1.6 : 1,
346 'stroke-linejoin': 'round',
347 'stroke-dasharray': b.kind === 'county' ? '6 4' : 'none' }));
348 });
349
337 const cw = x(lon0 + m.cell) - x(lon0), ch = y(lat0) - y(lat0 + m.cell); 350 const cw = x(lon0 + m.cell) - x(lon0), ch = y(lat0) - y(lat0 + m.cell);
338 m.cells.forEach(([la, lo, n]) => { 351 m.cells.forEach(([la, lo, n]) => {
339 const r = el('rect', { x: x(lo), y: y(la + m.cell), width: Math.max(cw - 1, 1), 352 const r = el('rect', { x: x(lo), y: y(la + m.cell), width: Math.max(cw - 1, 1),