Add airports

This commit is contained in:
2026-04-03 14:16:16 +10:00
parent 4366c8f6ea
commit 8ec4e92541
2 changed files with 161 additions and 0 deletions
@@ -0,0 +1,128 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('airports', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->decimal('latitude_deg', 10, 6);
$table->decimal('longitude_deg', 10, 6);
$table->integer('elevation_ft')->nullable();
$table->foreignId('region_id')->constrained('regions');
$table->string('municipality')->nullable();
$table->string('icao_code')->nullable();
$table->string('iata_code')->nullable();
$table->string('local_code')->nullable();
$table->string('type');
$table->timestamps();
});
$this->importCsv();
}
public function down(): void
{
Schema::dropIfExists('airports');
}
private function importCsv(): void
{
$path = storage_path('app/private/seed_data/airports.csv');
if (! file_exists($path)) {
throw new \RuntimeException("Airports CSV not found at: {$path}");
}
$handle = fopen($path, 'rb');
if ($handle === false) {
throw new \RuntimeException("Failed to open airports CSV at: {$path}");
}
// Skip header row
fgetcsv($handle);
$regionMap = DB::table('regions')->pluck('id', 'code')->all();
$batch = [];
$batchSize = 500;
$now = now()->toDateTimeString();
while (($row = fgetcsv($handle)) !== false) {
if (count($row) < 19) {
continue;
}
// id, ident, type, name, latitude_deg, longitude_deg, elevation_ft,
// continent, iso_country, iso_region, municipality, scheduled_service,
// icao_code, iata_code, gps_code, local_code, home_link, wikipedia_link, keywords
[
,
,
$type,
$name,
$latitudeDeg,
$longitudeDeg,
$elevationFt,
,
,
$isoRegion,
$municipality,
,
$icaoCode,
$iataCode,
,
$localCode,
] = $row;
$icaoCode = trim(str_replace(["\r", "\n"], '', $icaoCode));
$iataCode = trim(str_replace(["\r", "\n"], '', $iataCode));
// Skip rows without at least one of iata or icao
if ($icaoCode === '' && $iataCode === '') {
continue;
}
$isoRegion = trim($isoRegion);
if (! isset($regionMap[$isoRegion])) {
continue;
}
$elevationFt = trim($elevationFt);
$batch[] = [
'type' => trim($type),
'name' => trim($name),
'latitude_deg' => (float) trim($latitudeDeg),
'longitude_deg' => (float) trim($longitudeDeg),
'elevation_ft' => $elevationFt !== '' ? (int) $elevationFt : null,
'region_id' => $regionMap[$isoRegion],
'municipality' => trim($municipality) !== '' ? trim($municipality) : null,
'icao_code' => $icaoCode !== '' ? $icaoCode : null,
'iata_code' => $iataCode !== '' ? $iataCode : null,
'local_code' => trim($localCode) !== '' ? trim($localCode) : null,
'created_at' => $now,
'updated_at' => $now,
];
if (count($batch) >= $batchSize) {
DB::table('airports')->insert($batch);
$batch = [];
}
}
fclose($handle);
if (! empty($batch)) {
DB::table('airports')->insert($batch);
}
}
};