function [NavAid_Valid] = Search_NavAid(PosicionLLA , Rmax, Database, lat_index_file)
%% -----------------------------------------------------------------------------------------------------------
% Version:      20/09/2015    
% (c):          Vicente Calabuig Simón
%               vicasim@etsid.upv.es
%
% 1.- Utilidad:
%
%      Devuelve el conjunto de radioayudas situadas a una distancia
%      inferior a Rmax (Km) de la posicion espeficidada en PosicionLLA 
%
% 2.- Parámetros de entrada:
% 
%       PosicionLLA : Vector con la posición de la aeronave en formato [long (º), lat (º), alt (m)]
%       Rmax : Radio de búsqueda máximo alrededor de la posición leida de la aeronave  (num) (Km)
%       Database: Fichero .dat en el que se desean buscar las radioayudas: ('3_12_13_Database_Lat_Sorted.dat' en general )
%                                                                          o aquella que se haya generado para un determinado segmento (FILTROS_OFFLINE)
%
%       lat_index_file : índice con la relación de posiciones de cada grado de latitud en la base de datos empleada
%
% 3.- Parámetros de salida:
%    
%       [NavAid_Valid]: Conjunto de radio ayudas cuya distancia a la posición leída 
%                       de la aeronave es inferior a Rmax.     
%
% 4.- Ejemplo de uso:
%    
%   lat_0 = 39.56;     lon_0 = 2.743;         alt_0 = 6.466;       x0_LLA = [lat_0, lon_0, alt_0];                  (LEPA | PMI)
%   [NavAid_Valid] = Search_NavAid(x0_LLA, 100, '3_12_13_Database_Lat_Sorted.dat', 'LatIndex_3_12_13.dat')
%   [NavAid_Valid] = Search_NavAid(x0_LLA, 100, '3_12_13_Lat_Sorted_WO_R_ID_COOR.dat', 'LatIndex_3_12_13_Lat_Sorted_WO_R_ID_COOR.dat')
%
%
%   lat_0 = 39.50;     lon_0 = -0.479;         alt_0 = 225;       x0_LLA = [lat_0, lon_0, alt_0];     (LEVC | VLC)
%  [NavAid_Valid] = Search_NavAid(x0_LLA, 25, '3_12_13_Database_Lat_Sorted.dat')  
%         
%% -------------------------------------------------------------------------------------------------------------------------
disp(' ');
fprintf('Posición de la aeronave: Latitud: %g º     |       Longitud: %g º     |       Altura: %g ft\n', PosicionLLA(1), PosicionLLA(2), PosicionLLA(3));
disp(' ');
fprintf('Radioayudas situadas a menos de %g Km de la posición de la aeronave : %g\n', Rmax);
disp(' ');
% Separamos lat_0, lon_0 y alt_0 del array de posición
lat_x0 = PosicionLLA(1);    lon_x0 = PosicionLLA(2);     alt_x0 = PosicionLLA(3); 
% Asumiendo la simplificacion de 'Tierra Plana' : 1 grado latitud  = 110 km | 1 grado longitud = 111 km  
latDeg2Km = 110;             Km2LatDeg = 1/latDeg2Km;           
lonDeg2Km = 111;             Km2LonDeg = 1/lonDeg2Km;

% Transformamos los km de radio de búsqueda en incrementos de latitud: 'Filtro Vertical'
Delta_lat = Km2LatDeg*Rmax;   

lat_busqueda_min  =(lat_x0-Delta_lat);              lat_busqueda_max =(lat_x0+Delta_lat);

%Redondeos necesarios para buscar por índice:
lat_busqueda_min = floor(lat_busqueda_min);         lat_busqueda_max = ceil(lat_busqueda_max); 


% Indices que determinan que rango de la base de datos ordenada hay que leer:
[Indice_min] = Buscar_Indice(lat_busqueda_min, 0, lat_index_file);        %Si fuera neceseario, se redonderia hacia ABAJO
[Indice_max] = Buscar_Indice(lat_busqueda_max, 1, lat_index_file);        %Si fuera neceseario, se redonderia hacia ARRIBA
 Indices = [Indice_min, Indice_max];

% Lectura del rango de la base de datos correspondiente:
[Partial_Database] = Reading_Database(Database, Indice_min, Indice_max);

% Lectura de los datos correspondientes a las radioayudas halladas:
[NAtype, NAlat, NAlon, NAalt,  NAfreq, NArange] = Get_NavAid_Data(Partial_Database);

NavAid_total = length(NAtype);

distancia_proyectada = [];      distancia_verdadera   = [];         ft2m = 0.3048;

for i = 1 : NavAid_total
    %Coordenadas de la radioayuda i-esima
    lat_i          = NAlat(i);
    lon_i          = NAlon(i);
    alt_i          = NAalt(i); 
    % Diferencia con respecto a la posición de la aeronave
    Delta_lon_i    = lon_i - lon_x0; 
    Delta_lat_i    = lat_i - lat_x0;
    Delta_alt_i    = alt_i - alt_x0; 
    % Calculo de la distancia proyectada a cada radioayuda (Simplificacion Tierra Plana)
    dp_i = sqrt(( Delta_lon_i * lonDeg2Km )^2 + (( Delta_lat_i ) * latDeg2Km )^2); %Km
    distancia_proyectada = [distancia_proyectada; dp_i]; %Km
    
    % Calculo de la distancia verdadera a cada radioayuda (Simplificacion Tierra Plana)
    Delta_alt_i_Km = Delta_alt_i * ft2m * (1/1000); 
    
    dv_i = sqrt( dp_i^2 + Delta_alt_i_Km^2);
    
    distancia_verdadera   = [distancia_verdadera; dv_i]; %Km
end

% Seleccion de las radioayudas que esten a una distancia inferior al limite establecido: 'Filtro Circular'

Indices_en_Partial_Database_de_NavAid_Valid = [];   NavAid_Valid = {}; 
j = 0;
for i = 1 : length(distancia_verdadera)
    if (distancia_verdadera(i) < Rmax)
        j = j+1;
        Indices_en_Partial_Database_de_NavAid_Valid = [Indices_en_Partial_Database_de_NavAid_Valid ; i];
        StringOut_i = Partial_Database{Indices_en_Partial_Database_de_NavAid_Valid(end)}; 
        NavAid_Valid{j, 1} = StringOut_i;
    end
end
%NavAid_Valid(cellfun(@isempty,NavAid_Valid)) = [];



