Example #1
0
double CProtectionIndex::getProtectionIndex(int x, int y){

	int i,j;
	int iDifX[] = {0,1,1,1,0,-1,-1,-1};
	int iDifY[] = {1,1,0,-1,-1,-1,0,1};
	double dDifHeight;
	double dDist;
	double dAngle;
	double dProtectionIndex = 0;
	double aAngle[8];

	for (i = 0; i < 8; i++){
		j = 1;
		aAngle[i] = 0;
		dDist = M_GET_LENGTH(iDifX[i], iDifY[i]) * j * m_pDEM->Get_Cellsize();
		while (dDist < m_dRadius){
			if (m_pDEM->is_InGrid(x + iDifX[i] * j, y + iDifY[i] * j)){
				dDifHeight = m_pDEM->asDouble(x,y);
			}//if
			else{
				return NO_DATA;
			}
			dDifHeight = m_pDEM->asDouble(x + iDifX[i] * j, y + iDifY[i] * j) 
						 - m_pDEM->asDouble(x,y);
			dAngle = atan (dDifHeight / dDist);
			if (dAngle > aAngle[i]){
				aAngle[i] = dAngle;
			}//if
			j++;
			dDist = M_GET_LENGTH(iDifX[i], iDifY[i]) * j * m_pDEM->Get_Cellsize();
		}//while
		dProtectionIndex+=aAngle[i];
	}//while

	return (dProtectionIndex / 8.);

}//method
//---------------------------------------------------------
bool CTopographic_Openness::Get_Angle_Sectoral(int x, int y, int i, double &Max, double &Min)
{
	double	iDistance, dDistance, dx, dy, ix, iy, d, z;

	z			= m_pDEM->asDouble(x, y);
	dx			= m_Direction[i].x;
	dy			= m_Direction[i].y;
	ix			= x;
	iy			= y;
	iDistance	= 0.0;
	dDistance	= Get_Cellsize() * M_GET_LENGTH(dx, dy);
	Max			= 0.0;
	Min			= 0.0;

	bool	bOkay	= false;

	while( is_InGrid(x, y) && iDistance <= m_Radius )
	{
		ix	+= dx;	x	= (int)(0.5 + ix);
		iy	+= dy;	y	= (int)(0.5 + iy);
		iDistance	+= dDistance;

		if( m_pDEM->is_InGrid(x, y) )
		{
			d	= (m_pDEM->asDouble(x, y) - z) / iDistance;

			if( bOkay == false )
			{
				bOkay		= true;
				Max	= Min	= d;
			}
			else if( Max < d )
			{
				Max	= d;
			}
			else if( Min > d )
			{
				Min	= d;
			}
		}
	}

	return( bOkay );
}
Example #3
0
bool CFlowDepth::getWetAreaAndPerimeter(int iX, 
									 int iY, 
									 double fH, 
									 double &fArea, 
									 double &fPerim){

	int iWidth = 0;
	int iX2, iY2;
	int iX3, iY3;
	int i = 0;	
	int iStepX, iStepY;
	int pStepX[4] = {1,1,0,1};
	int pStepY[4] = {0,-1,1,1};
	int iDir = (m_pAspect->asInt(iX, iY,true) / 45) % 4;
	double fDist;
	double fLocalDist;
	double fBaseHeight = m_pDEM->asFloat(iX, iY);	
	double fPerimLeft = 0;
	double fAreaLeft = 0;
	double fPerimRight = 0;
	double fAreaRight = 0;
	double fHeightDif;
	double fLocalHeightDif;
	
	iStepY = pStepX[iDir]; 
	iStepX = pStepY[iDir]; 
	
	fDist = M_GET_LENGTH(iStepX, iStepY) * m_pDEM->Get_Cellsize();
	
	do{
		iX2 = iX + iStepX * i;
		iY2 = iY + iStepY * i;
		iX3 = iX + iStepX * (i+1);
		iY3 = iY + iStepY * (i+1);	
		if (m_pDEM->is_InGrid(iX2,iY2) && m_pDEM->is_InGrid(iX3,iY3)){
			fHeightDif = m_pDEM->asFloat(iX3,iY3) - m_pDEM->asFloat(iX,iY);
			if (fHeightDif >= fH){
				fLocalHeightDif = fabs(m_pDEM->asFloat(iX,iY) + fH - m_pDEM->asFloat(iX2,iY2));
				fLocalDist = fabs(fDist * fLocalHeightDif 
							/ (m_pDEM->asFloat(iX3,iY3) - m_pDEM->asFloat(iX2,iY2)));
			}//if
			else{
				fLocalHeightDif = fabs(m_pDEM->asFloat(iX3,iY3) - m_pDEM->asFloat(iX2,iY2));
				fLocalDist = fDist;
			}//else
			fPerimLeft += sqrt(fLocalDist * fLocalDist + fLocalHeightDif * fLocalHeightDif);
			fAreaLeft += (i * fLocalHeightDif + fLocalHeightDif * fLocalDist / 2.);
		}//if
		else{
			return false;
		}//else
		i++;
	}while(fHeightDif < fH);
	
	i = 0;
	do{
		iX2 = iX - iStepX * i;
		iY2 = iY - iStepY * i;
		iX3 = iX - iStepX * (i+1);
		iY3 = iY - iStepY * (i+1);	
		if (m_pDEM->is_InGrid(iX2,iY2) && m_pDEM->is_InGrid(iX3,iY3)){
			fHeightDif = m_pDEM->asFloat(iX3,iY3) - m_pDEM->asFloat(iX,iY);
			if (fHeightDif >= fH){
				fLocalHeightDif = fabs(m_pDEM->asFloat(iX,iY) + fH - m_pDEM->asFloat(iX2,iY2));
				fLocalDist = fabs(fDist * fLocalHeightDif 
							/ (m_pDEM->asFloat(iX3,iY3) - m_pDEM->asFloat(iX2,iY2)));
			}//if
			else{
				fLocalHeightDif = fabs(m_pDEM->asFloat(iX3,iY3) - m_pDEM->asFloat(iX2,iY2));
				fLocalDist = fDist;
			}//else
			fPerimLeft += sqrt(fLocalDist * fLocalDist + fLocalHeightDif * fLocalHeightDif);
			fAreaLeft += (i * fLocalHeightDif + fLocalHeightDif * fLocalDist / 2.);
		}//if
		else{
			return false;
		}//else
		i++;
	}while(fHeightDif < fH);
	
	fArea = fAreaLeft + fAreaRight;
	fPerim = fPerimLeft +fPerimRight; 

	return true;

}//method
Example #4
0
//---------------------------------------------------------
bool CConvergence_Radius::Initialize(CSG_Grid *pDTM, int Radius)
{
	int		x, y, ix, iy;
	double	Slope, Aspect, d;

	if( Radius > 0 )
	{
		//-------------------------------------------------
		m_Radius	= Radius;
		m_Diameter	= 1 + 2 * Radius;

		m_Dir.Create(SG_DATATYPE_Double, m_Diameter, m_Diameter);
		m_Dst.Create(SG_DATATYPE_Double, m_Diameter, m_Diameter);

		for(iy=0, y=-m_Radius; iy<m_Diameter; iy++, y++)
		{
			for(ix=0, x=-m_Radius; ix<m_Diameter; ix++, x++)
			{
				d	= M_GET_LENGTH(x, y);

				if( d < 1 || d > m_Radius )
				{
					m_Dir.Set_NoData(ix, iy);
					m_Dst.Set_Value	(ix, iy, 0);
				}
				else
				{
					m_Dir.Set_Value	(ix, iy, y != 0.0 ? M_PI_180 + atan2((double)x, (double)y) : (x > 0.0 ? M_PI_270 : M_PI_090));
					m_Dst.Set_Value	(ix, iy, d - 1);
				}
			}
		}

		//-------------------------------------------------
		m_Slope	.Create(pDTM, SG_DATATYPE_Float);
		m_Aspect.Create(pDTM, SG_DATATYPE_Float);

		for(y=0; y<Get_NY() && Set_Progress(y); y++)
		{
			for(x=0; x<Get_NX(); x++)
			{
				if( pDTM->is_InGrid(x, y) && pDTM->Get_Gradient(x, y, Slope, Aspect) && Aspect >= 0.0 )
				{
					m_Slope	.Set_Value(x, y, Slope);
					m_Aspect.Set_Value(x, y, Aspect);
				}
				else
				{
					m_Slope	.Set_NoData(x, y);
					m_Aspect.Set_NoData(x, y);
				}
			}
		}

		//-------------------------------------------------
		m_iSum		= (double *)malloc(m_Radius * sizeof(double));
		m_iCnt		= (int    *)malloc(m_Radius * sizeof(int   ));

		return( true );
	}

	return( false );
}
bool CProfileFromPoints::On_Execute(void){
	
	CSG_Table* pTable;	
	CSG_Table* pProfileTable;
	CSG_Table_Record* pRecord;
	CSG_Grid* pGrid;	
	int iXField, iYField;	
	int i;
	int x1,x2,y1,y2;
	float fPartialDist;
	float fDist = 0;


	pGrid = Parameters("GRID")->asGrid();
	pTable = Parameters("TABLE")->asTable();
	pProfileTable = Parameters("RESULT")->asTable();
	iXField = Parameters("X")->asInt();
	iYField = Parameters("Y")->asInt();	
	
	pProfileTable->Create((CSG_Table*)NULL);
	pProfileTable->Set_Name(_TL("Profile"));
	pProfileTable->Add_Field(_TL("Distance"), SG_DATATYPE_Double);
	pProfileTable->Add_Field("Z", SG_DATATYPE_Double);

	for (i = 0; i < pTable->Get_Record_Count()-1; i++){
		
		x1=(int)(0.5 + (pTable->Get_Record(i  )->asDouble(iXField) - pGrid->Get_XMin()) / pGrid->Get_Cellsize());
		x2=(int)(0.5 + (pTable->Get_Record(i+1)->asDouble(iXField) - pGrid->Get_XMin()) / pGrid->Get_Cellsize());
		y1=(int)(0.5 + (pTable->Get_Record(i  )->asDouble(iYField) - pGrid->Get_YMin()) / pGrid->Get_Cellsize());			
		y2=(int)(0.5 + (pTable->Get_Record(i+1)->asDouble(iYField) - pGrid->Get_YMin()) / pGrid->Get_Cellsize());			

        int x = x1, y = y1, D = 0, HX = x2 - x1, HY = y2 - y1,
                c, M, xInc = 1, yInc = 1, iLastX = x1, iLastY = y1;

        if (HX < 0) {
            xInc = -1;
            HX = -HX;
        }//if
        if (HY < 0) {
            yInc = -1;
            HY = -HY;
        }//if
        if (HY <= HX) {
            c = 2 * HX;
            M = 2 * HY;
            for (;;) {                
                fPartialDist = (float)(M_GET_LENGTH(x-iLastX, y-iLastY) * pGrid->Get_Cellsize());
                if (pGrid->is_InGrid(x,y) && fPartialDist){
					fDist+=fPartialDist;
                	pRecord = pProfileTable->Add_Record();
					pRecord->Set_Value(0, fDist);
					pRecord->Set_Value(1, pGrid->asFloat(x,y));
                }//if
                iLastX = x;
                iLastY = y;
                if (x == x2) {
                    break;
                }// if
                x += xInc;
                D += M;
                if (D > HX) {
                    y += yInc;
                    D -= c;
                }// if
            }// for
        }// if
        else {
            c = 2 * HY;
            M = 2 * HX;
            for (;;) {
                fPartialDist = (float)(M_GET_LENGTH(x-iLastX, y-iLastY) * pGrid->Get_Cellsize());
                if (pGrid->is_InGrid(x,y) && fPartialDist){
					fDist+=fPartialDist;
                	pRecord = pProfileTable->Add_Record();
					pRecord->Set_Value(0, fDist);
					pRecord->Set_Value(1, pGrid->asFloat(x,y));
                }//if
                iLastX = x;
                iLastY = y;
                if (y == y2) {
                    break;
                }// if
                y += yInc;
                D += M;
                if (D > HY) {
                    x += xInc;
                    D -= c;
                }// if
            }// for
        }// else        
     
	}//for

	return true;

}// method
//---------------------------------------------------------
bool CTopographic_Openness::On_Execute(void)
{
	CSG_Grid	*pPos, *pNeg;

	m_pDEM		= Parameters("DEM"   )->asGrid();
	pPos		= Parameters("POS"   )->asGrid();
	pNeg		= Parameters("NEG"   )->asGrid();

	m_Radius	= Parameters("RADIUS")->asDouble();
	m_Method	= Parameters("METHOD")->asInt();

	DataObject_Set_Colors(pPos, 100, SG_COLORS_RED_GREY_BLUE, true);
	DataObject_Set_Colors(pNeg, 100, SG_COLORS_RED_GREY_BLUE, false);

	//-----------------------------------------------------
	if( m_Method == 0 )	// multi scale
	{
		if( !m_Pyramid.Create(m_pDEM, Parameters("DLEVEL")->asDouble(), GRID_PYRAMID_Mean) )
		{
			return( false );
		}

		m_nLevels	= m_Pyramid.Get_Count();

		if( m_Radius > 0.0 )
		{
			while( m_nLevels > 0 && m_Pyramid.Get_Grid(m_nLevels - 1)->Get_Cellsize() > m_Radius )
			{
				m_nLevels--;
			}
		}
	}

	//-----------------------------------------------------
	bool	bResult	= Initialise(Parameters("NDIRS")->asInt());

	if( bResult )
	{
		if( m_Method != 0 && m_Radius <= 0.0 )
		{
			m_Radius	= Get_Cellsize() * M_GET_LENGTH(Get_NX(), Get_NY());
		}

		for(int y=0; y<Get_NY() && Set_Progress(y); y++)
		{
			#pragma omp parallel for
			for(int x=0; x<Get_NX(); x++)
			{
				double	Pos, Neg;

				if( Get_Openness(x, y, Pos, Neg) )
				{
					if( pPos )	pPos->Set_Value(x, y, Pos);
					if( pNeg )	pNeg->Set_Value(x, y, Neg);
				}
				else
				{
					if( pPos )	pPos->Set_NoData(x, y);
					if( pNeg )	pNeg->Set_NoData(x, y);
				}
			}
		}
	}

	//-----------------------------------------------------
	m_Pyramid	.Destroy();
	m_Direction	.Clear();

	return( bResult );
}
Example #7
0
//---------------------------------------------------------
bool CSG_Grid_Radius::Create(int maxRadius)
{
	Destroy();

	//-----------------------------------------------------
	if( maxRadius > 0 && maxRadius != m_maxRadius )
	{
		int		x, y, i, n;
		double	d;

		m_maxRadius	= maxRadius;

		m_nPoints_R	= (int *)SG_Calloc(m_maxRadius + 1, sizeof(int));

		for(y=-m_maxRadius; y<=m_maxRadius; y++)
		{
			for(x=-m_maxRadius; x<=m_maxRadius; x++)
			{
				if( (d = M_GET_LENGTH(x, y)) <= m_maxRadius )
				{
					m_nPoints++;
					m_nPoints_R[(int)d]++;
				}
			}
		}

		//-------------------------------------------------
		if( m_nPoints > 0 )
		{
			m_Points	= (TSG_Grid_Radius  *)SG_Calloc(m_nPoints      , sizeof(TSG_Grid_Radius  ));
			m_Points_R	= (TSG_Grid_Radius **)SG_Calloc(m_maxRadius + 1, sizeof(TSG_Grid_Radius *));

			for(i=0, n=0; i<=m_maxRadius; i++)
			{
				m_Points_R [i]	 = m_Points + n;
				n				+= m_nPoints_R[i];
				m_nPoints_R[i]	 = 0;
			}

			//---------------------------------------------
			for(y=-m_maxRadius; y<=m_maxRadius; y++)
			{
				for(x=-m_maxRadius; x<=m_maxRadius; x++)
				{
					if( (d = M_GET_LENGTH(x, y)) <= m_maxRadius )
					{
						i	= (int)d;
						n	= m_nPoints_R[i]++;

						m_Points_R[i][n].x	= x;
						m_Points_R[i][n].y	= y;
						m_Points_R[i][n].d	= d;
					}
				}
			}

			return( true );
		}
	}

	//-----------------------------------------------------
	Destroy();

	return( false );
}