mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
fix(firms): reject missing and out-of-range detection coordinates
This commit is contained in:
1 parent
0265ad4c19
commit
8b68ff8412
5 files changed
+58
-2
No files matched your search
@@ -32,6 +32,7 @@
|
|||||||
- Tool string length validation counts Unicode characters correctly, including characters outside the basic multilingual plane.
|
- Tool string length validation counts Unicode characters correctly, including characters outside the basic multilingual plane.
|
||||||
|
|
||||||
- Director timeline seeks cross the dateline along the short longitude arc.
|
- Director timeline seeks cross the dateline along the short longitude arc.
|
||||||
|
- Fire detections with missing or impossible positions are skipped while genuine zero coordinates remain valid.
|
||||||
|
|
||||||
- Treat explicitly current, complete empty vessel coverage as a successful update,
|
- Treat explicitly current, complete empty vessel coverage as a successful update,
|
||||||
clearing obsolete contacts while retaining stale or incomplete snapshots.
|
clearing obsolete contacts while retaining stale or incomplete snapshots.
|
||||||
|
|||||||
@@ -5326,3 +5326,8 @@ datacenters, dams and the Nepal locator retain that shared credit while displaye
|
|||||||
|
|
||||||
Military fragments stitch by source identity. Different mapped parcels merge only
|
Military fragments stitch by source identity. Different mapped parcels merge only
|
||||||
when their footprints touch or contain one another, never across a seam tolerance gap.
|
when their footprints touch or contain one another, never across a seam tolerance gap.
|
||||||
|
|
||||||
|
|
||||||
|
### fix(firms): reject missing and out-of-range detection coordinates
|
||||||
|
|
||||||
|
Require explicit numeric coordinate evidence and WGS84 ranges in both ingestion paths, preserving genuine zero coordinates and sequential admitted detection indices.
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { parseFirmsCsv } from './firmsCsv.js';
|
||||||
|
import { adaptFirmsRecords } from './firmsAdapt.js';
|
||||||
|
test('missing positions do not become fire detections at zero coordinates', () => {
|
||||||
|
const csv =
|
||||||
|
'latitude,longitude,acq_date,acq_time,confidence,frp\n,1,2026-07-16,1200,n,1\n1, ,2026-07-16,1200,n,1\n95,1,2026-07-16,1200,n,1\n1,181,2026-07-16,1200,n,1\n0,0,2026-07-16,1200,n,1\n-90,-180,2026-07-16,1200,n,1';
|
||||||
|
assert.deepEqual(
|
||||||
|
parseFirmsCsv(csv).map((r) => [r.lat, r.lon]),
|
||||||
|
[
|
||||||
|
[0, 0],
|
||||||
|
[-90, -180],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
const records = [
|
||||||
|
{ lat: null, lon: 1 },
|
||||||
|
{ lat: '', lon: 1 },
|
||||||
|
{ lat: false, lon: 1 },
|
||||||
|
{ lat: 95, lon: 1 },
|
||||||
|
{ lat: 1, lon: 181 },
|
||||||
|
{ lat: '0', lon: 0 },
|
||||||
|
{ lat: -90, lon: -180 },
|
||||||
|
];
|
||||||
|
assert.deepEqual(
|
||||||
|
adaptFirmsRecords(records).map((r) => [r.index, r.lat, r.lon]),
|
||||||
|
[
|
||||||
|
[0, 0, 0],
|
||||||
|
[1, -90, -180],
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
+12
-1
@@ -21,7 +21,18 @@ export function adaptFirmsRecords(records) {
|
|||||||
for (const record of records) {
|
for (const record of records) {
|
||||||
const lat = Number(record?.lat);
|
const lat = Number(record?.lat);
|
||||||
const lon = Number(record?.lon);
|
const lon = Number(record?.lon);
|
||||||
if (!Number.isFinite(lat) || !Number.isFinite(lon)) continue;
|
if (
|
||||||
|
![record?.lat, record?.lon].every(
|
||||||
|
(value) =>
|
||||||
|
typeof value === 'number' ||
|
||||||
|
(typeof value === 'string' && value.trim() !== ''),
|
||||||
|
) ||
|
||||||
|
!Number.isFinite(lat) ||
|
||||||
|
!Number.isFinite(lon) ||
|
||||||
|
Math.abs(lat) > 90 ||
|
||||||
|
Math.abs(lon) > 180
|
||||||
|
)
|
||||||
|
continue;
|
||||||
fires.push({
|
fires.push({
|
||||||
index: fires.length,
|
index: fires.length,
|
||||||
lat,
|
lat,
|
||||||
|
|||||||
@@ -105,7 +105,15 @@ export function parseFirmsCsv(text) {
|
|||||||
if (parts.length < header.length) continue; // malformed row — skip
|
if (parts.length < header.length) continue; // malformed row — skip
|
||||||
const lat = Number(parts[iLat]);
|
const lat = Number(parts[iLat]);
|
||||||
const lon = Number(parts[iLon]);
|
const lon = Number(parts[iLon]);
|
||||||
if (!Number.isFinite(lat) || !Number.isFinite(lon)) continue;
|
if (
|
||||||
|
!parts[iLat].trim() ||
|
||||||
|
!parts[iLon].trim() ||
|
||||||
|
!Number.isFinite(lat) ||
|
||||||
|
!Number.isFinite(lon) ||
|
||||||
|
Math.abs(lat) > 90 ||
|
||||||
|
Math.abs(lon) > 180
|
||||||
|
)
|
||||||
|
continue;
|
||||||
|
|
||||||
records.push({
|
records.push({
|
||||||
lat,
|
lat,
|
||||||
|
|||||||
Reference in new issue
Block a user