/** * Controla que los tipos de los filtros de la pila sean correctos, es decir, que el tipo de * salida de un filtro de salida coincida con el tipo de la entrada del siguiente. En caso de no * ser así crea el filtro de tipo adecuado y lo sustituye en el no coincidente. Esto es necesario * ya que en la eliminación de filtros puede quedarse en inconsistencia de tipos. */ public void controlTypes() throws FilterTypeException { ArrayList exceptions = new ArrayList(); for (int i = 0; i < rasterFilterList.lenght(); i++) { String classFilter = null, packageFilter = null, oldClass = null; try { RasterFilter rf = rasterFilterList.get(i); if (rf == null) return; classFilter = rf.getClass().toString(); packageFilter = classFilter.substring(classFilter.indexOf(" ") + 1, classFilter.lastIndexOf(".")); oldClass = classFilter.substring(classFilter.lastIndexOf(".") + 1, classFilter.length()); } catch (ArrayIndexOutOfBoundsException ex) { return; } catch (NullPointerException ex) { return; } // Para el primer filtro comprobamos con el tipo de dato de entrada a la pila if (i == 0) { if (rasterFilterList.getInitDataType() != rasterFilterList.get(i).getInRasterDataType()) { Pattern p = Pattern.compile( RasterUtilities.typesToString(rasterFilterList.get(i).getInRasterDataType())); Matcher m = p.matcher(oldClass); String newClass = m.replaceAll(RasterUtilities.typesToString(rasterFilterList.getInitDataType())); String strPackage = packageFilter + "." + newClass; renewFilterFromControlTypes(strPackage, i, exceptions); } // Desde el filtro 2 en adelante se compara la salida de uno con la entrada del siguiente } else if (rasterFilterList.get(i - 1).getOutRasterDataType() != rasterFilterList.get(i).getInRasterDataType()) { Pattern p = Pattern.compile( RasterUtilities.typesToString(rasterFilterList.get(i).getInRasterDataType())); Matcher m = p.matcher(oldClass); String newClass = m.replaceAll( RasterUtilities.typesToString(rasterFilterList.get(i - 1).getOutRasterDataType())); String strPackage = packageFilter + "." + newClass; renewFilterFromControlTypes(strPackage.trim(), i, exceptions); } } if (exceptions.size() > 0) throw new FilterTypeException(""); if (debug) rasterFilterList.show(); }
/** * Genera instancias del buffer de datos adecuado al tamaño del raster. Si no hay muchos datos * (menos de cacheMemorySize) creará un buffer en memoria. Si hay más de esta cantidad entonces * crearemos un buffer cacheado (RasterCache). A partir de la cantidad señalada por * multicacheMemorySize haremos un buffer cacheado donde cada página no ocupa todo el ancho del * raster ya que este será muy grande. La gestión de una cache donde cada pagina ha de partir una * línea lleva una complejidad añadida. * * @param dataType Tipo de dato * @param width Ancho * @param height Alto * @param bandNr Banda * @param flag En caso de buffers de memoria este flag a true significa que se reserva la memoria * para el buffer de forma normal y si está a false no se reserva por lo que la reserva deberá * ser posterior. * @return Objeto RasterBuffer * @throws RasterDriverException * @throws NotSupportedExtensionException * @throws FileNotFoundException */ public static RasterBuffer getBuffer( int dataType, int width, int height, int bandNr, boolean malloc) /*throws FileNotFoundException, NotSupportedExtensionException, RasterDriverException*/ { // Opción de cachear siempre activada (Solo DEBUG) if (forceToLoadInCache) return new RasterCache(dataType, width, height, bandNr); if (forceToLoadInReadOnlyCache) { return new RasterReadOnlyBuffer(dataType, width, height, bandNr); } if (cacheOn) { long size = (long) ((long) RasterUtilities.getBytesFromRasterBufType(dataType) * (long) width * (long) height * (long) bandNr) / 1024L; long ms1 = RasterLibrary.cacheSize * 1024L; if (size <= ms1) return new RasterMemoryBuffer(dataType, width, height, bandNr, malloc); else return new RasterCache(dataType, width, height, bandNr); } else return new RasterMemoryBuffer(dataType, width, height, bandNr, malloc); }
/* * (non-Javadoc) * * @see org.gvsig.raster.gui.wizards.IFileOpen#post(java.io.File[]) */ public File post(File file) throws LoadLayerException { // Si el fichero es raw lanzamos el dialogo de parámetros de raw if (RasterUtilities.getExtensionFromFileName(file.getAbsolutePath()).equals("raw")) { OpenRawFileDefaultView view = new OpenRawFileDefaultView(file.getAbsolutePath()); file = view.getImageFile(); } if (file == null || file.getAbsoluteFile() == null) return null; // Si el fichero es vrt chequeamos que sea correcto if (RasterUtilities.getExtensionFromFileName(file.getAbsolutePath()).equals("vrt")) { try { checkFileVRT(file); } catch (FileOpenVRTException e) { RasterToolsUtil.messageBoxError( PluginServices.getText(this, "error_abrir_fichero") + " " + file.getName() + "\n\n" + PluginServices.getText(this, "informacion_adicional") + ":\n\n " + e.getMessage(), this, e); return null; } } try { FLyrRasterSE lyrRaster = null; String lyr_name = RasterToolsUtil.getLayerNameFromFile(file); lyrRaster = FLyrRasterSE.createLayer(lyr_name, file, null); // Si hay que generar las overviews por el panel de preferencias // if (Configuration.getValue("overviews_ask_before_loading", // Boolean.FALSE).booleanValue() == true) { // try { // boolean generate = false; // for (int i = 0; i < lyrRaster.getFileCount(); i++) { // if // (lyrRaster.getDataSource().getDataset(i)[0].getOverviewCount(0) // == 0) { // generate = true; // break; // } // } // if (generate) { // if (firstTaskOverview) { // execOverview = // RasterToolsUtil.messageBoxYesOrNot("generar_overviews", this); // firstTaskOverview = false; // } // // if (execOverview) { // RasterProcess process = new OverviewsProcess(); // process.setCancelable(false); // process.addParam("layer", (FLyrRasterSE) lyrRaster); // UniqueProcessQueue.getSingleton().add(process); // } // } // } catch (Exception e) { // // Si no se puede generar la overview no hacemos nada // } // } // Mostramos el cuadro que pide la georreferenciación si la capa no // tiene y si la opción está activa en preferencias if (RasterModule.askCoordinates) { if (lyrRaster.getFullExtent().getMinX() == 0 && lyrRaster.getFullExtent().getMinY() == 0 && lyrRaster.getFullExtent().getMaxX() == ((FLyrRasterSE) lyrRaster).getPxWidth() && lyrRaster.getFullExtent().getMaxY() == ((FLyrRasterSE) lyrRaster).getPxHeight()) { if (RasterToolsUtil.messageBoxYesOrNot( lyrRaster.getName() + "\n" + PluginServices.getText(this, "layer_without_georref"), null)) { GeoLocationOpeningRasterDialog gld = new GeoLocationOpeningRasterDialog(lyrRaster); PluginServices.getMDIManager().addWindow(gld); } } } // Opciones de proyección boolean compareProj = Configuration.getValue("general_ask_projection", Boolean.valueOf(false)).booleanValue(); if (compareProj) compareProjections(lyrRaster); else actionList.add(new Integer(defaultActionLayer)); lyrsRaster.add(lyrRaster); } catch (LoadLayerException e) { RasterToolsUtil.messageBoxError("error_carga_capa", this, e); throw new LoadLayerException("error_carga_capa", e); } return super.post(file); }