//
//  NavigatedImage.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.meteorology;

import visad.*;
import visad.georef.*;

/**
 * An implementation for representing single-banded planar 
 * satellite or radar imagery.  This specific type of SingleBandedImage has a 
 * navigation that will map domain values to latitude and longitude.
 */
public class NavigatedImage
    extends SingleBandedImageImpl
    implements NavigatedField
    
{
    private NavigatedCoordinateSystem navigation;

    /**
     * Construct a NavigatedImage without any data.  
     *
     * @param  function  FunctionType for this image.   It must have a domain
     *                   with a NavigatedCoordinateSystem and a Range that
     *                   has only one (Real) component.
     * @param  domain    DomainSet for this image.  The domain must have
     *                   mappings to Latitude/Longitude and or have a
     *                   NavigatedCoordinateSystem associated with it.
     * @param  startTime starting time of the image.
     * @param  desc      description
     *
     * @throws  VisADException  couldn't create the NavigatedImage
     */
    public NavigatedImage(FunctionType function, 
                          Set domain, 
                          DateTime startTime, 
                          String desc)
        throws VisADException
    {
        this(new FlatField(function, domain), 
             startTime, 
             desc);
    }

    /**
     * Construct a NavigatedImage from a FlatField.
     *
     * @param  image     FlatField representing an image.  It must
     *                   have a domain with a NavigatedCoordinateSystem
     *                   and a Range that only has one (Real) component.
     * @param  startTime starting time of the image.
     * @param  desc      description
     *
     * @throws  VisADException  couldn't create the NavigatedImage
     */
    public NavigatedImage(FlatField image, 
                          DateTime startTime, 
                          String desc)
        throws VisADException
    {
        this(image, startTime, desc, true);
    }

    /**
     * Construct a NavigatedImage from a FlatField.
     *
     * @param  image     FlatField representing an image.  It must
     *                   have a domain with a NavigatedCoordinateSystem
     *                   and a Range that only has one (Real) component.
     * @param  startTime starting time of the image.
     * @param  desc      description
     * @param  copyData  make a copy of the samples
     *
     * @throws  VisADException  couldn't create the NavigatedImage
     */
    public NavigatedImage(FlatField image, 
                          DateTime startTime, 
                          String desc,
                          boolean copyData)
        throws VisADException
    {
        super(image, startTime, desc);

        // make sure the domain is okay
        vetDomain();
    }
    
    /**
     * Get the coordinate system representing the navigation for the domain.
     *
     * @return NavigatedCoordinateSystem for the domain of this field.
     */
    public NavigatedCoordinateSystem getNavigation()
    {
        return navigation;
    }

    private void vetDomain()
        throws VisADException
    {
        CoordinateSystem cs = getDomainCoordinateSystem();
        if (cs != null && !(cs instanceof NavigatedCoordinateSystem))
        {
            throw new VisADException(
                "NavigatedImage: Domain CoordinateSystem must be " +
                "a NavigatedCoordinateSystem");
        }
        else if (cs == null)
        {
            if (getDomainSet().getDimension() < 2 ||
               !hasLatLon( (RealTupleType) getDomainSet().getType()))
            throw new VisADException(
                "NavigatedImage: Domain set must have " +
                "a Lat/Lon reference");
            cs = 
                new TrivialNavigation(((FunctionType) getType()).getDomain());
        }
        navigation = (NavigatedCoordinateSystem) cs;
    } 

    private boolean hasLatLon(RealTupleType type)
    {
        return (type.getIndex(RealType.Latitude) > -1 &&
                type.getIndex(RealType.Longitude) > -1);
    }

    /**
     * Check to see if this image has a domain that can map to Latitude
     * and Longitude.
     *
     * @return true if it has navigation, otherwise false
     */
    public boolean isNavigated()
    {
        return true;
    }

    /** return new NavigatedImage with value 'op this' */
    public Data unary(int op, MathType new_type, 
                      int sampling_mode, int error_mode)
                  throws VisADException
    {
        return 
            new NavigatedImage(
                (FlatField) 
                    super.unary(op, new_type, sampling_mode, error_mode),
                getStartTime(), getDescription(), false);
    }
}

 

Ads help maintain this website.