//
// HdfeosForm.java
//

/*
VisAD system for interactive analysis and visualization of numerical
data.  Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Library General Public License for more details.

You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
*/

package visad.data.hdfeos;

import java.util.Vector;
import java.util.Enumeration;
import visad.*;
import visad.data.*;
import visad.UnimplementedException;
import java.rmi.*;
import java.net.URL;

public class HdfeosForm extends Hdfeos
{
  static CacheStrategy c_strategy = new CacheStrategy();

  public HdfeosForm()
  {
    super("Default");
  }

  HdfeosForm( String formName )
  {
    super( formName );
  }

  public DataImpl open( String file_path )
         throws VisADException, RemoteException
  {
    DataImpl data = null;

    HdfeosFile file = new HdfeosFile( file_path );

    data = getFileData( file );

    return data;
  }

  public DataImpl open( URL url )
         throws VisADException
  {
    throw new UnimplementedException( "HdfeosForm.open( URL url )" );
  }

  public void add( String id, Data data, boolean replace )
              throws BadFormException
  {
    throw new BadFormException( "HdfeosForm.add" );
  }

  public void save( String id, Data data, boolean replace )
         throws BadFormException, RemoteException, VisADException
  {
    throw new UnimplementedException( "HdfeosForm.save" );
  }

  public FormNode getForms( Data data )
  {
    return this;
  }

  MathType getMathType( HdfeosFile file )
           throws VisADException, RemoteException
  {
    MathType M_type = null;
    HdfeosData data = null;

    int n_structs = file.getNumberOfStructs();
    if ( n_structs == 0 )
    {
       throw new HdfeosException("no HDF-EOS data structures in file: "+file.getFileName());
    }

    MathType[] types = new MathType[ n_structs ];

    for ( int ii = 0; ii < n_structs; ii++ )
    {
      EosStruct obj = file.getStruct(ii);

      if ( obj instanceof EosGrid )
      {
        data = getGridData( (EosGrid)obj );
      }
      else if ( obj instanceof EosSwath )
      {
        data = getSwathData( (EosSwath)obj );
      }

      try
      {
        M_type = data.getType();
      }
      catch ( VisADException e )
      {
        System.out.println( e.getMessage() );
      }
      finally
      {
        types[ii] = M_type;
      }
    }

    TupleType t_type = new TupleType( types );
    return (MathType) t_type;
  }

  DataImpl getFileData( HdfeosFile file )
           throws VisADException, RemoteException
  {
    DataImpl data = null;
    HdfeosData f_data = null;

    int n_structs = file.getNumberOfStructs();
    if ( n_structs == 0 )
    {
      throw new HdfeosException("no EOS data structures in file: "+file.getFileName());
    }

    HdfeosData[] datas = new HdfeosData[ n_structs ];

    for ( int ii = 0; ii < n_structs; ii++ )
    {
      EosStruct obj = file.getStruct(ii);

      if ( obj instanceof EosGrid )
      {
        f_data = getGridData( (EosGrid)obj );
      }
      else if ( obj instanceof EosSwath )
      {
        f_data = getSwathData( (EosSwath)obj );
      }

      datas[ii] = f_data;
    }
    return assembleStructs( datas );
  }

  private DataImpl assembleStructs( HdfeosData[] h_datas )
          throws VisADException, RemoteException
  {
    DataImpl fileData = null;
    int n_structs = h_datas.length;

    if ( n_structs == 1 )
    {
      return getVisADDataObject( h_datas[0] );
    }
    else
    {
      boolean types_equal = true;
      MathType first_type;
      MathType[] types = new MathType[ n_structs ];
      DataImpl[] datas = new DataImpl[ n_structs ];

      datas[0] = getVisADDataObject( h_datas[0] );
      types[0] = datas[0].getType();
      first_type = types[0];
      for ( int ii = 1; ii < n_structs; ii++ ) {
        datas[ii] = getVisADDataObject( h_datas[ii] );
        types[ii] = datas[ii].getType();
        if ( !(types[ii].equals(first_type)) ) {
          types_equal = false;
        }
      }

      if ( types_equal )
      {
        RealType struct_id = RealType.getRealType("struct_id");
        Integer1DSet domain = new Integer1DSet(struct_id, n_structs);
        FieldImpl field = new FieldImpl(new FunctionType((MathType) struct_id,
                                                       first_type), domain);
        for ( int ii = 0; ii < n_structs; ii++ ) {
          field.setSample(ii, datas[ii]);
        }
        fileData = field;
      }
      else
      {
        TupleType t_type = new TupleType( types );
        fileData = new Tuple( t_type, datas, false );
      }

      return fileData;
    }
  }

