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