Honest pins and paths: geocode precision, type-gated paths, impossible-speed stops (#236)

Backend: _geocode_location now returns {lat, lng, location_type}, so the
precision rides onto the call doc and, unchanged via _resolve_location_pair,
onto the incident pin. Display-only: every correlator read indexes lat/lng.

Frontend: pins styled by precision (rooftop / interpolated ring /
GEOMETRIC_CENTER dashed uncertainty circle labelled with the spoken place /
unverified pre-#23 pins ghosted). liveWall.pathStops() is shared by the map
and the call spine: only police/accident incidents with a pursuit tag draw a
numbered path; others get unnumbered call dots. Segments over >10 min gaps or
talkgroup changes are dashed, stops implying >8 km/min are ghosted off the
path, paths >20 km get a "may be merged" badge. New optional MapView prop
pulseIncidentIds (wired by #238).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Logan Cusano
2026-10-05 03:28:00 -04:00
co-authored by Claude Opus 5.5
parent 6e462720a1
commit 6bf072973c
7 changed files with 499 additions and 74 deletions
+22 -2
View File
@@ -344,6 +344,20 @@ export interface TranscriptSegment {
text: string;
}
/**
* Google Geocoding precision, persisted with the coords since server-26#236.
* ROOFTOP = a street address; RANGE_INTERPOLATED = estimated between two
* address points; GEOMETRIC_CENTER = the centre of a road, intersection or
* named place — can be hundreds of metres off. Absent on older docs.
*/
export type GeoLocationType = "ROOFTOP" | "RANGE_INTERPOLATED" | "GEOMETRIC_CENTER";
export interface GeoPoint {
lat: number;
lng: number;
location_type?: GeoLocationType | string | null;
}
export interface CallRecord {
call_id: string;
node_id: string;
@@ -370,7 +384,7 @@ export interface CallRecord {
incident_id?: string | null;
location: string | null;
/** Per-call geocode, written by intelligence.py. Powers the incident-path polyline on the map. */
location_coords?: { lat: number; lng: number } | null;
location_coords?: GeoPoint | null;
/** Unit callsigns mentioned in this specific transmission (e.g. "15-9", "E-41"). */
units?: string[];
vehicles?: string[];
@@ -403,7 +417,13 @@ export interface IncidentRecord {
type: string | null;
status: "active" | "resolved";
location: string | null;
location_coords: { lat: number; lng: number } | null;
location_coords: GeoPoint | null;
/**
* The label the pin was geocoded from (server-26#23). Absent on incidents
* written before that fix — their pin cannot be tied to their label and is
* drawn ghosted (DEFERRED.md `_verified_pin` row, server-26#28).
*/
location_coords_source?: string | null;
call_ids: string[];
system_ids: string[];
talkgroup_ids: string[];