{"database": "opsnap", "private": false, "path": "/opsnap", "size": 14282752, "tables": [{"name": "reports", "columns": ["id", "source_file", "source_page", "source_row", "month", "reporter_transport_mode", "vehicle_make", "vehicle_model", "vehicle_colour", "offence", "second_offence", "offence_location_raw", "offence_location", "council_area_raw", "council_area", "disposal", "nfa_rationale", "witness_contacted", "latitude", "longitude"], "primary_keys": ["id"], "count": 25627, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}, {"name": "sqlite_sequence", "columns": ["name", "seq"], "primary_keys": [], "count": 1, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}, {"name": "vehicle_registrations", "columns": ["make", "licensed_vehicles", "data_period", "source"], "primary_keys": ["make"], "count": 25, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}, {"name": "geocode_cache", "columns": ["location_key", "offence_location", "council_area", "query_sent", "latitude", "longitude", "display_name", "geocode_status", "created_at"], "primary_keys": ["location_key"], "count": 9938, "hidden": true, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": []}, "private": false}], "hidden_count": 1, "views": [], "queries": [{"title": "\ud83d\uddfa\ufe0f All offences on a map", "description_html": "Every geocoded offence plotted on a clustered map. Click a marker to see details. <strong>Zoom in</strong> to see individual offences.", "sql": "select offence_location as Location, council_area as [Council area], offence as Offence, disposal as Outcome, vehicle_make as Make, vehicle_model as Model, vehicle_colour as Colour, reporter_transport_mode as [Reported by], month as Month, latitude, longitude from reports where latitude is not null limit 5000", "name": "all-offences-map", "private": false}, {"title": "\ud83d\udeb6 Pavement parking hotspots", "description_html": "Locations with the most pavement parking and obstruction offences. These are reports where a vehicle was left in a dangerous position or caused unnecessary obstruction on a footpath.", "sql": "select r.offence_location as Location, r.council_area as [Council area], count(*) as [Total reports], round(100.0 * sum(case when r.disposal not in ('NFA', 'Duplicate Submission') then 1 else 0 end) / count(*), 0) as [Action rate %], r.latitude, r.longitude from reports r where (r.offence like '%obstruction%' or r.offence like '%dangerous position%') and r.offence_location is not null group by r.offence_location, r.council_area order by [Total reports] desc limit 100", "name": "pavement-parking-hotspots", "private": false}, {"title": "\ud83d\udccd Top reported locations", "description_html": "The 50 streets with the most Operation Snap submissions. Washwood Heath Road in Birmingham leads with 1,000 reports in 14 months.", "sql": "select offence_location as Location, council_area as [Council area], count(*) as [Total reports], sum(case when disposal in ('Fixed Penalty', 'Court') then 1 else 0 end) as [Fines/court], sum(case when disposal = 'Education' then 1 else 0 end) as Education, sum(case when disposal = 'Warning Letter' then 1 else 0 end) as [Warning letters], sum(case when disposal = 'NFA' then 1 else 0 end) as NFA, round(100.0 * sum(case when disposal != 'NFA' then 1 else 0 end) / count(*), 0) as [Action rate %] from reports where offence_location is not null group by offence_location, council_area order by [Total reports] desc limit 50", "name": "top-offence-locations", "private": false}, {"title": "\ud83d\ude97 Which car makes offend most? (normalised)", "description_html": "Offences per 100,000 registered vehicles of each make. Raw offence counts are misleading because Ford has 5.2 million vehicles on UK roads while Porsche has 238,000. This query normalises against <a href='https://howmanyleft.co.uk'>DVLA registration data</a> to show which makes are <em>disproportionately</em> reported.", "sql": "select r.vehicle_make as Make, count(*) as Offences, printf('%,d', vr.licensed_vehicles) as [UK registered vehicles], round(100000.0 * count(*) / vr.licensed_vehicles, 1) as [Offences per 100k], round(100.0 * sum(case when r.disposal not in ('NFA', 'Duplicate Submission') then 1 else 0 end) / count(*), 0) as [Action rate %] from reports r join vehicle_registrations vr on r.vehicle_make = vr.make where r.vehicle_make is not null group by r.vehicle_make order by [Offences per 100k] desc", "name": "vehicle-makes-per-100k", "private": false}, {"title": "\ud83d\ude97 Top vehicle makes (raw count)", "description_html": "Which vehicle makes appear most in offence reports by raw count. See <em>Which car makes offend most? (normalised)</em> for a fairer comparison that accounts for how many of each make are on the road.", "sql": "select vehicle_make as Make, count(*) as [Total reports], sum(case when disposal = 'Fixed Penalty' then 1 else 0 end) as Fines, sum(case when disposal = 'Court' then 1 else 0 end) as Court, sum(case when disposal = 'NFA' then 1 else 0 end) as NFA, round(100.0 * sum(case when disposal not in ('NFA', 'Duplicate Submission') then 1 else 0 end) / count(*), 0) as [Action rate %] from reports where vehicle_make is not null group by vehicle_make order by [Total reports] desc limit 30", "name": "vehicle-makes", "private": false}, {"title": "\ud83d\udcca Monthly trends", "description_html": "How submission volumes and outcomes have changed month by month. Are more people reporting? Is the action rate changing?", "sql": "select month as Month, count(*) as Total, sum(case when disposal = 'Education' then 1 else 0 end) as Education, sum(case when disposal = 'Warning Letter' then 1 else 0 end) as [Warning letter], sum(case when disposal = 'Fixed Penalty' then 1 else 0 end) as [Fixed penalty], sum(case when disposal = 'Court' then 1 else 0 end) as Court, sum(case when disposal = 'NFA' then 1 else 0 end) as NFA, round(100.0 * sum(case when disposal not in ('NFA', 'Duplicate Submission') then 1 else 0 end) / count(*), 0) as [Action rate %] from reports group by month order by month", "name": "disposal-breakdown-by-month", "private": false}, {"title": "\u26a0\ufe0f Offence types", "description_html": "All offence categories ranked by frequency. 'Driving without Due Care and Attention' is the most common, followed by pavement obstruction and red light offences.", "sql": "select offence as Offence, count(*) as [Total reports], round(100.0 * sum(case when disposal not in ('NFA', 'Duplicate Submission') then 1 else 0 end) / count(*), 0) as [Action rate %] from reports where offence is not null group by offence order by [Total reports] desc", "name": "offence-types", "private": false}, {"title": "\ud83c\udfdb\ufe0f Council area comparison", "description_html": "How do different council areas compare for submission volumes and action rates? Birmingham dominates by volume, but smaller areas may have different enforcement patterns.", "sql": "select council_area as [Council area], count(*) as [Total reports], sum(case when disposal = 'Education' then 1 else 0 end) as Education, sum(case when disposal = 'Warning Letter' then 1 else 0 end) as [Warning letter], sum(case when disposal = 'Fixed Penalty' then 1 else 0 end) as [Fixed penalty], sum(case when disposal = 'Court' then 1 else 0 end) as Court, sum(case when disposal = 'NFA' then 1 else 0 end) as NFA, round(100.0 * sum(case when disposal not in ('NFA', 'Duplicate Submission') then 1 else 0 end) / count(*), 0) as [Action rate %] from reports where council_area is not null and council_area != 'Out of Force Area' group by council_area order by [Total reports] desc", "name": "council-area-comparison", "private": false}, {"title": "\ud83d\udc41\ufe0f What different road users report", "description_html": "Pedestrians, cyclists, and drivers witness completely different offences. <strong>62% of pedestrian reports are pavement obstruction</strong> \u2014 they see a different city. Cyclists disproportionately report mobile phone use (22% of their submissions). Drivers mostly report careless driving and red light violations.", "sql": "select reporter_transport_mode as [Reporter type], offence as Offence, count(*) as Total from reports where reporter_transport_mode in ('Car', 'Pedestrian', 'Pedal Bike') group by reporter_transport_mode, offence having count(*) >= 10 order by reporter_transport_mode, Total desc", "name": "reporter-vs-offence", "private": false}, {"title": "\u274c Why reports get rejected", "description_html": "34% of submissions result in No Further Action. The <strong>14-day NIP rule</strong> (Notice of Intended Prosecution) is the single biggest factor \u2014 if police can't serve notice within 14 days, the case is void regardless of evidence quality. 'Out of Force' means the offence happened outside the West Midlands Police area.", "sql": "select nfa_rationale as Reason, count(*) as Reports, round(100.0 * count(*) / (select count(*) from reports where disposal = 'NFA'), 1) as [% of all NFA] from reports where disposal = 'NFA' and nfa_rationale is not null and nfa_rationale != '' group by nfa_rationale order by Reports desc", "name": "nfa-reasons", "private": false}, {"title": "\ud83d\udcf1 Mobile phone enforcement", "description_html": "What happens when someone reports a driver using their phone. With a <strong>65% fine rate</strong>, mobile phone use is the most aggressively penalised common offence. Only 27% result in no action. Submitting dashcam evidence of phone use genuinely works.", "sql": "select disposal as Outcome, count(*) as Reports, round(100.0 * count(*) / (select count(*) from reports where offence like '%Mobile Phone%'), 1) as [% of phone reports] from reports where offence like '%Mobile Phone%' group by disposal order by Reports desc", "name": "mobile-phone-enforcement", "private": false}, {"title": "\u26a0\ufe0f Dangerous driving outcomes", "description_html": "Dangerous driving reports have polarised outcomes. It has the <strong>highest court prosecution rate of any offence (36%)</strong>, but also a high NFA rate (38%). Cases either go to court or get dropped \u2014 there's very little middle ground.", "sql": "select disposal as Outcome, count(*) as Reports, round(100.0 * count(*) / (select count(*) from reports where offence = 'Dangerous Driving'), 1) as [% of total] from reports where offence = 'Dangerous Driving' group by disposal order by Reports desc", "name": "dangerous-driving-outcomes", "private": false}], "allow_execute_sql": true, "query_ms": 10.543707758188248, "source": "West Midlands Police", "source_url": "https://www.westmidlands.police.uk/police-forces/west-midlands-police/areas/campaigns/campaigns/operation-snap/", "license": "ODbL", "license_url": "https://openstreetmap.org/copyright"}