pihmRasterLIBS/streamSegmentation.cpp

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include "lsm.h"
00003 
00004 #define MAX 8
00005 // MAX => No. of converging cells to one cell
00006 
00007 int streamSegmentation(char *rivFile, char *fdrFile, char *segFile, char *nodeFile);
00008 void streamGen(float **riv, short **fdr, int i, int j);
00009 void findIJ(short **fdr, int i, int j, int *mIJ);
00010 int findCell(float **riv, short **fdr, int i, int j, int (*cell)[2]); 
00011 
00012 FILE *fpNode_Seg;
00013 int numNodes_Seg=0;
00014 // Segments the rivers 
00015 int streamSegmentation(char *rivFile, char *fdrFile, char *segFile, char *nodeFile){
00016     
00017     int err;
00018     int i, j, fdr;
00019     int mIJ[2];
00020     fpNode_Seg = fopen(nodeFile, "w");
00021     fprintf(fpNode_Seg, "\n");
00022     err=gridread(fdrFile,(void ***)&dir,RPSHRDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00023     //printf("%d %d %d %d\n",nx, ny, dir[1][2], dir[5][1]);
00024     err=gridread(rivFile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00025     //printf("%d %d %f %f\n",nx, ny, elev[4][2], elev[5][2]);
00026     err=gridread(rivFile,(void ***)&slope,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00027     //printf("%d %d %f %f\n",nx, ny, slope[4][2], slope[2][5]);
00028     for(i=0; i<nx; i++){ //i => Column : nx => col
00029              for(j=0; j<ny; j++){ //j => Row : ny => row
00030                       //printf("= %d\n",elev[i][j]);
00031                       if(elev[i][j]==1){
00032                            fdr=dir[i][j];
00033                            //printf("= %d\n",fdr);
00034                            findIJ(dir,i,j,mIJ); //Find outlet
00035                            //printf("IJ= %d %d %d\n",mIJ[0], mIJ[1],elev[mIJ[0]][mIJ[1]]);
00036                            //getchar();
00037                            if(elev[mIJ[0]][mIJ[1]] != 1 ){ // outlet found
00038                                 printf("Outlet-> %d %d\n",mIJ[0], mIJ[1]);
00039                                 //getchar();
00040                                 numNodes_Seg++;
00041                                 fprintf(fpNode_Seg, "\n%d\t%d", i, j); // i => col :: j = > row
00042                                 streamGen(elev, dir, i, j);
00043                            }
00044                       }
00045              }
00046     }
00047     rewind(fpNode_Seg);
00048     fprintf(fpNode_Seg, "%d\n", numNodes_Seg);
00049     fclose(fpNode_Seg);
00050     err = gridwrite(segFile,(void **)slope,RPFLTDTYPE,nx,ny,dx,dy,bndbox,csize,mval,filetype);
00051     if(err != 0)return(err);                                                   
00052 }
00053 
00054 // Recursively generates the river segments starting from outlet(i,j)
00055 void streamGen(float **riv, short **fdr, int i, int j){
00056     static int num = 1;
00057     int stop = 0;
00058     int ii;
00059     int cell[MAX][2];
00060     int temp;
00061     
00062     //printf("StreamGen-> %d %d\n",i, j);
00063     //getchar();
00064                                 
00065     while(stop == 0){
00066          temp=findCell(riv, fdr, i, j, cell);
00067          //printf("temp= %d\n",temp); 
00068          
00069          slope[i][j]=num;
00070          //getchar(); getchar();
00071          if(temp==0){
00072              num++;
00073              return;
00074          } 
00075          else if(temp==1){
00076               i=cell[0][0];
00077               j=cell[0][1];
00078          }
00079          else{// => temp>1)
00080              stop = 1;
00081              num++;
00082              //printf("%f\n",num);
00083              if(temp>1){
00084                  for(ii=0; ii<temp; ii++){
00085                      numNodes_Seg++;
00086                      fprintf(fpNode_Seg, "\n%d\t%d", cell[ii][0], cell[ii][1]); // i => col :: j = > row
00087                      streamGen(riv, fdr, cell[ii][0], cell[ii][1]);
00088                  }
00089              }
00090          }
00091     }
00092     return;
00093 }
00094         
00095 // Finds down-stream cell index 
00096 void findIJ(short **fdr, int i, int j, int *mIJ){
00097      // i => column : j => row
00098     //printf("fdr= %d %d %d\n",i,j,fdr[i][j]);
00099     if(fdr[i][j]==4 || fdr[i][j]==5 || fdr[i][j]==6)
00100         mIJ[0]=i-1;
00101     else if(fdr[i][j]==2 || fdr[i][j]==1 || fdr[i][j]==8)
00102         mIJ[0]=i+1;
00103     else
00104         mIJ[0]=i;
00105     
00106     if(fdr[i][j]==4 || fdr[i][j]==3 || fdr[i][j]==2)
00107         mIJ[1]=j-1;
00108     else if(fdr[i][j]==6 || fdr[i][j]==7 || fdr[i][j]==8)
00109         mIJ[1]=j+1;
00110     else
00111         mIJ[1]=j;
00112     
00113     return;
00114 }
00115 
00116 // Finds ALL the up-stream/draining cells index 
00117 int findCell(float **riv, short **dir, int i, int j, int (*cell)[2]){
00118      int ii, jj;
00119      int cellCount=0;
00120      int fdr;
00121      int mIJ[2];
00122      //printf("i= %d j= %d\n",i,j);
00123      for(ii=i-1; ii<=i+1; ii++){ //col 
00124          for(jj=j-1; jj<=j+1; jj++){ //row
00125              //printf("ii= %d jj= %d\n",ii, jj);
00126              if((ii!=i || jj!=j) && riv[ii][jj]==1){
00127                  //fdr=dir[ii][jj];
00128                  findIJ(dir, ii, jj, mIJ);
00129                  //printf("%d %d\n", mIJ[0], mIJ[1]);
00130                  if(mIJ[0]==i && mIJ[1]==j){
00131                      cell[cellCount][0]=ii;
00132                      cell[cellCount][1]=jj;
00133                      cellCount++;
00134                      //printf("-> %d %d\n", ii, jj);
00135                      //printf("here\n");
00136                  }
00137              }
00138          }
00139      }
00140      //getchar(); getchar();
00141      return cellCount;
00142 }
00143                  

Generated on Sun Aug 5 17:34:00 2007 for PIHMgis by  doxygen 1.5.2