/* gvSIG. Geographic Information System of the Valencian Government * * Copyright (C) 2007-2008 Infrastructures and Transports Department * of the Valencian Government (CIT) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * */ package org.gvsig.fmap.dal.coverage.dataset.io.netcdf; import java.awt.geom.AffineTransform; import org.gvsig.fmap.dal.DALFileLocator; import org.gvsig.fmap.dal.DALLocator; import org.gvsig.fmap.dal.DataStore; import org.gvsig.fmap.dal.coverage.dataset.Buffer; import org.gvsig.fmap.dal.coverage.dataset.io.tile.downloader.FileTileServer; import org.gvsig.fmap.dal.coverage.datastruct.BandList; import org.gvsig.fmap.dal.coverage.datastruct.Extent; import org.gvsig.fmap.dal.coverage.exception.BandAccessException; import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException; import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException; import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException; import org.gvsig.fmap.dal.coverage.exception.ParsingException; import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException; import org.gvsig.fmap.dal.coverage.exception.RasterDriverException; import org.gvsig.fmap.dal.coverage.store.RasterFileStoreParameters; import org.gvsig.fmap.dal.spi.DataManagerProviderServices; import org.gvsig.fmap.dal.spi.DataStoreProviderServices; import org.gvsig.metadata.MetadataLocator; import org.gvsig.raster.cache.tile.provider.TileListener; import org.gvsig.raster.cache.tile.provider.TileServer; import org.gvsig.raster.impl.datastruct.ExtentImpl; import org.gvsig.raster.impl.provider.DefaultRasterProvider; import org.gvsig.raster.impl.provider.RasterProvider; import org.gvsig.raster.impl.store.AbstractRasterDataParameters; import org.gvsig.raster.impl.store.AbstractRasterDataStore; import org.gvsig.raster.impl.store.DefaultStoreFactory; import org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation; import org.gvsig.raster.impl.store.properties.DataStoreMetadata; import org.gvsig.raster.impl.store.properties.DataStoreTransparency; import org.gvsig.tools.ToolsLocator; import org.gvsig.tools.extensionpoint.ExtensionPoint; import org.gvsig.tools.extensionpoint.ExtensionPointManager; /** * Data provider for ... * * @author Nacho Brodin (nachobrodin@gmail.com) */ public class NetCDFProvider extends DefaultRasterProvider { public static String NAME = "Template Store"; public static String DESCRIPTION = "Template Raster file"; public final String METADATA_DEFINITION_NAME = "TemplateStore"; private static String[] formatList = new String[]{"*"}; private Extent viewRequest = null; private TileServer tileServer = null; private boolean open = false; public static void register() { DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator.getDataManager(); if (dataman != null && !dataman.getStoreProviders().contains(NAME)) { dataman.registerStoreProvider(NAME, NetCDFProvider.class, NetCDFDataParameters.class); } if(DALFileLocator.getFilesystemServerExplorerManager() != null) DALFileLocator.getFilesystemServerExplorerManager().registerProvider( NAME, DESCRIPTION, NetCDFFilesystemServerExplorer.class); dataman.registerStoreFactory(NAME, DefaultStoreFactory.class); } /** * Returns true if the extension is supported and false if doesn't * @param ext * @return */ public static boolean isExtensionSupported(String ext) { for (int i = 0; i < formatList.length; i++) { if(formatList[i].compareTo(ext) == 0) return true; } return false; } /** * Constructor. Abre el dataset. * @param proj Proyección * @param fName Nombre del fichero * @throws NotSupportedExtensionException */ public NetCDFProvider(String params) throws NotSupportedExtensionException { super(params); if(params instanceof String) { NetCDFDataParameters p = new NetCDFDataParameters(); p.setURI((String)params); super.init(p, null, ToolsLocator.getDynObjectManager() .createDynObject( MetadataLocator.getMetadataManager().getDefinition( DataStore.METADATA_DEFINITION_NAME))); init(p, null); } } public NetCDFProvider (NetCDFDataParameters params, AbstractRasterDataStore storeServices) throws NotSupportedExtensionException { super(params, storeServices, ToolsLocator.getDynObjectManager() .createDynObject( MetadataLocator.getMetadataManager().getDefinition( DataStore.METADATA_DEFINITION_NAME))); init(params, storeServices); } /** * Crea las referencias al fichero y carga * las estructuras con la información y los metadatos. * @param proj Proyección * @param param Parametros de carga * @throws NotSupportedExtensionException */ public void init (AbstractRasterDataParameters params, DataStoreProviderServices storeServices) throws NotSupportedExtensionException { //TODO: if(((RasterFileStoreParameters)params).getFile().exists()) { setParam(params); colorTable = null; noData = 0; wktProjection = null; //CrsWkt crs = new CrsWkt(wktProjection); //IProjection proj = CRSFactory.getCRS("EPSG:23030"); noDataEnabled = true; ownTransformation = null; externalTransformation = (AffineTransform)ownTransformation.clone(); load(); } else setParam(params); bandCount = 0; setDataType(null); super.init(); try { loadFromRmf(getRmfBlocksManager()); } catch (ParsingException e) { //No lee desde rmf } } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#load() */ public RasterProvider load() { return this; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.RasterProvider#isOpen() */ public boolean isOpen() { return open; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#close() */ public void close() { //TODO: } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#translateFileName(java.lang.String) */ public String translateFileName(String fileName) { return fileName; } /** * Asigna el extent de la vista actual. existe un fichero .rmf debemos hacer una transformación * de la vista asignada ya que la petición viene en coordenadas del fichero .rmf y la vista (v) * ha de estar en coordenadas del fichero. */ public void setView(Extent e) { viewRequest = new ExtentImpl(e); } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getView() */ public Extent getView() { return viewRequest; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWidth() */ public double getWidth() { //TODO: return 0; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getHeight() */ public double getHeight() { //TODO: return 0; } /** * Read a line from the file * @param line * @param band * @return * @throws InvalidSetViewException * @throws FileNotOpenException * @throws RasterDriverException * @Deprecated This operation is deprecated because is not useful and in the future * it will not be maintained. The abstract operation has dissapear */ public Object readCompleteLine(int line, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException { if(line > this.getHeight() || band > this.getBandCount()) throw new InvalidSetViewException("Request out of grid"); //TODO: return null; } /* * (non-Javadoc) * @see org.gvsig.raster.dataset.RasterDataset#readBlock(int, int) */ public Object readBlock(int pos, int blockHeight) throws InvalidSetViewException, FileNotOpenException, RasterDriverException, ProcessInterruptedException { if(pos < 0) throw new InvalidSetViewException("Request out of grid"); if((pos + blockHeight) > getHeight()) blockHeight = Math.abs(((int)getHeight()) - pos); //TODO: return null; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getData(int, int, int) */ public Object getData(int x, int y, int band)throws InvalidSetViewException, FileNotOpenException, RasterDriverException { if(x < 0 || y < 0 || x >= getWidth() || y >= getHeight()) throw new InvalidSetViewException("Request out of grid"); //TODO return null; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.raster.cache.tile.provider.TileListener) */ public void getWindow(Extent ex, int bufWidth, int bufHeight, BandList bandList, TileListener listener) throws ProcessInterruptedException, RasterDriverException { //TODO } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(org.gvsig.fmap.dal.coverage.datastruct.Extent, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer) */ public Buffer getWindow(Extent ex, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException { //TODO return rasterBuf; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean) */ public Buffer getWindow(double ulx, double uly, double w, double h, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException { //TODO return rasterBuf; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(double, double, double, double, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer, boolean) */ public Buffer getWindow(Extent extent, int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf, boolean adjustToExtent) throws ProcessInterruptedException, RasterDriverException { //TODO return rasterBuf; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer) */ public Buffer getWindow(int x, int y, int w, int h, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException { //TODO return rasterBuf; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getWindowRaster(int, int, int, int, int, int, org.gvsig.fmap.dal.coverage.datastruct.BandList, org.gvsig.fmap.dal.coverage.dataset.Buffer) */ public Buffer getWindow(int x, int y, int w, int h, int bufWidth, int bufHeight, BandList bandList, Buffer rasterBuf) throws ProcessInterruptedException, RasterDriverException { //TODO return rasterBuf; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getBlockSize() */ public int getBlockSize(){ //TODO return 0; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getMetadata() */ public DataStoreMetadata getMetadata() { //TODO return null; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getColorInterpretation() */ public DataStoreColorInterpretation getColorInterpretation(){ //TODO return null; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setColorInterpretation(org.gvsig.raster.impl.store.properties.DataStoreColorInterpretation) */ public void setColorInterpretation(DataStoreColorInterpretation colorInterpretation){ //TODO } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getTransparency() */ public DataStoreTransparency getTransparency() { //TODO return null; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isGeoreferenced() */ public boolean isGeoreferenced() { //TODO return false; } /** * Informa de si el driver ha supersampleado en el último dibujado. Es el driver el que colocará * el valor de esta variable cada vez que dibuja. * @return true si se ha supersampleado y false si no se ha hecho. */ public boolean isSupersampling() { //TODO return false; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#setAffineTransform(java.awt.geom.AffineTransform) */ public void setAffineTransform(AffineTransform t){ super.setAffineTransform(t); } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.RasterProvider#getOverviewCount(int) */ public int getOverviewCount(int band) throws BandAccessException, RasterDriverException { if(band >= getBandCount()) throw new BandAccessException("Wrong band"); //TODO return 0; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewWidth(int, int) */ public int getOverviewWidth(int band, int overview) throws BandAccessException, RasterDriverException { if (band >= getBandCount()) throw new BandAccessException("Wrong band"); //TODO return 0; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#getOverviewHeight(int, int) */ public int getOverviewHeight(int band, int overview) throws BandAccessException, RasterDriverException { if (band >= getBandCount()) throw new BandAccessException("Wrong band"); //TODO return 0; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#overviewsSupport() */ public boolean overviewsSupport() { return true; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.DefaultRasterProvider#isReproyectable() */ public boolean isReproyectable() { return true; } /* * (non-Javadoc) * @see org.gvsig.fmap.dal.spi.DataStoreProvider#getName() */ public String getName() { return NAME; } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.RasterProvider#setStatus(org.gvsig.raster.impl.provider.RasterProvider) */ public void setStatus(RasterProvider provider) { if(provider instanceof NetCDFProvider) { //Not implemented yet } } /* * (non-Javadoc) * @see org.gvsig.raster.impl.provider.RasterProvider#getTileServer() */ public TileServer getTileServer() { if(tileServer == null) tileServer = new FileTileServer(this); return tileServer; } }