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.

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++) {
                                                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);

                                                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

Responder a