  DataImpl getVisADDataObject( HdfeosData h_data )
           throws VisADException, RemoteException
  {
    return h_data.getData();
  }

  HdfeosData getGridData( EosGrid grid )
             throws HdfeosException,
                    VisADException,
                    RemoteException
  {
    Shape s_obj;
    DimensionSet D_set;
    DimensionSet G_dims;
    DimensionSet D_dims;
    NamedDimension dim;
    Variable var;
    HdfeosDomain geo_domain;
    HdfeosDomain domain;
    HdfeosFlatField f_field;
    HdfeosField field;
    Vector datas = new Vector();
    int d_size;

    ShapeSet DV_shapeSet = grid.getShapeSet();
    GctpMap gridMap = grid.getMap();

    VariableSet vars_1D = DV_shapeSet.get1DVariables();

    for ( Enumeration e_out = DV_shapeSet.getEnum(); e_out.hasMoreElements(); )
    {
      s_obj = (Shape)e_out.nextElement();     // this particular data Variable group

      D_set = s_obj.getShape();     // dimension set of this Variable group

      d_size = D_set.getSize();     // # of dimensions in the set

      VariableSet range_var = s_obj.getVariables();

      G_dims = new DimensionSet();
      D_dims = new DimensionSet();

      for ( int ii = 0; ii < d_size; ii++ ) //-- separate dimensions first
      {
        dim = D_set.getElement(ii);

        if( ((dim.getName()).equals("XDim")) ||
            ((dim.getName()).equals("YDim")) )
        {
          G_dims.add( dim );
        }
        else
        {
          D_dims.add( dim );
        }
      }

      if ( G_dims.getSize() != 2 )
      {
        domain = new HdfeosDomain( grid, D_set );
        f_field = new HdfeosFlatField( domain, range_var );
        datas.addElement(f_field);
        continue;
      }
      else
      {
        geo_domain = new HdfeosDomainMap(grid, G_dims, gridMap);
      }

      f_field = new HdfeosFlatField( geo_domain, range_var );

      if ( D_dims.getSize() == 0 )
      {
        datas.addElement(f_field);
      }
      else
      {
        field = makeField( grid, D_dims, f_field );
        datas.addElement(field);
      }
    }

    int n_datas = datas.size();
    if ( n_datas == 0 ) {
      return null;
    }
    if ( n_datas == 1 ) {
      return (HdfeosData) datas.elementAt(0);
    }
    else {
      HdfeosData[] array = new HdfeosData[n_datas];
      for ( int ii = 0; ii < n_datas; ii++ ) {
        array[ii] = (HdfeosData) datas.elementAt(ii);
      }
      return new HdfeosTuple(array);
    }
  }

