load->model('staticmap_model'); $this->load->model('stationsetup_model'); $this->load->model('visitor_model'); $slug = $this->security->xss_clean($slug); if ($slug == '') { show_404(__("Unknown Public Page.")); } // check if the public slug exists $logbook_id = $this->stationsetup_model->public_slug_exists_logbook_id($slug); if ($logbook_id == false) { show_404(__("Unknown Public Page.")); } // Optional override-parameters $band = $this->input->get('band', TRUE) ?? 'nbf'; $continent = $this->input->get('continent', TRUE) ?? 'nC'; $thememode = $this->input->get('theme', TRUE) ?? null; $hide_home = $this->input->get('hide_home', TRUE) == 1 ? true : false; /** * Based on Export Settings -> Overlays and QSO Count */ // qsocount $qsocount = $this->input->get('qsocount', TRUE) ?? ''; // if the qso count is not a number, set it to the user option or 250 per default (same as used in stationsetup) $uid = $this->stationsetup_model->getContainer($logbook_id, false)->row()->user_id; if ($qsocount == 0 || !is_numeric($qsocount)) { $qsocount = $this->user_options_model->get_options('ExportMapOptions', array('option_name' => 'qsocount', 'option_key' => $slug), $uid)->row()->option_value ?? 250; } // Night shadow $night_shadow = $this->input->get('ns', TRUE) ?? ''; if ($night_shadow == '' || ($night_shadow != 1 && $night_shadow != 0)) { $r = $this->user_options_model->get_options('ExportMapOptions', array('option_name' => 'nightshadow_layer', 'option_key' => $slug), $uid)->row()->option_value ?? ''; $night_shadow = $r == 'true' ? true : false; } // Pathlines $pathlines = $this->input->get('pl', TRUE) ?? ''; if ($pathlines == '' || ($pathlines != 1 && $pathlines != 0)) { $r = $this->user_options_model->get_options('ExportMapOptions', array('option_name' => 'path_lines', 'option_key' => $slug), $uid)->row()->option_value ?? ''; $pathlines = $r == 'true' ? true : false; } // CQ Zones $cqzones = $this->input->get('cqz', TRUE) ?? ''; if ($cqzones == '' || ($cqzones != 1 && $cqzones != 0)) { $r = $this->user_options_model->get_options('ExportMapOptions', array('option_name' => 'cqzones_layer', 'option_key' => $slug), $uid)->row()->option_value ?? ''; $cqzones = $r == 'true' ? true : false; } // ITU Zones $ituzones = $this->input->get('ituz', TRUE) ?? ''; if ($ituzones == '' || ($ituzones != 1 && $ituzones != 0)) { $r = $this->user_options_model->get_options('ExportMapOptions', array('option_name' => 'ituzones_layer', 'option_key' => $slug), $uid)->row()->option_value ?? ''; $ituzones = $r == 'true' ? true : false; } // handling the theme mode $this->load->model('themes_model'); if ($thememode == null || $thememode == '' || ($thememode != 'dark' && $thememode != 'light')) { $r = $this->themes_model->get_theme_mode($this->optionslib->get_option('option_theme')); $thememode = $r; } // prepare the cache directory $cachepath = $this->config->item('cache_path') == '' ? APPPATH . 'cache/' : $this->config->item('cache_path'); $cacheDir = $cachepath . "staticmap_images/"; if (!is_dir($cacheDir)) { mkdir($cacheDir, 0755, true); } // we need the realpath later for validation $cacheDir = realpath($cachepath . "staticmap_images/"); // create a unique filename for the cache $filenameRaw = $uid . $logbook_id . $qsocount . $band . $thememode . $continent . $hide_home . ($night_shadow == false ? 0 : 1) . ($pathlines == false ? 0 : 1) . ($cqzones == false ? 0 : 1) . ($ituzones == false ? 0 : 1); $filename = crc32('staticmap_' . $slug) . '_' . substr(md5($filenameRaw), 0, 12) . '.png'; $filepath = $cacheDir . '/' . $filename; // Set the cache time to 7 days $maxAge = 3600 * 24 * 7; // remove the cached image for debugging purposes if ($debugging) { if (is_file($filepath)) { unlink($filepath); } } if ($this->staticmap_model->validate_cached_image($filepath, $cacheDir, $maxAge, $slug)) { log_message('debug', 'Static map image found in cache: ' . $filename); header('Content-Type: image/png'); readfile($filepath); return; } else { if (in_array('gd', get_loaded_extensions())) { if ($logbook_id != false) { // Get associated station locations for mysql queries $logbooks_locations_array = $this->stationsetup_model->get_container_relations($logbook_id); if (!$logbooks_locations_array) { show_404(__("Empty Logbook")); } } else { log_message('error', $slug . ' has no associated station locations'); show_404(__("Unknown Public Page.")); } // we need to get an array of all coordinates of the stations if (!$this->load->is_loaded('logbook_model')) { $this->load->model('logbook_model'); } $grids = []; foreach ($logbooks_locations_array as $location) { $station_info = $this->logbook_model->check_station($location); if ($station_info) { $grids[] = $station_info['station_gridsquare']; } } if (!$this->load->is_loaded('Qra')) { $this->load->library('Qra'); } $coordinates = []; foreach ($grids as $grid) { $coordinates[] = $this->qra->qra2latlong($grid); } $centerMap = $this->qra->getCenterLatLng($coordinates); $qsos = $this->visitor_model->get_qsos($qsocount, $logbooks_locations_array, $band == 'nbf' ? '' : $band, $continent == 'nC' ? '' : $continent); // TODO: Allow 'all' option $image = $this->staticmap_model->render_static_map($qsos, $uid, $centerMap, $coordinates, $filepath, $continent, $thememode, $hide_home, $night_shadow, $pathlines, $cqzones, $ituzones); header('Content-Type: image/png'); if ($image == false) { $msg = "Can't create static map image. Something went wrong."; log_message('error', $msg); show_404($msg); } else { readfile($filepath); } } else { $msg = "Can't create static map image. Extention 'php-gd' is not installed. Install it and restart the webserver."; log_message('error', $msg); echo $msg; } } } }