pihmRasterLIBS/streamSegmentationShp.cpp

Go to the documentation of this file.
00001 #include <stdio.h>
00002 #include "lsm.h"
00003 #include "./../pihmLIBS/shapefil.h"
00004 
00005 
00006 #define MAX 8 // MAX => No. of converging cells to one cell
00007 
00008 int streamSegmentationShp(char *rivFile, char *fdrFile, char *rivShpFile, char *rivDbfFile);
00009 void streamGenShp(float **riv, short **fdr, int i, int j);
00010 void findIJShp(short **fdr, int i, int j, int *mIJ);
00011 int findCellShp(float **riv, short **fdr, int i, int j, int (*cell)[2]); 
00012 int getNumPts(float **riv, int nx, int ny);
00013 
00014 int old1Fdr, old2Fdr;
00015 //Global Variables for shp api
00016 double *ptx, *pty, *ptz;
00017 int nVertices;
00018 int numPts;
00019 SHPHandle shp; 
00020 DBFHandle dbf; 
00021 SHPObject *obj;
00022 int Att; 
00023 int recordNum;
00024 
00025 
00026     
00027 // Segments the rivers 
00028 int streamSegmentationShp(char *rivFile, char *fdrFile, char *rivShpFile, char *rivDbfFile){
00029     FILE *fp;
00030     int err;
00031     int i, j, fdr;
00032     int mIJ[2];
00033     
00034     int mii;
00035     int mcell[MAX][2];
00036     int mtemp;
00037     int mlocnVertices;
00038 
00039     shp = SHPCreate(rivShpFile, SHPT_ARC);
00040     dbf = DBFCreate(rivDbfFile);
00041     Att = DBFAddField(dbf, "SegNum", FTInteger, 5, 0);
00042     
00043     
00044     err=gridread(fdrFile,(void ***)&dir,RPSHRDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00045     //printf("%d %d %d %d\n",nx, ny, dir[1][2], dir[5][1]);
00046     err=gridread(rivFile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00047     //printf("%d %d %f %f\n",nx, ny, elev[4][2], elev[5][2]);
00048     err=gridread(rivFile,(void ***)&slope,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00049     printf("%d %d %f %f\n",nx, ny, slope[4][2], slope[2][5]); //getchar(); getchar();
00050     
00051     numPts = getNumPts(elev, nx, ny);
00052     printf("total pts= %d\n", numPts); //getchar(); getchar();
00053     ptx = (double *)malloc(numPts*sizeof(double));  
00054     pty = (double *)malloc(numPts*sizeof(double));
00055     ptz = (double *)malloc(numPts*sizeof(double));
00056     
00057     for(i=0; i<nx; i++){ //i => Column : nx => col
00058              for(j=0; j<ny; j++){ //j => Row : ny => row
00059                       //printf("= %d\n",elev[i][j]);
00060                       if(elev[i][j]==1){
00061                            fdr=dir[i][j];
00062                            //printf("= %d\n",fdr);
00063                            findIJShp(dir,i,j,mIJ); //Find outlet
00064                            //printf("IJ= %d %d %d\n",mIJ[0], mIJ[1],elev[mIJ[0]][mIJ[1]]);
00065                            //getchar();
00066                            if(elev[mIJ[0]][mIJ[1]] != 1 ){ // outlet found
00067                                 printf("Outlet-> %d\t%d\t%d\n",mIJ[0], mIJ[1],elev[mIJ[0]][mIJ[1]]);
00068                                 //getchar();
00069                                 
00070                                 mtemp=findCellShp(elev, dir, i, j, mcell);
00071                                 for(mii=0; mii<mtemp; mii++){
00072                                     mlocnVertices=0;
00073                                     ptx[mlocnVertices] = bndbox[0] + (csize/2.0) + i*csize;
00074                                     pty[mlocnVertices] = bndbox[3] - (csize/2.0) - j*csize;         
00075                                     ptz[mlocnVertices] = 0.0;
00076                                     
00077                                     old1Fdr = old2Fdr;
00078                                     old2Fdr = dir[i][j];
00079                                     nVertices = 1;
00080                                     //streamGenShp(elev, dir, i, j);
00081                                     streamGenShp(elev, dir, mcell[mii][0], mcell[mii][1]);
00082                                 }
00083                            }
00084                       }
00085              }
00086     }    
00087     //err = gridwrite(segFile,(void **)slope,RPFLTDTYPE,nx,ny,dx,dy,bndbox,csize,mval,filetype);
00088     SHPClose(shp);
00089     DBFClose(dbf);
00090     if(err != 0)return(err);                                                   
00091 }
00092 
00093 // Recursively generates the river segments starting from outlet(i,j)
00094 void streamGenShp(float **riv, short **fdr, int i, int j){
00095     static int num = 1;
00096     int stop = 0;
00097     int ii;
00098     int cell[MAX][2];
00099     int temp;
00100     int locnVertices;
00101     //printf("StreamGen-> %d %d\n",i, j);
00102     //getchar();
00103     old2Fdr = 0;
00104     //sequenceFlag = 0;
00105     locnVertices = nVertices;
00106                            
00107     while(stop == 0){
00108          temp=findCellShp(riv, fdr, i, j, cell);
00109          //printf("temp= %d\n",temp); 
00110          //printf("--> %d\n", locnVertices); //getchar(); getchar();
00111          //printf("%f %f %f\n", bndbox[0], bndbox[1], csize);
00112          ptx[locnVertices] = bndbox[0] + (csize/2.0) + i*csize;
00113          pty[locnVertices] = bndbox[3] - (csize/2.0) - j*csize;         
00114          ptz[locnVertices] = 0.0;
00115          //printf("%f %f %f\n", ptx[locnVertices], pty[locnVertices], ptz[locnVertices]);
00116          locnVertices++;
00117          
00118          
00119          
00120          slope[i][j]=num;
00121          //getchar(); getchar();
00122          if(temp==0){
00123              //write polyline
00124              obj = SHPCreateSimpleObject(SHPT_ARC, locnVertices, ptx, pty, ptz);
00125              SHPWriteObject(shp, -1, obj);
00126              recordNum = num-1;
00127              DBFWriteIntegerAttribute(dbf, recordNum, Att, num);
00128              //printf("shp# %d\n", num);
00129              //printf("1pts = %d\n", locnVertices); getchar(); getchar();
00130              num++;
00131              return;
00132          } 
00133          else if(temp==1){
00134               old1Fdr = fdr[i][j];
00135               i=cell[0][0];
00136               j=cell[0][1];
00137               //old1Fdr = old2Fdr;
00138               old2Fdr = fdr[i][j];
00139               if(old1Fdr==old2Fdr){
00140                            locnVertices--;
00141                            //ptx[locnVertices-1] = ptx[locnVertices]; 
00142                            //pty[locnVertices-1] = pty[locnVertices];
00143               }
00144          }
00145          else{// => temp>1)
00146              //write polyline
00147              //printf("2pts = %d\n", locnVertices); getchar(); getchar();
00148              obj = SHPCreateSimpleObject(SHPT_ARC, locnVertices, ptx, pty, ptz);
00149              //printf("2pts = %d\n", locnVertices); getchar(); getchar();
00150              SHPWriteObject(shp, -1, obj);
00151              recordNum = num-1;
00152              DBFWriteIntegerAttribute(dbf, recordNum, Att, num);
00153              //printf("shp# %d\n", num);
00154              //printf("2pts = %d\n", locnVertices); getchar(); getchar();
00155              stop = 1;
00156              num++;
00157              //printf("%f\n",num);
00158              if(temp>1){
00159                  // Write polyline
00160                  for(ii=0; ii<temp; ii++){
00161                       // Add previous (junction) point to the list pos#0
00162                       locnVertices=0;
00163                       ptx[locnVertices] = bndbox[0] + (csize/2.0) + i*csize;
00164                       pty[locnVertices] = bndbox[3] - (csize/2.0) - j*csize;         
00165                       ptz[locnVertices] = 0.0;
00166                       
00167                       old1Fdr = old2Fdr;
00168                       old2Fdr = fdr[i][j];
00169                       // set global # of vertices to 1
00170                       nVertices=1;
00171                       streamGenShp(riv, fdr, cell[ii][0], cell[ii][1]);
00172                  }
00173              }
00174          }
00175     }
00176     return;
00177 }
00178         
00179 // Finds down-stream cell index 
00180 void findIJShp(short **fdr, int i, int j, int *mIJ){
00181      // i => column : j => row
00182     //printf("fdr= %d %d %d\n",i,j,fdr[i][j]);
00183     if(fdr[i][j]==4 || fdr[i][j]==5 || fdr[i][j]==6)
00184         mIJ[0]=i-1;
00185     else if(fdr[i][j]==2 || fdr[i][j]==1 || fdr[i][j]==8)
00186         mIJ[0]=i+1;
00187     else
00188         mIJ[0]=i;
00189     
00190     if(fdr[i][j]==4 || fdr[i][j]==3 || fdr[i][j]==2)
00191         mIJ[1]=j-1;
00192     else if(fdr[i][j]==6 || fdr[i][j]==7 || fdr[i][j]==8)
00193         mIJ[1]=j+1;
00194     else
00195         mIJ[1]=j;
00196     
00197     return;
00198 }
00199 
00200 // Finds ALL the up-stream/draining cells index 
00201 int findCellShp(float **riv, short **dir, int i, int j, int (*cell)[2]){
00202      int ii, jj;
00203      int cellCount=0;
00204      int fdr;
00205      int mIJ[2];
00206      //printf("i= %d j= %d\n",i,j);
00207      for(ii=i-1; ii<=i+1; ii++){ //col 
00208          for(jj=j-1; jj<=j+1; jj++){ //row
00209              //printf("ii= %d jj= %d\n",ii, jj);
00210              if((ii!=i || jj!=j) && riv[ii][jj]==1){
00211                  //fdr=dir[ii][jj];
00212                  findIJShp(dir, ii, jj, mIJ);
00213                  //printf("%d %d\n", mIJ[0], mIJ[1]);
00214                  if(mIJ[0]==i && mIJ[1]==j){
00215                      cell[cellCount][0]=ii;
00216                      cell[cellCount][1]=jj;
00217                      cellCount++;
00218                      //printf("-> %d %d\n", ii, jj);
00219                      //printf("here\n");
00220                  }
00221              }
00222          }
00223      }
00224      //getchar(); getchar();
00225      return cellCount;
00226 }
00227                  
00228 int getNumPts(float **riv, int nx, int ny){
00229     int i, j, num=0;
00230     printf("debug getNumPts\n"); //getchar(); getchar();
00231     for(i=0; i<nx; i++){
00232             for(j=0; j<ny; j++){
00233                     if(riv[i][j]==1)
00234                         num++;
00235             }
00236     }
00237     printf("debug getNumPts OUT\n"); //getchar(); getchar();
00238     return num;
00239 }

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