function process_geomap($MAPCFG, $map_name, &$map_config) { $params = $MAPCFG->getSourceParams(); list($image_name, $image_path, $data_path) = geomap_files($params); // Load the list of locations $locations = geomap_get_locations($params); // This source does not directly honor the existing map configs. It saves // the existing config to use it later for modifying some object parameters. // The existing map config must not create new objects. The truth about the // existing objects comes only from this source. $saved_config = $map_config; $map_config = array(); $iconset = $params['iconset']; list($icon_w, $icon_h) = iconset_size($iconset); // Adapt the global section $map_config[0] = $saved_config[0]; $map_config[0]['map_image'] = $image_name . '?' . time() . '.png'; $map_config[0]['iconset'] = $iconset; // Now add the objects to the map foreach ($locations as $loc) { $object_id = $MAPCFG->genObjId($loc['name']); $map_config[$object_id] = array('type' => 'host', 'host_name' => $loc['name'], 'iconset' => $iconset, 'object_id' => $object_id, 'alias' => $loc['alias'], 'lat' => $loc['lat'], 'long' => $loc['long']); if (isset($loc['backend_id'])) { $map_config[$object_id]['backend_id'] = array($loc['backend_id']); } } unset($locations); // Now apply the filters. Though the map can be scaled by the filtered hosts process_filter($MAPCFG, $map_name, $map_config, $params); // Terminate empty views if (count($map_config) <= 1) { throw new GeomapError(l('Got empty map after filtering. Terminate rendering geomap.')); } // Now detect the upper and lower bounds of the locations to display // Left/upper and right/bottom // north/south $min_lat = 90; $max_lat = -90; // east/west $min_long = 180; $max_long = -180; foreach ($map_config as $obj) { if ($obj['type'] == 'global') { continue; } if ($obj['lat'] < $min_lat) { $min_lat = $obj['lat']; } if ($obj['lat'] > $max_lat) { $max_lat = $obj['lat']; } if ($obj['long'] < $min_long) { $min_long = $obj['long']; } if ($obj['long'] > $max_long) { $max_long = $obj['long']; } } // Fix equal coordinates (Simply add some space on all sides) $min_lat -= $params['geomap_border']; $max_lat += $params['geomap_border']; $min_long -= $params['geomap_border']; $max_long += $params['geomap_border']; // FIXME: Too small min/max? What is the minimum bbox size? //echo $min_lat . ' - ' . $max_lat. ' - '. $mid_lat.'\n'; //echo $min_long . ' - ' . $max_long. ' - ' . $mid_long; if (!$params['width'] || !$params['height']) { throw new GeomapError(l('Missing mandatory "width" and "height" parameters."')); } // Using this API: http://pafciu17.dev.openstreetmap.org/ $url = cfg('global', 'geomap_server') . '?module=map' . '&width=' . $params['width'] . '&height=' . $params['height'] . '&type=' . $params['geomap_type']; // The geomap zoom seems to be something different than the nagvis zoom. Use // the dedicated geomap_zoom parameter if (isset($params['geomap_zoom']) && $params['geomap_zoom'] != '') { $mid_lat = ($min_lat + $max_lat) / 2; $mid_long = ($min_long + $max_long) / 2; $url .= '&zoom=' . $params['geomap_zoom'] . '¢er=' . $mid_long . ',' . $mid_lat; } else { $url .= '&bbox=' . $min_long . ',' . $max_lat . ',' . $max_long . ',' . $min_lat; } //file_put_contents('/tmp/123', $url); // Fetch the background image when needed if (!file_exists($image_path) || geomap_source_age($params) > filemtime($image_path)) { // Allow/enable proxy $contents = geomap_get_contents($url); file_put_contents($image_path, $contents); } // Fetch the map bounds when needed if (!file_exists($data_path) || geomap_source_age($params) > filemtime($data_path)) { // Get the lat/long of the image bounds. The api adds a border area to the // generated image. This is good since this makes the outer nodes not touch // the border of the image. But this makes calculation of the x/y coords // problematic. I found a parameter which tells us the long/lat coordinates // of the image bounds. // http://pafciu17.dev.openstreetmap.org/?module=map&bbox=6.66748,53.7278,14.5533,51.05&width=1500&height=557&type=osmarender&bboxReturnFormat=csv // 2.373046875,54.239550531562,18.8525390625,50.499452103968 $data_url = $url . '&bboxReturnFormat=csv'; $contents = geomap_get_contents($data_url); if (!$contents || ord($contents[0]) == 137 && ord($contents[1]) == 80 && ord($contents[2]) == 78) { // Got an png image as answer - catch this! throw new GeomapError(l('Got invalid response from "[U]". This is mostly caused by an unhandled request.', array('U' => $data_url))); } if (!preg_match('/^-?[0-9]+\\.?[0-9]*,-?[0-9]+\\.?[0-9]*,-?[0-9]+\\.?[0-9]*,-?[0-9]+\\.?[0-9]*$/i', $contents)) { throw new GeomapError(l('Got invalid data from "[U]": "[C]"', array('U' => $data_url, 'C' => json_encode($contents)))); } file_put_contents($data_path, $contents); $parts = explode(',', $contents); } else { $parts = explode(',', file_get_contents($data_path)); } $img_left = (double) $parts[0]; $img_top = (double) $parts[1]; $img_right = (double) $parts[2]; $img_down = (double) $parts[3]; $long_diff = $img_right - $img_left; $lat_diff = $img_top - $img_down; $long_para = $params['width'] / $long_diff; $lat_para = $params['height'] / $lat_diff; $lat_mult = $params['height'] / (ProjectF($img_top) - ProjectF($img_down)); // Now add the coordinates to the map objects foreach ($map_config as &$obj) { if (!isset($obj['lat'])) { continue; } // Calculate the lat (y) coords $obj['y'] = round((ProjectF($img_top) - ProjectF($obj['lat'])) * $lat_mult - $icon_h / 2); if ($obj['y'] < 0) { $obj['y'] = 0; } // Calculate the long (x) coords $obj['x'] = round($long_para * ($obj['long'] - $img_left) - $icon_w / 2); if ($obj['x'] < 0) { $obj['x'] = 0; } unset($obj['lat']); unset($obj['long']); } return true; // allow caching }
function automap_obj($MAPCFG, &$params, &$saved_config, $obj_name) { $obj = automap_obj_base($MAPCFG, $params, $saved_config, $obj_name); if ($obj_name === '<<<monitoring>>>') { $obj['host_name'] = 'Monitoring'; $obj['type'] = 'shape'; $obj['icon_size'] = array(22); $obj['icon'] = 'std_nagvis.png'; $obj['.width'] = 22; $obj['.height'] = 22; } else { $obj['type'] = 'host'; $obj['host_name'] = $obj_name; // Default to params iconset if (!isset($obj['iconset'])) { $obj['iconset'] = $params['iconset']; } if (!isset($obj['icon_size'])) { $obj['icon_size'] = $params['icon_size']; } if ($obj['icon_size']) { if (count($obj['icon_size']) == 1) { $w = (int) $obj['icon_size'][0]; $h = (int) $obj['icon_size'][0]; } else { $w = (int) $obj['icon_size'][0]; $h = (int) $obj['icon_size'][1]; } } else { // Calculate the size of the object for later auto positioning $size = iconset_size($obj['iconset']); $w = $size[0]; $h = $size[1]; } $obj['.width'] = $w; $obj['.height'] = $h; } $obj['label_show'] = $MAPCFG->getValue(0, 'label_show'); $obj['label_border'] = $MAPCFG->getValue(0, 'label_border'); $obj['label_background'] = $MAPCFG->getValue(0, 'label_background'); $obj['label_maxlen'] = $MAPCFG->getValue(0, 'label_maxlen'); // Header menu has z-index 100, this object's label the below+1 $obj['z'] = 98; $obj['.parents'] = array(); $obj['.childs'] = array(); return $obj; }