📄 saga_wetness_index.cpp
字号:
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
// in den folgenden zwei Schritten wird der SAGA
// Bodenfeuchteindex SB ermittelt. Der a-Parameter muss
// bei den Settings definiert werden und sorgt dafuer,
// das nicht durch 0 dividiert wird
//---------------------------------------------------------
bool CSAGA_Wetness_Index::Get_Wetness_Index(CSG_Grid *pDEM, CSG_Grid *pCS, CSG_Grid *pSB, double a)
{
int x, y;
double Slope, Azimuth;
Process_Set_Text(_TL("Wetness index calculation..."));
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
if( !pDEM->is_NoData(x, y) && !pCS->is_NoData(x, y) )
{
pDEM->Get_Gradient(x, y, Slope, Azimuth);
pSB->Set_Value(x, y, log(pCS->asDouble(x, y) / tan(a + Slope)));
}
else
{
pSB->Set_NoData(x, y);
}
}
}
//-----------------------------------------------------
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
// The original BSL script by J.Boehner
//---------------------------------------------------------
/*
Matrix Loop, O("sch-hoe.grd"), N("sch-nei.grd"), M, R, UL, LL, OL, OO, OR, RR, UR, UU, X, Y, Z, C, CS, SB;
Point ploop, p, pul, pu, pur, pl, pr, pol, po, por;
Float a, wul, wll, wol, woo, wor, wrr, wur, wuu;
Integer t, h, i, j, gefunden;
a = 0.0174532;
t = 10;
pul.x = -1; pul.y = -1;
pu.x = 0; pu.y = -1;
pur.x = 1; pur.y = -1;
pl.x = -1; pl.y = 0;
pr.x = 1; pr.y = 0;
pol.x = -1; pol.y = 1;
po.x = 0; po.y = 1;
por.x = 1; por.y = 1;
M = O;
R = O;
UL = O;
LL = O;
OL = O;
OO = O;
OR = O;
RR = O;
UR = O;
UU = O;
X = O;
Y = O;
Z = O;
C = O;
CS = O;
SB = O;
Loop.xanz = 100000;
Loop.yanz = 1;
h = 0;
i = 0;
j = 0;
// hier wird eine Hilfsmatrix X erzeugt, die in der folgenden Schleife fafuer sorgt, dass noch nicht attributisierte Rasterzellen in Ihrer Position identifiziert werden koennen //
foreach p in X do
{ if (p.x == 0 || p.x == M.xanz - 1 || p.y == 0 || p.y == M.yanz - 1)
{X[p] = -10000;}
else
{X[p] = M[p];}
}
// hier wird eine Matrix R erzeugt, die ausgehend von lokalen Maxima fortlaufend Rangplatzziffernerzeugt //
foreach ploop in Loop do
{ ploop.x = 1;
h = h +1;
gefunden = 0;
foreach p in X do
{
if (X[p] == max9(p, X) && X[p] > -10000)
{X[p] = -10000; R[p] = h; gefunden = 1;}
}
if (gefunden == 0)
{ploop.x = 100000;}
}
setRandN(R);
// hier wird eine Hilfsmatrix R erzeugt, die Rangplatzziffern am Rand duch 0 ersetzt //
foreach p in R do
{ if (p.x == 0 || p.x == M.xanz - 1 || p.y == 0 || p.y == M.yanz - 1)
{R[p] = 0;}
else
{R[p] = R[p];}
}
// hier wird eine Matrix Z erzeugt, die die positiven Winkel zu den 8 Nachbarzellen aufsummiert //
foreach p in Z do
{
if(p.x == 0 && p.y == 0)
{
if((M[p] - M[p+po]) > 0)
{woo = atan ((M[p] - M[p+po]) / M.dxy);}
else
{woo = 0;}
if((M[p] - M[p+por]) > 0)
{wor = atan ((M[p] - M[p+por]) / (2 * M.dxy^2)^0.5);}
else
{wor = 0;}
if((M[p] - M[p+pr]) > 0)
{wrr = atan ((M[p] - M[p+pr]) / M.dxy);}
else
{wrr = 0;}
if((woo + wor + wrr) == 0)
{Z[p] = 0;}
else
{Z[p] = woo + wor + wrr;}
}
else
{
if(p.x == 0 && p.y == (M.yanz - 1))
{
if((M[p] - M[p+pr]) > 0)
{wrr = atan ((M[p] - M[p+pr]) / M.dxy);}
else
{wrr = 0;}
if((M[p] - M[p+pur]) > 0)
{wur = atan ((M[p] - M[p+pur]) / (2 * M.dxy^2)^0.5);}
else
{wur = 0;}
if((M[p] - M[p+pu]) > 0)
{wuu = atan ((M[p] - M[p+pu]) / M.dxy);}
else
{wuu = 0;}
if((wrr + wur + wuu) == 0)
{Z[p] = 0;}
else
{Z[p] = wrr + wur + wuu;}
}
else
{
if(p.x == M.xanz - 1 && p.y == M.yanz - 1)
{
if((M[p] - M[p+pul]) > 0)
{wul = atan ((M[p] - M[p+pul]) / (2 * M.dxy^2)^0.5);}
else
{wul = 0;}
if((M[p] - M[p+pl]) > 0)
{wll = atan ((M[p] - M[p+pl]) / M.dxy);}
else
{wll = 0;}
if((M[p] - M[p+pu]) > 0)
{wuu = atan ((M[p] - M[p+pu]) / M.dxy);}
else
{wuu = 0;}
if((wul + wll + wuu) == 0)
{Z[p] = 0;}
else
{Z[p] = wul + wll + wuu;}
}
else
{
if(p.x == M.xanz - 1 && p.y == 0)
{
if((M[p] - M[p+pl]) > 0)
{wll = atan ((M[p] - M[p+pl]) / M.dxy);}
else
{wll = 0;}
if((M[p] - M[p+pol]) > 0)
{wol = atan ((M[p] - M[p+pol]) / (2 * M.dxy^2)^0.5);}
else
{wol = 0;}
if((M[p] - M[p+po]) > 0)
{woo = atan ((M[p] - M[p+po]) / M.dxy);}
else
{woo = 0;}
if((wll + wol + woo) == 0)
{Z[p] = 0;}
else
{Z[p] = wll + wol + woo;}
}
else
{
if(p.x == 0)
{
if((M[p] - M[p+po]) > 0)
{woo = atan ((M[p] - M[p+po]) / M.dxy);}
else
{woo = 0;}
if((M[p] - M[p+por]) > 0)
{wor = atan ((M[p] - M[p+por]) / (2 * M.dxy^2)^0.5);}
else
{wor = 0;}
if((M[p] - M[p+pr]) > 0)
{wrr = atan ((M[p] - M[p+pr]) / M.dxy);}
else
{wrr = 0;}
if((M[p] - M[p+pur]) > 0)
{wur = atan ((M[p] - M[p+pur]) / (2 * M.dxy^2)^0.5);}
else
{wur = 0;}
if((M[p] - M[p+pu]) > 0)
{wuu = atan ((M[p] - M[p+pu]) / M.dxy);}
else
{wuu = 0;}
if((woo + wor + wrr + wur + wuu) == 0)
{Z[p] = 0;}
else
{Z[p] = woo + wor + wrr + wur + wuu;}
}
else
{
if(p.x == M.xanz - 1)
{
if((M[p] - M[p+pul]) > 0)
{wul = atan ((M[p] - M[p+pul]) / (2 * M.dxy^2)^0.5);}
else
{wul = 0;}
if((M[p] - M[p+pl]) > 0)
{wll = atan ((M[p] - M[p+pl]) / M.dxy);}
else
{wll = 0;}
if((M[p] - M[p+pol]) > 0)
{wol = atan ((M[p] - M[p+pol]) / (2 * M.dxy^2)^0.5);}
else
{wol = 0;}
if((M[p] - M[p+po]) > 0)
{woo = atan ((M[p] - M[p+po]) / M.dxy);}
else
{woo = 0;}
if((M[p] - M[p+pu]) > 0)
{wuu = atan ((M[p] - M[p+pu]) / M.dxy);}
else
{wuu = 0;}
if((wul + wll + wol + woo + wuu) == 0)
{Z[p] = 0;}
else
{Z[p] = wul + wll + wol + woo + wuu;}
}
else
{
if(p.y == 0)
{
if((M[p] - M[p+pl]) > 0)
{wll = atan ((M[p] - M[p+pl]) / M.dxy);}
else
{wll = 0;}
if((M[p] - M[p+pol]) > 0)
{wol = atan ((M[p] - M[p+pol]) / (2 * M.dxy^2)^0.5);}
else
{wol = 0;}
if((M[p] - M[p+po]) > 0)
{woo = atan ((M[p] - M[p+po]) / M.dxy);}
else
{woo = 0;}
if((M[p] - M[p+por]) > 0)
{wor = atan ((M[p] - M[p+por]) / (2 * M.dxy^2)^0.5);}
else
{wor = 0;}
if((M[p] - M[p+pr]) > 0)
{wrr = atan ((M[p] - M[p+pr]) / M.dxy);}
else
{wrr = 0;}
if((wll + wol + woo + wor + wrr) == 0)
{Z[p] = 0;}
else
{Z[p] = wll + wol + woo + wor + wrr;}
}
else
{
if(p.y == M.yanz - 1)
{
if((M[p] - M[p+pul]) > 0)
{wul = atan ((M[p] - M[p+pul]) / (2 * M.dxy^2)^0.5);}
else
{wul = 0;}
if((M[p] - M[p+pl]) > 0)
{wll = atan ((M[p] - M[p+pl]) / M.dxy);}
else
{wll = 0;}
if((M[p] - M[p+pr]) > 0)
{wrr = atan ((M[p] - M[p+pr]) / M.dxy);}
else
{wrr = 0;}
if((M[p] - M[p+pur]) > 0)
{wur = atan ((M[p] - M[p+pur]) / (2 * M.dxy^2)^0.5);}
else
{wur = 0;}
if((M[p] - M[p+pu]) > 0)
{wuu = atan ((M[p] - M[p+pu]) / M.dxy);}
else
{wuu = 0;}
if((wul + wll + wrr + wur + wuu) == 0)
{Z[p] = 0;}
else
{Z[p] = wul + wll + wrr + wur + wuu;}
}
else
{
if((M[p] - M[p+pul]) > 0)
{wul = atan ((M[p] - M[p+pul]) / (2 * M.dxy^2)^0.5);}
else
{wul = 0;}
if((M[p] - M[p+pl]) > 0)
{wll = atan ((M[p] - M[p+pl]) / M.dxy);}
else
{wll = 0;}
if((M[p] - M[p+pol]) > 0)
{wol = atan ((M[p] - M[p+pol]) / (2 * M.dxy^2)^0.5);}
else
{wol = 0;}
if((M[p] - M[p+po]) > 0)
{woo = atan ((M[p] - M[p+po]) / M.dxy);}
else
{woo = 0;}
if((M[p] - M[p+por]) > 0)
{wor = atan ((M[p] - M[p+por]) / (2 * M.dxy^2)^0.5);}
else
{wor = 0;}
if((M[p] - M[p+pr]) > 0)
{wrr = atan ((M[p] - M[p+pr]) / M.dxy);}
else
{wrr = 0;}
if((M[p] - M[p+pur]) > 0)
{wur = atan ((M[p] - M[p+pur]) / (2 * M.dxy^2)^0.5);}
else
{wur = 0;}
if((M[p] - M[p+pu]) > 0)
{wuu = atan ((M[p] - M[p+pu]) / M.dxy);}
else
{wuu = 0;}
if((wul + wll + wol + woo + wor + wrr + wur + wuu) == 0)
{Z[p] = 0;}
else
{Z[p] = wul + wll + wol + woo + wor + wrr + wur + wuu;}
}
}}}}}}}}
// hier werden Grids UL bis UU (im Uhrzeigersinn) erzeugt, die angeben, welchen Anteil des Inhalts einer benachbarten Rasterzelle in die Zielrasterzelle (zentrale Rasterzelle im 9er Feld) uebergen wird //
foreach p in UL do
{ if (p.x == 0 || p.y == 0)
{UL[p] = 0;}
else {
if((M[p] - M[p+pul]) < 0 && Z[p+pul] > 0)
{UL[p] = (atan((M[p+pul] - M[p])/(2 * M.dxy^2)^0.5))/Z[p+pul];}
else
{UL[p] = 0;}
}
}
foreach p in LL do
{ if (p.x == 0)
{LL[p] = 0;}
else {
if((M[p] - M[p+pl]) < 0 && Z[p+pl] > 0)
{LL[p] = (atan((M[p+pl] - M[p])/M.dxy))/Z[p+pl];}
else
{LL[p] = 0;}
}
}
foreach p in OL do
{ if (p.x == 0 || p.y == M.yanz - 1)
{OL[p] = 0;}
else {
if((M[p] - M[p+pol]) < 0 && Z[p+pol] > 0)
{OL[p] = (atan((M[p+pol] - M[p])/(2 * M.dxy^2)^0.5))/Z[p+pol];}
else
{OL[p] = 0;}
}
}
foreach p in OO do
{ if (p.y == M.yanz - 1)
{OO[p] = 0;}
else {
if((M[p] - M[p+po]) < 0 && Z[p+po] > 0)
{OO[p] = (atan((M[p+po] - M[p])/M.dxy))/Z[p+po];}
else
{OO[p] = 0;}
}
}
foreach p in OR do
{ if (p.x == M.xanz - 1 || p.y == M.yanz - 1)
{OR[p] = 0;}
else {
if((M[p] - M[p+por]) < 0 && Z[p+por] > 0)
{OR[p] = (atan((M[p+por] - M[p])/(2 * M.dxy^2)^0.5))/Z[p+por];}
else
{OR[p] = 0;}
}
}
foreach p in RR do
{ if (p.x == M.xanz - 1)
{RR[p] = 0;}
else {
if((M[p] - M[p+pr]) < 0 && Z[p+pr] > 0)
{RR[p] = (atan((M[p+pr] - M[p])/M.dxy))/Z[p+pr];}
else
{RR[p] = 0;}
}
}
foreach p in UR do
{ if (p.x == M.xanz - 1 || p.y == 0)
{UR[p] = 0;}
else {
if((M[p] - M[p+pur]) < 0 && Z[p+pur] > 0)
{UR[p] = (atan((M[p+pur] - M[p])/(2 * M.dxy^2)^0.5))/Z[p+pur];}
else
{UR[p] = 0;}
}
}
foreach p in UU do
{ if (p.y == 0)
{UU[p] = 0;}
else {
if((M[p] - M[p+pu]) < 0 && Z[p+pu] > 0)
{UU[p] = (atan((M[p+pu] - M[p])/M.dxy))/Z[p+pu];}
else
{UU[p] = 0;}
}
}
// in den folgenden drei Schritten wird nach der "multiple flow methode" die Einzugsgebietsgroe遝 C ermittelt //
foreach p in Z do
{Z[p] = 1;}
foreach ploop in Loop do
{ ploop.x = 1;
i = i +1;
gefunden = 0;
foreach p in Z do
{ if (R[p] == i)
{Z[p] = 1 + Z[p+pul] * UL[p] + Z[p+pl] * LL[p] + Z[p+pol] * OL[p] + Z[p+po] * OO[p] + Z[p+por] * OR[p] + Z[p+pr] * RR[p] + Z[p+pur] * UR[p] + Z[p+pu] * UU[p]; gefunden = 1;}
}
if (gefunden == 0)
{ploop.x = 100000;}
}
setRandN(Z);
foreach p in C do
{C[p] = Z[p] * O.dxy^2;}
// in den folgenden drei Schritten wird die gesaugte Einzugsgebietsgroe遝 CS ermittelt, wobei der t-Parameter die Staerke der Saugung steuert. Werte unter 10 (z.B.: 5) fuehren zu einer starken Saugung, Werte ueber 10 (z.B. 15) zu einer schwachen Saugung. Die gesaugte Einzugsgebietsgroe遝 selbst stellt bereits einen Parameter Dar, der die raeumliche Relief-bedingte Feuchteverteilung in guter Weise annaehert //
foreach p in X do
{X[p] = C[p];}
foreach ploop in Loop do
{ ploop.x = 1;
j = j +1;
gefunden = 0;
foreach p in X do
{
if ((((1/t^N[p])^exp(t^N[p])) * max9(p, X)) > X[p])
{X[p] = (((1/t^N[p])^exp(t^N[p])) * max9(p, X)); gefunden = 1;}
}
if (gefunden == 0)
{ploop.x = 100000;}
}
foreach p in CS do
{ if (isRand(p, M) == 0)
{
if(X[p] > C[p] || X[p+pul] > C[p+pul] || X[p+pl] > X[p+pl] || X[p+pol] > C[p+pol] || X[p+po] > C[p+po] || X[p+por] > C[p+por] || X[p+pr] > C[p+pr] || X[p+pur] > C[p+pur] || X[p+pu] > C[p+pu])
{CS[p] = ln((X[p] + X[p+pul] + X[p+pu] + X[p+pur] + X[p+pl] + X[p+pr] + X[p+pol] + X[p+po] + X[p+por])/9);}
else
{CS[p] = ln(X[p]);}
}
}
setRandN (CS);
showMatrix(CS);
// in den folgenden zwei Schritten wird der SAGA Bodenfeuchteindex SB ermittelt. Der a-Parameter muss bei den Settings definiert werden und sorgt dafuer, das nicht durch 0 dividiert wird //
foreach p in SB do
{SB[p] = exp(CS[p])/tan(N[p] + a);}
foreach p in SB do
{SB[p] = ln(SB[p]);}
showMatrix(SB);
/**/
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -