All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gov.nasa.worldwind.data.BILRasterReader Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (C) 2012 United States Government as represented by the Administrator of the
 * National Aeronautics and Space Administration.
 * All Rights Reserved.
 */
package gov.nasa.worldwind.data;

import gov.nasa.worldwind.avlist.*;
import gov.nasa.worldwind.formats.worldfile.WorldFile;
import gov.nasa.worldwind.geom.Sector;
import gov.nasa.worldwind.util.*;

import java.io.File;

/**
 * @author dcollins
 * @version $Id: BILRasterReader.java 1171 2013-02-11 21:45:02Z dcollins $
 */
public class BILRasterReader extends AbstractDataRasterReader
{
    private static final String[] bilMimeTypes = new String[]
        {"image/bil", "application/bil", "application/bil16", "application/bil32"};

    private static final String[] bilSuffixes = new String[]
        {"bil", "bil16", "bil32", "bil.gz", "bil16.gz", "bil32.gz"};

    private boolean mapLargeFiles = false;
    private long largeFileThreshold = 16777216L; // 16 megabytes

    public BILRasterReader()
    {
        super(bilMimeTypes, bilSuffixes);
    }

    public boolean isMapLargeFiles()
    {
        return this.mapLargeFiles;
    }

    public void setMapLargeFiles(boolean mapLargeFiles)
    {
        this.mapLargeFiles = mapLargeFiles;
    }

    public long getLargeFileThreshold()
    {
        return this.largeFileThreshold;
    }

    public void setLargeFileThreshold(long largeFileThreshold)
    {
        if (largeFileThreshold < 0L)
        {
            String message = Logging.getMessage("generic.ArgumentOutOfRange", "largeFileThreshold < 0");
            Logging.logger().severe(message);
            throw new IllegalArgumentException(message);
        }

        this.largeFileThreshold = largeFileThreshold;
    }

    protected boolean doCanRead(Object source, AVList params)
    {
        if (!(source instanceof java.io.File) && !(source instanceof java.net.URL))
        {
            return false;
        }

        // If the data source doesn't already have all the necessary metadata, then we determine whether or not
        // the missing metadata can be read.
        String error = this.validateMetadata(source, params);
        if (!WWUtil.isEmpty(error))
        {
            if (!WorldFile.hasWorldFiles(source))
            {
                Logging.logger().fine(error);
                return false;
            }
        }

        if (null != params)
        {
            if (!params.hasKey(AVKey.PIXEL_FORMAT))
            {
                params.setValue(AVKey.PIXEL_FORMAT, AVKey.ELEVATION);
            }
        }

        return true;
    }

    protected DataRaster[] doRead(Object source, AVList params) throws java.io.IOException
    {
        java.nio.ByteBuffer byteBuffer = this.readElevations(source);

        // If the parameter list is null, or doesn't already have all the necessary metadata, then we copy the parameter
        // list and attempt to populate the copy with any missing metadata.        
        if (this.validateMetadata(source, params) != null)
        {
            // Copy the parameter list to insulate changes from the caller.
            params = (params != null) ? params.copy() : new AVListImpl();
            params.setValue(AVKey.FILE_SIZE, byteBuffer.capacity());
            WorldFile.readWorldFiles(source, params);
        }

        int width = (Integer) params.getValue(AVKey.WIDTH);
        int height = (Integer) params.getValue(AVKey.HEIGHT);
        Sector sector = (Sector) params.getValue(AVKey.SECTOR);

        if (!params.hasKey(AVKey.PIXEL_FORMAT))
        {
            params.setValue(AVKey.PIXEL_FORMAT, AVKey.ELEVATION);
        }

        ByteBufferRaster raster = new ByteBufferRaster(width, height, sector, byteBuffer, params);
        ElevationsUtil.rectify(raster);
        return new DataRaster[] { raster };
    }

    protected void doReadMetadata(Object source, AVList params) throws java.io.IOException
    {
        if (this.validateMetadata(source, params) != null)
        {
            WorldFile.readWorldFiles(source, params);
        }
    }

    protected String validateMetadata(Object source, AVList params)
    {
        StringBuilder sb = new StringBuilder();

        String message = super.validateMetadata(source, params);
        if (message != null)
        {
            sb.append(message);
        }

        Object o = (params != null) ? params.getValue(AVKey.BYTE_ORDER) : null;
        if (o == null || !(o instanceof String))
        {
            sb.append(sb.length() > 0 ? ", " : "").append(Logging.getMessage("WorldFile.NoByteOrderSpecified", source));
        }

        o = (params != null) ? params.getValue(AVKey.PIXEL_FORMAT) : null;
        if (o == null)
        {
            sb.append(sb.length() > 0 ? ", " : "").append(
                Logging.getMessage("WorldFile.NoPixelFormatSpecified", source));
        }
        else if (!AVKey.ELEVATION.equals(o))
        {
            sb.append(sb.length() > 0 ? ", " : "").append(Logging.getMessage("WorldFile.InvalidPixelFormat", source));
        }

        o = (params != null) ? params.getValue(AVKey.DATA_TYPE) : null;
        if (o == null)
        {
            sb.append(sb.length() > 0 ? ", " : "").append(Logging.getMessage("WorldFile.NoDataTypeSpecified", source));
        }

        if (sb.length() == 0)
        {
            return null;
        }

        return sb.toString();
    }

    private java.nio.ByteBuffer readElevations(Object source) throws java.io.IOException
    {
        if (!(source instanceof java.io.File) && !(source instanceof java.net.URL))
        {
            String message = Logging.getMessage("DataRaster.CannotRead", source);
            Logging.logger().severe(message);
            throw new java.io.IOException(message);
        }

        File file = (source instanceof java.io.File) ? (File) source : null;
        java.net.URL url = (source instanceof java.net.URL) ? (java.net.URL) source : null;

        if (null == file && "file".equalsIgnoreCase(url.getProtocol()))
        {
            file = new File(url.getFile());
        }

        if (null != file)
        {
            // handle .bil.zip, .bil16.zip, and .bil32.gz files
            if (file.getName().toLowerCase().endsWith(".zip"))
            {
                return WWIO.readZipEntryToBuffer(file, null);
            }
            // handle bil.gz, bil16.gz, and bil32.gz files
            else if (file.getName().toLowerCase().endsWith(".gz"))
            {
                return WWIO.readGZipFileToBuffer(file);
            }
            else if (!this.isMapLargeFiles() || (this.getLargeFileThreshold() > file.length()))
            {
                return WWIO.readFileToBuffer(file);
            }
            else
            {
                return WWIO.mapFile(file);
            }
        }
        else // (source instanceof java.net.URL)
        {
            return WWIO.readURLContentToBuffer(url);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy