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
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
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
00046 err=gridread(rivFile,(void ***)&elev,RPFLTDTYPE,&nx,&ny,&dx,&dy,bndbox,&csize,&mval,&filetype);
00047
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]);
00050
00051 numPts = getNumPts(elev, nx, ny);
00052 printf("total pts= %d\n", numPts);
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++){
00058 for(j=0; j<ny; j++){
00059
00060 if(elev[i][j]==1){
00061 fdr=dir[i][j];
00062
00063 findIJShp(dir,i,j,mIJ);
00064
00065
00066 if(elev[mIJ[0]][mIJ[1]] != 1 ){
00067 printf("Outlet-> %d\t%d\t%d\n",mIJ[0], mIJ[1],elev[mIJ[0]][mIJ[1]]);
00068
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
00081 streamGenShp(elev, dir, mcell[mii][0], mcell[mii][1]);
00082 }
00083 }
00084 }
00085 }
00086 }
00087
00088 SHPClose(shp);
00089 DBFClose(dbf);
00090 if(err != 0)return(err);
00091 }
00092
00093
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
00102
00103 old2Fdr = 0;
00104
00105 locnVertices = nVertices;
00106
00107 while(stop == 0){
00108 temp=findCellShp(riv, fdr, i, j, cell);
00109
00110
00111
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
00116 locnVertices++;
00117
00118
00119
00120 slope[i][j]=num;
00121
00122 if(temp==0){
00123
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
00129
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
00138 old2Fdr = fdr[i][j];
00139 if(old1Fdr==old2Fdr){
00140 locnVertices--;
00141
00142
00143 }
00144 }
00145 else{
00146
00147
00148 obj = SHPCreateSimpleObject(SHPT_ARC, locnVertices, ptx, pty, ptz);
00149
00150 SHPWriteObject(shp, -1, obj);
00151 recordNum = num-1;
00152 DBFWriteIntegerAttribute(dbf, recordNum, Att, num);
00153
00154
00155 stop = 1;
00156 num++;
00157
00158 if(temp>1){
00159
00160 for(ii=0; ii<temp; ii++){
00161
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
00170 nVertices=1;
00171 streamGenShp(riv, fdr, cell[ii][0], cell[ii][1]);
00172 }
00173 }
00174 }
00175 }
00176 return;
00177 }
00178
00179
00180 void findIJShp(short **fdr, int i, int j, int *mIJ){
00181
00182
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
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
00207 for(ii=i-1; ii<=i+1; ii++){
00208 for(jj=j-1; jj<=j+1; jj++){
00209
00210 if((ii!=i || jj!=j) && riv[ii][jj]==1){
00211
00212 findIJShp(dir, ii, jj, mIJ);
00213
00214 if(mIJ[0]==i && mIJ[1]==j){
00215 cell[cellCount][0]=ii;
00216 cell[cellCount][1]=jj;
00217 cellCount++;
00218
00219
00220 }
00221 }
00222 }
00223 }
00224
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");
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");
00238 return num;
00239 }