-
Notifications
You must be signed in to change notification settings - Fork 0
/
inc.cargarCoordenadas.php
152 lines (140 loc) · 6.76 KB
/
inc.cargarCoordenadas.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php
/**
* Utilizando la lógica del SASS-C, busca un fichero recording_details.par y
* obtiene los radares configurados para la evaluación. Luego busca en el
* directorio donde estén definidos todos los radares y extrae, dependiendo
* de $parse_all, o bien de todos o bien de sólo los definidos en la
* evaluación, un array con la información.
*
* @param string $eval_dir Directorio donde está configurada la evaluación
* @param bool $parse_all Ignora recording_details.par y lee todos los
* radares definidos
*
* @return array Listado de radares configurado
*/
function getRadars($eval_dir, $parse_all = false) {
$radars = array();
if ( !file_exists($eval_dir) ) {
logger(" E> El path >$eval_dir< no existe"); exit(-1);
}
if ( false === $parse_all) {
// obtenemos el nombre del fichero que contiene todos los radares activos en la evaluación
exec("/usr/bin/find $eval_dir -name \"recording_details.par\" | grep -v \"\\.eva\" | grep -v \"\\.cfg\" 2> /dev/null", $recording_details_file);
if ( 0 == count($recording_details_file) ) {
die("ERROR couldn't find recording_details.par inside $eval_dir" . PHP_EOL);
}
$recording_details_file = $recording_details_file[0]; // $eval_dir . "/recording_details.par";
if ( false === ( $recording_details_content = file_get_contents($recording_details_file)) ) {
die("ERROR couldn't open $recording_details_file" . PHP_EOL);
}
// quita las terminaciones de línea msdos/unix y separa por líneas en un array
$recording_details_content = preg_split("/[\r\n|\n\r|\n]/", $recording_details_content, NULL, PREG_SPLIT_NO_EMPTY);
foreach( $recording_details_content as $recording_details_line ) { // por cada radar, abre el fichero .rdb correspondiente
if ( (($count1 = preg_match("/^RADAR_DATAFILE_NAME(\d+)\s+(\w+)/", $recording_details_line, $m1, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count1>0) ) {
$name = $m1[2][0];
$sassc_id = $m1[1][0];
exec("/usr/bin/find -L $eval_dir -name \"${name}.rdb\" 2> /dev/null", $radar_rbk_file);
if ( 0 == count($radar_rbk_file) ) {
die("ERROR couldn't find ${name}.rdb inside $eval_dir" . PHP_EOL);
}
$radar_rbk_file = $radar_rbk_file[0];
$eval_dir . "/radar_data.rbk/" . $name . ".rdb";
$radars = array_merge( $radars, parseRBKFile($radar_rbk_file, $name, $sassc_id) );
}
}
} else {
exec("/usr/bin/find -L $eval_dir -maxdepth 2 -name \"*.rdb\" 2> /dev/null", $radar_rbk_files);
if ( 0 == count($radar_rbk_files) ) {
die("ERROR couldn't find ${name}.rdb inside $eval_dir" . PHP_EOL);
}
foreach($radar_rbk_files as $radar_rbk_file) {
$pathinfo = pathinfo($radar_rbk_file);
$name = $pathinfo['filename'];
if ( $name[0] == "%" )
continue;
// print ".";
$radars = array_merge( $radars, parseRBKFile($radar_rbk_file, $name, -1) );
}
// print PHP_EOL;
}
return $radars;
}
/**
* Helper para getRadars(). Lee un fichero .rbk y lo devuelve en array,
* realizando conversiones para los parámetros que lo necesiten.
* (Convierte altitud total y posición a grados WGS-84)
*
* @param string $eval_dir Directorio donde está configurada la evaluación
* @param string $name Nombre del radar[1~
* @param string $sassc_id Identificador del radar para el SASS-C
*
* @return array Listado de parámetros asociados a un radar
*/
function parseRBKFile($radar_rbk_file, $name, $sassc_id) {
if ( false === ($radar_rbk_contents = file_get_contents($radar_rbk_file)) ) {
logger(" E> No se puede acceder al contenido de >{$radar_rbk_file}<"); exit(-1);
}
clearstatcache();
if ( false === ($fechaUltimaModificacion = filemtime($radar_rbk_file)) ) {
logger(" E> No se pudo obtener fecha de última modificación de >{$radar_rbk_file}<"); exit(-1);
};
logger(" D> Última modificación de >" . basename($radar_rbk_file) . "< el " .
date("Y/m/d H:i:s", $fechaUltimaModificacion));
$lat = $lon = ""; $radarGroundAltitude = 0; $values = array(); $radar = array();
// quita las terminaciones de línea msdos/unix y separa por líneas en un array
$radar_rbk_contents = preg_split("/[\r\n|\n\r|\n]/", $radar_rbk_contents, NULL, PREG_SPLIT_NO_EMPTY);
foreach($radar_rbk_contents as $line) {
//print $line . PHP_EOL;
if ( (($count2 = preg_match("/^radarLatitude: \"(\d+):(\d+):(\d+).(\d+)([N|S])\"/", $line, $m2, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count2>0) ) {
$lat = $m2[1][0] + $m2[2][0]/60 + ($m2[3][0] + $m2[4][0]/100)/3600;
if ($m2[5][0]=="N") $lat *=1; else if ($m2[5][0]=="S") $lat *=-1;
continue;
}
if ( (($count2 = preg_match("/^radarLongitude: \"(\d+):(\d+):(\d+).(\d+)([E|W])\"/", $line, $m2, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count2>0) ) {
$lon = $m2[1][0] + $m2[2][0]/60 + ($m2[3][0] + $m2[4][0]/100)/3600;
if ($m2[5][0]=="E") $lon *=1; else if ($m2[5][0]=="W") $lon *=-1;
continue;
}
/*
// Vamos a capturar las alturas en el grupo genérico, y luego
// sumarlas cuando calculemos la cobertura
if ( (($count2 = preg_match("/^radarGroundAltitude: \"([-+]?[0-9]*\.?[0-9]+)/", $line, $m2, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count2>0) ) {
$radarGroundAltitude = $m2[1][0];
continue;
}
if ( (($count2 = preg_match("/^secondaryElectricalHeight: \"([-+]?[0-9]*\.?[0-9]+)/", $line, $m2, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count2>0) ) {
$h += $m2[1][0];
continue;
}
if ( (($count2 = preg_match("/^primaryElectricalHeight: \"([-+]?[0-9]*\.?[0-9]+)/", $line, $m2, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count2>0) ) {
$h += $m2[1][0];
continue;
}
*/
// este grupo captura el resto de valores que no necesitan transformación
if ( (($count2 = preg_match("/^(\w+): \"(.*)\"/", $line, $m2, PREG_OFFSET_CAPTURE)) !== FALSE) && ($count2>0) ) {
$values[$m2[1][0]] = $m2[2][0];
continue;
}
}
if ( !empty($lat) && !empty($lon) ) {
$radar[$name] = array(
'radar' => $name,
'lat' => $lat,
'lon' => $lon,
'sassc_id' => $sassc_id,
);
$radar[$name] = array_merge($radar[$name], $values);
$radar[$name]['fecha_modificado'] = $fechaUltimaModificacion;
// si en el fichero se definen dos radares (PSR y SSR, hay que devolver dos radares, no uno!)
if ( false !== strpos($radar[$name]['radarType'], "primary") ) {
// copiamos en un radar nuevo los datos
$radar[$name . "-psr"] = $radar[$name];
// le cambiamos el nombre para reflejar que ahora tiene PSR
$radar[$name . "-psr"]['radar'] = $radar[$name . "-psr"]['radar'] . "-psr";
}
} else {
logger(" I> El radar {$name} no tiene coordenadas definidas, se ignora");
}
return $radar;
}