El 02/04/12 18:09, spginternet escribió:
> Hola,
> 
> estoy intentando preparar un algoritmo que, desde cada punto de un DEM,
> seleccione los ángulos verticales máximo y mínimo que se generan desde el
> mismo a un área determinada del territorio. Pretendo aplicarlo a paisaje,
> por ejemplo para valorar desde una cima qué amplitud vertical de campo
> visual hay respecto a un lago.
> 
> El problema es que necesito encadenar dos bucles, uno que haga recorrer
> todos los puntos del DEM, y lanzar desde cada uno de ellos otro que recorra
> todos los puntos del área seleccionada, eligiendo los ángulos máximo y
> mínimo que se forman con ella, pero parece que no logro coordinar bien las
> variables. He estado estudiando el algoritmo VisualExposure de SEXTANTE como
> ejemplo, pero no encuentro qué puede fallar. ¿Podrían echarme una mano? Pego
> el código a continuación. Muchas gracias y saludos.
> 

No he seguido mucho el algoritmo y lo que esta haciendo, pero te comento un par
de detalles que me han llamado la atencion.
Inserto los comentarios en medio del codigo.

> public class EJEMPLOAlgorithm
> extends
> GeoAlgorithm {
> 
>       public static final String DEM        = "DEM";
>       public static final String FEATURES   = "FEATURES";
>       public static final String RADIUS     = "RADIUS";
>       public static final String RESULTAMAX     = "RESULTAMAX";
>       public static final String RESULTAMIN     = "RESULTAMIN";
> 
>       private int                m_iNX, m_iNY;
>       private int                m_iRadius;
>       private int                m_iRadius2;
> 
>       private IRasterLayer       m_Amax;
>       private IRasterLayer       m_Amin;  
>       private IRasterLayer       m_DEM      = null;
>       private IRasterLayer       m_Features = null;
> 
> 
>       @Override
>       public boolean processAlgorithm() {
> 
>               int x, y, x2, y2, m_iNX2, m_iNY2;
>               double z, z2, di, r, dx, dy, dz, bc, br, b, bmax, bmin;
> 
>               try {
>                       m_DEM = 
> m_Parameters.getParameterValueAsRasterLayer(DEM);
>                       m_Features = 
> m_Parameters.getParameterValueAsRasterLayer(FEATURES);
>                       m_Amax = getNewRasterLayer(RESULTAMAX, 
> Sextante.getText("AVmax"),
> IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
>                       m_Amin = getNewRasterLayer(RESULTAMIN, 
> Sextante.getText("AVmin"),
> IRasterLayer.RASTER_DATA_TYPE_DOUBLE);
> 
>                       m_DEM.setWindowExtent(getAnalysisExtent());
>                       m_Features.setWindowExtent(getAnalysisExtent());
>               
> m_Features.setInterpolationMethod(IRasterLayer.INTERPOLATION_NearestNeighbour);
> 
>                       m_Amax.assign(0.0);
>                       m_Amin.assign(0.0);
> 
>                       m_iNX = m_DEM.getNX();
>                       m_iNY = m_DEM.getNY();
> 
> //Bucle para recorrer las celdas del DEM
> 
>                       for (y = 0; (y < m_iNY) && setProgress(y, m_iNY); y++) {
>                               for (x = 0; x < m_iNX; x++) {
> 
>                                       z = m_DEM.getCellValueAsDouble(x, y);
> 
>                                       final int posx = x;
>                                       final int posy = y;
> 
>                                       m_iNX2 = m_Features.getNX();
>                                       m_iNY2 = m_Features.getNY();
> 
> //Bucle para recorrer, desde cada celda del DEM, las celdas del área de
> interés (Features)
> 
>                                       for (y2 = 0; (y2 < m_iNY2); y2++) {

El punto y como del final de la linea siguiente construye un bucle vacio, que
apatentemente no hace nada.
¿ No habras querido porner una apertura de llaves en vez del punto y coma ?

>                                               for (x2=0; (x2 < m_iNX2); x2++);
> 
>                                               dx = posx - x2;
>                                               dy = posy - y2;
> 
>                                               z2 = 
> m_DEM.getCellValueAsDouble(x2, y2);
> 
>                                               di = dx*dx + dy*dy;
> 
>                                               r = Math.sqrt(di);
> 
>                                               dz = z - z2;
> 
>                                               bc = dz / r;
>                                               br = Math.atan(bc);
>                                               b = Math.toDegrees(br);
> 

A cada vuelta del bucle inicializas bmax y bmin a cero, asi que
las comparaciones de despues es facil que esten dando resultados
inesperados.

Probablemente lo que quieres es inicializarlos a cero antes de entrar
en el bucle "for (y2 = 0; (y2 < m_..."

A ver si te sirven de algo los comentarios.

Un saludo
Joaquin

>                                               bmax = 0;
>                                               bmin = 0;
> 
> //Selección de los ángulos máximo y mínimo, y salida.
> 
>                                               if( b > bmax) {  
>                                                       bmax = b;
>                                                       m_Amax.setCellValue(x, 
> y, bmax);}
> 
>                                               if( b < bmin) {
>                                                       bmin = b;
>                                                       m_Amin.setCellValue(x, 
> y, bmin);}
>                                       }
> 
>                               }
>                       }
>               }
>               catch (final Exception e) {
>                       Sextante.addErrorToLog(e);
>                       return false;
>               }
> 
>               return !m_Task.isCanceled();
>       }
> 
>       @Override
>       public void defineCharacteristics() {
> 
>               setUserCanDefineAnalysisExtent(true);
>               setGroup(Sextante.getText("Visibility_and_lighting"));
>               setName(Sextante.getText("Santiago"));
> 
>               try {
>                       m_Parameters.addInputRasterLayer(DEM, 
> Sextante.getText("Elevation"),
> true);
>                       m_Parameters.addInputRasterLayer(FEATURES, 
> Sextante.getText("Elements"),
> true);
>                       addOutputRasterLayer(RESULTAMAX, 
> Sextante.getText("AVmax"));
>                       addOutputRasterLayer(RESULTAMIN, 
> Sextante.getText("AVmin"));
>               }
>               catch (final RepeatedParameterNameException e) {
>                       Sextante.addErrorToLog(e);
>               }
>       }
> }
> 
> 
> --
> View this message in context: 
> http://osgeo-org.1560.n6.nabble.com/Doble-bucle-para-recorrer-dos-rasters-tp4679380p4679380.html
> Sent from the gvSIG desarrolladores mailing list archive at Nabble.com.
> _______________________________________________
> gvSIG_desarrolladores mailing list
> gvSIG_desarrolladores@listserv.gva.es
> Para ver histórico de mensajes, editar sus preferencias de usuario o darse de 
> baja en esta lista, acuda a la siguiente dirección: 
> http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores
> 


-- 
--------------------------------------
Joaquin Jose del Cerro
Development and software arquitecture manager.
jjdelce...@gvsig.com
gvSIG Association
www.gvsig.com
www.gvsig.org
_______________________________________________
gvSIG_desarrolladores mailing list
gvSIG_desarrolladores@listserv.gva.es
Para ver histórico de mensajes, editar sus preferencias de usuario o darse de 
baja en esta lista, acuda a la siguiente dirección: 
http://listserv.gva.es/cgi-bin/mailman/listinfo/gvsig_desarrolladores

Responder a