/**
   * 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();
  }
Example #2
0
  /**
   * 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);
  }