function FSBuild() { # Setup the inserts into chunks of 1000 $chunksOrig = 250; Airway::truncate(); $total = 0; $list = array(); $chunks = $chunksOrig; $this->line('Loading airways segments...'); $handle = fopen($this->option('fsbuild') . '/fsb_awy2.txt', 'r'); while ($line = fscanf($handle, "%s %s %s %s %s %s %s\n")) { if ($line[0][0] == ';') { continue; } list($airway, $seq, $ident, , , $airway_type) = $line; $list[] = compact('ident', 'airway', 'airway_type', 'seq'); $total++; if ($total == $chunks) { Airway::insert($list); $this->line('Inserted batch (' . $chunks . ')'); $list = array(); $chunks += $chunksOrig; } } Airway::insert($list); $this->line('Inserted batch (' . $chunks . ')'); fclose($handle); $this->line($total . ' airway segments loaded...'); $this->line('Loading VORs...'); $total = 0; $updated = 0; $updated_list = array(); $list = array(); $chunks = $chunksOrig; $handle = fopen($this->option('fsbuild') . '/fsb_vor.txt', 'r'); while ($lineinfo = fscanf($handle, "%s %s %s %s %s %s\n")) { if ($lineinfo[0][0] == ';') { continue; } list($ident, $name, $lat, $lon, $type, $freq) = $lineinfo; $lat = $this->coordinatesFSBuild($lat); $lon = $this->coordinatesFSBuild($lon); if (isset($this->navs[$ident])) { $latRange = $this->coordinateRange($lat); $lonRange = $this->coordinateRange($lon); foreach ($this->navs[$ident] as $existing) { if ($latRange[0] >= $existing['lat'] && $latRange[1] <= $existing['lat'] && $lonRange[0] >= $existing['lon'] && $existing['lon'] <= $lonRange[1]) { continue 2; } } } $name = ucwords(strtolower(str_replace('_', ' ', $name))); $type = 'V'; $freq *= 100; $list[] = compact('ident', 'name', 'lat', 'lon', 'freq', 'type'); if ($total == $chunks) { Waypoint::insert($list); $this->line('Inserted batch (' . $chunks . ')'); $list = array(); $chunks += $chunksOrig; } $total++; } Waypoint::insert($list); $this->line('Inserted batch (' . $chunks . ')'); fclose($handle); $this->line($total . ' VORs added, ' . $updated . ' updated'); $this->line('Loading NDBs...'); // Add NDBs $total = 0; $chunks = $chunksOrig; $list = array(); $handle = fopen($this->option('fsbuild') . '/fsb_ndb.txt', 'r'); while ($lineinfo = fscanf($handle, "%s %s %s %s %s %s\n")) { if ($lineinfo[0][0] == ';') { continue; } list($ident, $name, $lat, $lon, $type, $freq) = $lineinfo; $lat = $this->coordinatesFSBuild($lat); $lon = $this->coordinatesFSBuild($lon); if (isset($this->navs[$ident])) { $latRange = $this->coordinateRange($lat); $lonRange = $this->coordinateRange($lon); foreach ($this->navs[$ident] as $existing) { if ($latRange[0] >= $existing['lat'] && $latRange[1] <= $existing['lat'] && $lonRange[0] >= $existing['lon'] && $existing['lon'] <= $lonRange[1]) { continue 2; } } } $name = ucwords(strtolower(str_replace('_', ' ', $name))); $type = 'N'; $list[] = compact('ident', 'name', 'lat', 'lon', 'type', 'freq'); if ($total == $chunks) { Waypoint::insert($list); $this->line('Inserted batch (' . $chunks . ')'); $list = array(); $chunks += $chunksOrig; } $total++; } Waypoint::insert($list); $this->line('Inserted batch (' . $chunks . ')'); fclose($handle); $this->line($total . ' NDBs added, ' . $updated . ' updated'); $this->line('Loading SIDs...'); $handle = fopen($this->option('fsbuild') . '/fsb_sids.txt', 'r'); $currentAirport = null; $data = array(); $total = 0; fscanfe($handle, '%s %s %s %s\\n', function ($lineinfo) use(&$data, &$currentAirport, &$total) { if ($lineinfo[0][0] == ';' || $lineinfo[0][0] == '*' || is_null($lineinfo)) { return; } elseif ($lineinfo[0][0] == '[') { $currentAirport = substr($lineinfo[0], 1, -1); } elseif ($lineinfo[0] == 'T') { $total++; $data[$currentAirport . ':' . $lineinfo[1]] = array('airport' => $currentAirport, 'ident' => $lineinfo[1], 'runway' => $lineinfo[3], 'waypoints' => array()); } else { $data[$currentAirport . ':' . $lineinfo[0]]['waypoints'][] = $lineinfo[1]; } }); foreach ($data as $sid) { if (!array_key_exists('ident', $sid)) { continue; } $wpt = new DepApp(); $wpt->ident = $sid['ident']; $wpt->airport_id = $sid['airport']; $wpt->runway = $sid['runway']; $wpt->route = implode(' ', $sid['waypoints']); $wpt->type = 'D'; $sids[] = $wpt->toArray(); } $this->line($total . ' SIDs added'); fclose($handle); progressiveInsert(new DepApp(), $sids); $this->line('Loading STARs...'); $handle = fopen($this->option('fsbuild') . '/fsb_stars.txt', 'r'); $currentAirport = null; $data = array(); $total = 0; fscanfe($handle, '%s %s %s %s\\n', function ($lineinfo) use(&$data, &$currentAirport, &$total) { if ($lineinfo[0][0] == ';' || $lineinfo[0][0] == '*' || is_null($lineinfo)) { return; } elseif ($lineinfo[0][0] == '[') { $currentAirport = substr($lineinfo[0], 1, -1); } elseif ($lineinfo[0] == 'T') { $total++; $data[$currentAirport . ':' . $lineinfo[1]] = array('airport' => $currentAirport, 'ident' => $lineinfo[1], 'runway' => $lineinfo[3], 'waypoints' => array()); } else { $data[$currentAirport . ':' . $lineinfo[0]]['waypoints'][] = $lineinfo[1]; } }); foreach ($data as $star) { if (!array_key_exists('ident', $star)) { continue; } $wpt = new DepApp(); $wpt->ident = $star['ident']; $wpt->airport_id = $star['airport']; $wpt->runway = $star['runway']; $wpt->route = implode(' ', $star['waypoints']); $wpt->type = 'A'; $stars[] = $wpt->toArray(); } $this->line($total . ' STARs added'); fclose($handle); progressiveInsert(new DepApp(), $stars); }
protected function depapps($sid, $star, $departure, $arrival) { return DepApp::where(function ($dep) use($sid, $departure) { $dep->whereIdent($sid); $dep->whereType('D'); if (!is_null($departure)) { $dep->whereAirportId($departure); } })->orWhere(function ($arr) use($star, $arrival) { $arr->whereIdent($star); $arr->whereType('A'); if (!is_null($arrival)) { $arr->whereAirportId($arrival); } })->lists('route', 'ident'); }