Skip placeholder-coordinate postcodes (lat >= 90) in ONSPD import

ONS marks non-geographic postcodes (no grid reference) with a placeholder
latitude of 99.999999. The "Latest Centroids" export shipped ~12,789 such
rows, which were imported as real postcodes pointing at lat 99.99 and would
poison nearest-station distance maths. Drop them at ingest, with a test.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ovidiu U
2026-06-12 09:26:56 +01:00
parent cf373a85f9
commit fdcf253ca7
2 changed files with 22 additions and 0 deletions

View File

@@ -109,6 +109,13 @@ final class ImportPostcodes extends Command
continue; continue;
} }
// ONS marks non-geographic postcodes (no grid reference) with a
// placeholder latitude of 99.999999 — drop them so they don't
// poison nearest-station distance maths with a bogus location.
if (abs((float) $lat) >= 90) {
continue;
}
$pcd = strtoupper(preg_replace('/\s+/', '', (string) $row[$columns[$pcdColumn]])); $pcd = strtoupper(preg_replace('/\s+/', '', (string) $row[$columns[$pcdColumn]]));
if ($pcd === '' || strlen($pcd) < 5) { if ($pcd === '' || strlen($pcd) < 5) {

View File

@@ -63,6 +63,21 @@ CSV;
->and(Postcode::find('BT11AA'))->toBeNull(); ->and(Postcode::find('BT11AA'))->toBeNull();
}); });
it('skips postcodes with placeholder coordinates (no grid reference)', function (): void {
$csv = <<<'CSV'
pcd,pcds,doterm,lat,long
"SW1A1AA","SW1A 1AA","",51.501009,-0.141588
"GIR0AA","GIR 0AA","",99.999999,0.000000
CSV;
$path = writeOnspdFixture($csv);
$this->artisan('postcodes:import', ['--file' => $path])->assertSuccessful();
expect(Postcode::count())->toBe(1)
->and(Postcode::find('GIR0AA'))->toBeNull();
});
it('accepts ArcGIS ONSPD exports that use PCD7 instead of PCD', function (): void { it('accepts ArcGIS ONSPD exports that use PCD7 instead of PCD', function (): void {
$csv = <<<'CSV' $csv = <<<'CSV'
OBJECTID,PCD7,PCD8,PCDS,DOTERM,LAT,LONG,x,y OBJECTID,PCD7,PCD8,PCDS,DOTERM,LAT,LONG,x,y