  HdfeosData getSwathData( EosSwath swath )
             throws VisADException,
                    RemoteException,
                    HdfeosException
  {
    Shape s_obj;
    DimensionSet D_set;
    DimensionSet F_dims = null;
    DimensionSet G_dims;
    DimensionSet Geo_set = null;
    DimensionSet D_dims;
    Variable Latitude = null;
    Variable Longitude = null;
    Variable Time = null;
    Variable var;
    VariableSet range_var;
    VariableSet v_set;
    NamedDimension dim;
    HdfeosDomain domain = null;
    HdfeosDomain geo_domain = null;
    HdfeosFlatField f_field = null;
    HdfeosField field = null;
    int d_size;
    int op;
    int g_rank;

    ShapeSet DV_shapeSet = swath.getDV_shapeSet();
    ShapeSet GV_shapeSet = swath.getGV_shapeSet();

    Vector datas = new Vector();

//*- look for Swath geo-spatial-time Variables - - - - - - - - - - - - -

    for ( Enumeration e = GV_shapeSet.getEnum(); e.hasMoreElements(); )
    {
      s_obj = (Shape)e.nextElement();
      v_set = s_obj.getVariables();

      var = v_set.getByName("Latitude");
      if ( var != null ) {
        Latitude = var;
      }
      var = v_set.getByName("Longitude");
      if ( var != null ) {
        Longitude = var;
      }
      var = v_set.getByName("Time");
      if ( Time != null ) {
        Time = var;
      }
    }

    if (( Latitude == null ) || ( Longitude == null ))
    {
      geo_domain = null;
    }
    else
    {
      Variable[] g_vars = { Longitude, Latitude };
      Geo_set = Longitude.getDimSet();

      if ( (Latitude.getDimSet()).sameSetSameOrder( Geo_set ) )
      {
        g_rank = Latitude.getDimSet().getSize();
        if ( g_rank == 1 )
        {
          geo_domain = null;
          domain = new HdfeosDomain(swath, Geo_set);
          f_field = new HdfeosFlatField( domain, g_vars );
          datas.addElement(f_field);
        }
        else if ( g_rank == 2 )
        {
          geo_domain = new HdfeosDomain(swath, g_vars, Geo_set.getElements());
        }
        else if ( g_rank > 2 )
        {
          geo_domain = null;
          domain = new HdfeosDomain(swath, Geo_set);
          f_field = new HdfeosFlatField( domain, g_vars );
          datas.addElement(f_field);
        }
      }
      else  //- Latitude/Longitude variables have different shapes
      {
        geo_domain = null;
        domain = new HdfeosDomain(swath, Latitude.getDimSet());
        f_field = new HdfeosFlatField( domain, Latitude );
        datas.addElement(f_field);

        domain = new HdfeosDomain(swath, Longitude.getDimSet());
        f_field = new HdfeosFlatField( domain, Longitude );
        datas.addElement(f_field);
      }
    }
    if ( Time != null )
    {
      domain = new HdfeosDomain(swath, Time.getDimSet());
      f_field = new HdfeosFlatField( domain, Time );
      datas.addElement(f_field);
    }

    for ( Enumeration e_out = DV_shapeSet.getEnum(); e_out.hasMoreElements(); )
    {
      s_obj = (Shape)e_out.nextElement();     // this particular data Variable group
      D_set = s_obj.getShape();     // dimension set of this Variable group

      d_size = D_set.getSize();     // # of dimensions in the set

      range_var = s_obj.getVariables();

      if ( geo_domain == null )
      {
        domain = new HdfeosDomain( swath, D_set );
        f_field = new HdfeosFlatField( domain, range_var );
        datas.addElement(f_field);
        continue;
      }

      G_dims = new DimensionSet();
      D_dims = new DimensionSet();

      for ( int ii = 0; ii < d_size; ii++ ) //- separate dimensions ( geo, non-geo )
      {
        dim = D_set.getElement( ii );

        if ((dim.isGeoMapDefined())||(GV_shapeSet.isMemberOf(dim)))
        {
          G_dims.add( dim );
        }
        else
        {
          D_dims.add( dim );
        }
      }

//- examine geo-dimension sets for this Variable group - - - - - - - - - - -
      int g_size = G_dims.getSize();

      if ( g_size == 0 || g_size == 1 )
      {
        domain = new HdfeosDomain(swath, D_set);
        f_field = new HdfeosFlatField(domain, range_var);
        datas.addElement(f_field);
      }
      else if ( g_size == 2 )
      {
        F_dims = D_dims;
        HdfeosDomain img_domain = new HdfeosDomain( swath, G_dims, geo_domain );
        f_field = new HdfeosFlatField( img_domain, range_var );
        if ( F_dims.getSize() == 0 )
        {
          datas.add(f_field);
        }
        else
        {
          int len = F_dims.getSize();
          boolean any = false;
          for ( int ii = 0; ii < len; ii++ ) {
            if ( (D_set.getIndexOf(F_dims.getElement(ii))) >
                 (D_set.getIndexOf(G_dims.getElement(1))) )
            {
              any = true;
            }
          }
          if ( any ) {
            domain = new HdfeosDomain(swath, D_set);
            f_field = new HdfeosFlatField(domain, range_var);
            datas.addElement(f_field);
          }
          else {
            field = makeField( swath, F_dims, f_field );
            datas.add(field);
          }
        }
      }
      else if ( g_size >= 3 )
      {
        domain = new HdfeosDomain(swath, D_set);
        f_field = new HdfeosFlatField(domain, range_var);
        datas.addElement(f_field);
      }
    }
    int n_datas = datas.size();
    if ( n_datas == 0 ) {
      return null;
    }
    if ( n_datas == 1 ) {
      return (HdfeosData) datas.elementAt(0);
    }
    else {
      HdfeosData[] array = new HdfeosData[n_datas];
      for ( int ii = 0; ii < n_datas; ii++ ) {
        array[ii] = (HdfeosData) datas.elementAt(ii);
      }
      return new HdfeosTuple(array);
    }
  }

  HdfeosField makeField( EosStruct struct,
                         DimensionSet F_dims,
                         HdfeosData t_data )
              throws VisADException,
                     RemoteException,
                     HdfeosException
  {
    HdfeosData range = t_data;
    HdfeosDomain domain = null;
    HdfeosField field = null;
    for ( int ii = (F_dims.getSize() - 1); ii >= 0; ii-- )
    {
      domain = new HdfeosDomain( struct, F_dims.getElement(ii));
      field = new HdfeosField( domain, range );
      range = field;
    }
    return field;
  }
}

 

Ads help maintain this website.