[Gvsig_desarrolladores] Fwd: jmrsid bug

Alvaro Zabala azabala en gmail.com
Vie Sep 30 19:46:11 CEST 2005


Por error envié este correo a una persona del equipo de gvSIG en lugar
de a la lista. Lo posteo junto con su replica por si le es de interés
a la lista.

Saludos.

---------- Forwarded message ----------
From: Alvaro Zabala <azabala en gmail.com>
Date: Thu, 29 Sep 2005 10:23:40 +0200
Subject: Re: [Gvsig_usuarios] jmrsid bug
To: Nacho <brodin_ign en gva.es>

Hola Nacho,
en primer lugar, gracias por vuestra ayuda. Te voy comentando por partes,

> -Cuantas imagenes tienes cargadas en la misma vista cuando ocurre y si el
> error es dependiente de ello (si crees que puede serlo que formato y tamaños
> tienen).

Las imagenes son las de la ortofoto a color de la Junta de Andalucía,
de venta al público por el Instituto Cartográfico de Andalucía. La
resolución es de 1m, y el tamaño de los bloques -tiles- es 64. Son de
3 bandas.

> -De que tamaño es la imagen/es con la que te ocurre.
7796x5272. Numero de niveles piramidales-overviews-,=8
> -Si te pasa siempre con la misma imagen o con cualquiera que tengas.
Me pasa con cualquiera.
> -Si el error salta de forma aleatoria o al realizar alguna acción concreta.

Estamos trabajando para hacer pruebas con 16 imágenes, formando
mosaico, y he detectado que cuando tenemos un nivel de zoom en el que
solo hay que renderizar 1 imagen, no me da el problema. Cuando tengo
que recorrer todas las imagenes (que en ultima instancia utilizan la
clase MrSidNative) aparece este error.
¿Es posible que no estemos utilizando correctamente la clase
MrSidNative? Nuestro copio es calco del de gvSIG para renderizar capas
(en el siguiente snippet, file es una instancia de MrSidNative):

  public BufferedImage getBufferedImage(int width, int height,
                                                  Envelope areaOfInterest) {
                int line;
                int[] pRGBArray = null;
                BufferedImage image = null;
                final double xmin = areaOfInterest.getMinX();
                final double xmax = areaOfInterest.getMaxX();
                final double ymin = areaOfInterest.getMinY();
                final double ymax = areaOfInterest.getMaxY();

                file.setView(xmin,
                             ymax,
                             xmax,
                             ymax,
                             width,
                             height);

                //Impedimos que los valores de ancho y alto de la
imágen sean menores que 1
                if (width <= 0) {
                    width = 1;
                }

                if (height <= 0) {
                    height = 1;
                }

                image = new BufferedImage(width, height,
                                          BufferedImage.TYPE_INT_ARGB);
                pRGBArray = new int[width * height];
                try {
                    file.setAlpha(getAlpha());
                    file.readScene(pRGBArray);
                    image.setRGB(0, 0, width, height, pRGBArray, 0,
                                 width);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                return image;
            }

        });
        return solucion;
    }

Tenemos tantas instancias de MrSidNative como ficheros abiertos.
¿Pueden interferir entre sí, y hay que cerrar el fichero una vez leida
la imagen?

> -Si da el mismo error en la misma circunstancia en otros equipos o con
> distintos sistemas operativos.
Da el mismo error en todos los equipos, Se ha probado con equipos
Windows XP -desarrollo- y en servidor Windows 2003 Standar Edition,
con 3 GB de Ram y procesador Xeon a 3 Ghz.

Saludos.

--
Alvaro Zabala Ordóñez
Miembro fundador de AGIL
Asociación para la promoción del GIS Libre
www.agiles.org

Funcionario del Cuerpo de Gestión de Sistemas e Informática de la
Administración General del Estado.
Confederación Hidrográfica del Guadalquivir.
Teléfono: 954939523
Plaza de España, sector II.
SEVILLA

Nacho <brodin_ign en gva.es>  Fri, Sep 30, 2005 at 1:53 PM
To: Alvaro Zabala <azabala en gmail.com>
Cc: Luis Sevilla <sevilla_lui en gva.es>
Reply | Reply to all | Forward | Print | Trash this message | Show original
Hola de nuevo.
       He estado mirando el código que me mandas y hay dos puntos que
podrian ser
conflictivos.

       El error que te da la librería es porque le estas pidiendo un extent
incorrecto a la imagen, es decir, en tu caso el areaOfInterest puede que esté
fuera de los límites. Esto es puede ser debido a algún error de redondeo en
el area solicitada.

       Otro posible fuente de problemas es el control de la relación de aspecto
antes de hacer el setView entre el fichero y la ventana solicitada que puede
resolverse así:

       dFileAspect = (double) v.width() / (double) v.height();
       dWindowAspect = (double) width / (double) height;

       if (dFileAspect > dWindowAspect) {
           height = (int) ((double) width / dFileAspect);
       } else {
           width = (int) ((double) height * dFileAspect);
       }

       Este problema nos lo hemos encontrado ya en otras ocasiones (en el uso de
imagenes que forman mosaico sin solapar, no con jmrsid en concreto), y suele
ser una cuestión de que alguna de las dimensiones no se está ajustando bien
(las de coma flotante con las enteras).

Nacho Brodin




--
Alvaro Zabala Ordóñez
Miembro fundador de AGIL
Asociación para la promoción del GIS Libre
www.agiles.org

Funcionario del Cuerpo de Gestión de Sistemas e Informática de la
Administración General del Estado.
Confederación Hidrográfica del Guadalquivir.
Teléfono: 954939523
Plaza de España, sector II.
SEVILLA



Más información sobre la lista de distribución gvSIG_desarrolladores