Arsitektur 1 Dashboard, 1 Port (:8000)

AIS Suite mengonsolidasikan 3 penyedia AIS terkemuka (MarineTraffic, MyShipTracking, AISStream) ke dalam satu port tunggal (default :8000). Seluruh komunikasi data antar engine dan dashboard menggunakan direct database access via SQLAlchemy pool, meniadakan latensi dan risiko kegagalan proxy HTTP internal.

Spesifikasi Layanan

KomponenKeterangan
Port Layananhttp://0.0.0.0:8000 (Env: APP_PORT)
Dashboard UI/ atau /dashboard
Tile Server URL/tiles/{z}/{x}/{y}.png?provider={provider}
RESTful API/api/v1/*
Interactive Docs/docs (Swagger UI) & /docs/manual

Katalog Provider Data

Parameter provider dapat disematkan di seluruh endpoint tiles dan API:

Nilai ProviderSumber DataMetode PenarikanWarna Indikator
all (default)Multi-Source AgregatDedup realtime dari ketiga DB● Biru Terang
mtMarineTrafficPlaywright Scraper + Chrome CDP :9222● Biru Laut
mstMyShipTrackingHTTP Requests (TSV Bounding Box)● Oranye
streamAISStreamWebSocket Live (stream.aisstream.io)● Hijau Emerald

Integrasi Tileserver (Slippy Map Standard)

Tileserver menghasilkan PNG 256x256 Web Mercator transparan. Simbol kapal otomatis dirotasi sesuai heading / course dan diberi warna sesuai tipe kapal.

1. Pemasangan di Leaflet JS

// Inisialisasi peta Leaflet
const map = L.map('map').setView([-2.5, 118.0], 6);

// 1. Basemap peta dasar (Dark matter)
L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png', {
  attribution: '© CartoDB', maxZoom: 19
}).addTo(map);

// 2. AIS Suite Tile Layer armada kapal
const aisLayer = L.tileLayer('http://localhost:8000/tiles/{z}/{x}/{y}.png?provider=all&shiptype=7', {
  maxZoom: 18,
  tileSize: 256,
  attribution: '© AIS Suite Indonesia'
}).addTo(map);

2. Pemasangan di MapLibre GL / Mapbox GL

const map = new maplibregl.Map({
  container: 'map',
  style: 'https://demotiles.maplibre.org/style.json',
  center: [118.0, -2.5],
  zoom: 5
});

map.on('load', () => {
  // Tambahkan raster source untuk tile AIS
  map.addSource('ais-fleet-tiles', {
    type: 'raster',
    tiles: ['http://localhost:8000/tiles/{z}/{x}/{y}.png?provider=all'],
    tileSize: 256
  });

  map.addLayer({
    id: 'ais-fleet-layer',
    type: 'raster',
    source: 'ais-fleet-tiles',
    minzoom: 0,
    maxzoom: 20
  });
});

RESTful API Data Kapal

GET /api/v1/ships

Mengambil daftar kapal dalam format JSON terstruktur dengan opsi paginasi dan filter spasial.

ParameterTipeDeskripsi
providerstringmt | mst | stream | all (default: all)
regionstringwest | central | east
shiptypestring7 (Cargo), 8 (Tanker), 2 (Fishing), dll.
flagstringKode bendera negara (contoh: ID, SG, PA)
lat, lon, radius_kmfloatPencarian kapal dalam radius N km dari titik koordinat
limit, offsetintLimit per halaman (default: 100, maks: 2000)

GET /api/v1/ships/map

Menghasilkan GeoJSON FeatureCollection lengkap dengan properti kapal untuk visualisasi langsung di client-side renderer.

curl -s "http://localhost:8000/api/v1/ships/map?provider=mt®ion=west" | jq .

Pencarian kapal berdasarkan substring nama kapal atau kecocokan nomor MMSI.

curl -s "http://localhost:8000/api/v1/ships/search?q=PERTAMINA&provider=all" | jq .

Endpoint Perbandingan (Backward-Compatible)

Endpoint yang mendukung perbandingan multi-source side-by-side:

  • GET /api/sources: Status dan jumlah kapal aktif dari MT, MST, dan AISStream.
  • GET /api/ship?id={mmsi}: Menampilkan data telemetri kapal yang sama di ketiga database secara berdampingan.
  • GET /api/search?q={name}: Pencarian yang dikelompokkan per provider.
  • GET /api/track?id={mmsi}&source={provider}: Riwayat koordinat perjalanan dari sumber tertentu.