feat: enhance East Asia coverage with adversary bases, news sources, ICAO ranges, and PLAN vessel DB

- Add 68 military bases (PLA, Russia, DPRK, ROC, Philippines, Australia)
  with data-driven color coding (red/blue/green) on the map
- Add 6 news RSS feeds (Yonhap, Nikkei Asia, Taipei Times, Asia Times,
  Defense News, Japan Times) and 15 geocoding keywords for islands,
  straits, and disputed areas
- Extend ICAO country ranges for Russia, Australia, Philippines,
  Singapore, DPRK and add Russian aircraft classification (fighters,
  bombers, cargo, recon)
- Create PLAN/CCG vessel enrichment module (90+ ships) following
  yacht_alert pattern for automatic MMSI-based identification
- Update frontend types and popup styling for adversary/allied/ROC
  color distinction

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
adust09
2026-03-16 12:46:40 +09:00
parent 95da3015d9
commit 910d1fd633
14 changed files with 1467 additions and 11 deletions
@@ -197,6 +197,16 @@ export function buildDataCentersGeoJSON(datacenters?: DataCenter[]): FC {
// ─── Military Bases ─────────────────────────────────────────────────────────
// Classify base alignment: red = adversary, blue = US/allied, green = ROC
const _ADVERSARY_COUNTRIES = new Set(["China", "Russia", "North Korea"]);
const _ROC_COUNTRIES = new Set(["Taiwan"]);
function _baseSide(country: string, operator: string): "red" | "blue" | "green" {
if (_ADVERSARY_COUNTRIES.has(country)) return "red";
if (_ROC_COUNTRIES.has(country)) return "green";
return "blue";
}
export function buildMilitaryBasesGeoJSON(bases?: MilitaryBase[]): FC {
if (!bases?.length) return null;
return {
@@ -210,6 +220,7 @@ export function buildMilitaryBasesGeoJSON(bases?: MilitaryBase[]): FC {
country: base.country || '',
operator: base.operator || '',
branch: base.branch || '',
side: _baseSide(base.country || '', base.operator || ''),
},
geometry: { type: 'Point' as const, coordinates: [base.lng, base.lat] }
}))