[Gvsig_desarrolladores] Doble bucle para recorrer dos rásters

spginternet spginternet en hotmail.com
Lun Abr 2 18:09:19 CEST 2012


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.


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