fix(counties): make the cluster and the entry panel agree on a US county
An operator asked why K1SEI showed "Middlesex" in Info (F2) and "Lower
Connecticut River Valley" in the cluster. Two sources: the entry panel has
a callbook answer, a spot carries only a callsign so the cluster derives one
from the FCC licence ZIP through GeoNames — and GeoNames has followed the
Census in replacing Connecticut's counties with the 2022 planning regions.
No award, callbook or log uses those, so every CT station matched nothing:
new county for ever, and counting toward nothing.
Measured against a full ULS import (1 556 444 US callsigns), 23 223 resolved
to a name the USA-CA reference does not contain. Three causes, three fixes:
- Spelling. "City and County of San Francisco", "Baltimore (city)",
"Nome (CA)", plus counties renamed since the award list was drawn
(Kusilvak, Oglala Lakota, the Valdez-Cordova split) and Alaska's four
"X City and Borough", whose reference codes read "JUNEAUCITYAND" because
the county-type suffix strip eats the wrong end. Normalised in
award.USCountyKey, which both sides already go through. 7 515 callsigns,
no re-download needed.
- Doña Ana, NM shipped into the reference as "NM/DO̱AANA" — mangled by a
non-UTF-8 CSV line, a code nothing could ever produce, so that county was
unwinnable and silent about it. Row repaired, cntygen now refuses such a
line, and a test makes every one of the 3 102 references reproduce its own
code from its own name.
- Connecticut. A planning region is drawn from towns in several counties, so
no name maps to a name — only the ZIP can resolve it. cmd/ctzipgen builds
the table from the Census 2020 crosswalk, filling PO-box-only ZIPs from the
nearest resolved centroid; all 11 ZIPs GeoNames still labels with a real
county agree with the result. 15 037 callsigns, applied at import, so the
store now carries a rules version and Settings says when a re-download is
needed.
Alignment itself is the last piece: a spot now shows the county the station is
logged with when we have one, and falls back to the ZIP-derived county only for
stations never worked.
This commit is contained in:
@@ -2265,6 +2265,52 @@ func (r *Repo) WorkedCountyKeys(ctx context.Context, keyFn func(state, cnty stri
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
// CallCounties returns callsign → "STATE,County" for every US station already
|
||||
// logged with a county, newest QSO winning.
|
||||
//
|
||||
// It exists so the cluster shows the SAME county the entry panel does. The
|
||||
// entry panel gets its county from a callbook, which knows where the licensee
|
||||
// actually lives; a spot carries only a callsign, so the cluster falls back to
|
||||
// deriving one from the FCC licence address, which is right about 98% of the
|
||||
// time. Where the log already holds a callbook's answer for that station, the
|
||||
// two panels disagreeing is pure noise — this is what lets the better answer
|
||||
// win in both.
|
||||
//
|
||||
// One DISTINCT scan when the cluster snapshot is rebuilt, then map lookups per
|
||||
// spot, like the worked-county and worked-grid sets beside it.
|
||||
func (r *Repo) CallCounties(ctx context.Context) (map[string]string, error) {
|
||||
rows, err := r.db.QueryContext(ctx,
|
||||
`SELECT callsign, COALESCE(state,''), COALESCE(cnty,'') FROM qso
|
||||
WHERE dxcc IN (291,110,6) AND cnty IS NOT NULL AND cnty != ''
|
||||
ORDER BY qso_date, time_on`)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
out := make(map[string]string, 1024)
|
||||
for rows.Next() {
|
||||
var call, state, cnty string
|
||||
if err := rows.Scan(&call, &state, &cnty); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
call = strings.ToUpper(strings.TrimSpace(call))
|
||||
cnty = strings.TrimSpace(cnty)
|
||||
if call == "" || cnty == "" {
|
||||
continue
|
||||
}
|
||||
// Store the ADIF "STATE,County" shape whatever the log holds, so the
|
||||
// caller has both halves without a second column.
|
||||
if !strings.Contains(cnty, ",") {
|
||||
if state = strings.TrimSpace(state); state == "" {
|
||||
continue
|
||||
}
|
||||
cnty = state + "," + cnty
|
||||
}
|
||||
out[call] = cnty
|
||||
}
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
// CountyWorked reports whether one US county has already been worked.
|
||||
//
|
||||
// It exists so the entry panel can flag a new county without loading the whole
|
||||
|
||||
Reference in New Issue
Block a user