Changeset 12420

Show
Ignore:
Timestamp:
10/14/07 22:27:23 (1 year ago)
Author:
warmerdam
Message:

fixed bug in backmap shaping, iterate to fill backmap

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/alg/gdalgeoloc.cpp

    r10645 r12420  
    171171    int nBMXSize, nBMYSize; 
    172172 
    173     nBMXSize = psTransform->nBackMapHeight =  
     173    nBMYSize = psTransform->nBackMapHeight =  
    174174        (int) ((dfMaxY - dfMinY) / dfPixelSize + 1); 
    175     nBMYSize= psTransform->nBackMapWidth =   
     175    nBMXSize= psTransform->nBackMapWidth =   
    176176        (int) ((dfMaxX - dfMinX) / dfPixelSize + 1); 
    177177 
     
    252252/*      nearby values.                                                  */ 
    253253/* -------------------------------------------------------------------- */ 
    254      
    255     for( iBMY = 1; iBMY < nBMYSize-1; iBMY++ ) 
    256     { 
    257         for( iBMX = 1; iBMX < nBMXSize-1; iBMX++ ) 
    258         { 
    259             // if this point is already set, ignore it.  
    260             if( pabyValidFlag[iBMX + iBMY*nBMXSize] ) 
    261                 continue; 
    262  
    263             int nCount = 0; 
    264             double dfXSum = 0.0, dfYSum = 0.0; 
    265  
    266             // left? 
    267             if( iBMX > 0 && pabyValidFlag[iBMX-1+iBMY*nBMXSize] ) 
    268             { 
    269                 dfXSum += psTransform->pafBackMapX[iBMX-1+iBMY*nBMXSize]; 
    270                 dfYSum += psTransform->pafBackMapY[iBMX-1+iBMY*nBMXSize]; 
    271                 nCount++; 
    272             } 
    273             // right? 
    274             if( iBMX < nBMXSize-1 && pabyValidFlag[iBMX+1+iBMY*nBMXSize] ) 
    275             { 
    276                 dfXSum += psTransform->pafBackMapX[iBMX+1+iBMY*nBMXSize]; 
    277                 dfYSum += psTransform->pafBackMapY[iBMX+1+iBMY*nBMXSize]; 
    278                 nCount++; 
    279             } 
    280             // top? 
    281             if( iBMY > 0 && pabyValidFlag[iBMX+(iBMY-1)*nBMXSize] ) 
    282             { 
    283                 dfXSum += psTransform->pafBackMapX[iBMX+(iBMY-1)*nBMXSize]; 
    284                 dfYSum += psTransform->pafBackMapY[iBMX+(iBMY-1)*nBMXSize]; 
    285                 nCount++; 
    286             } 
    287             // bottom? 
    288             if( iBMY < nBMYSize-1 && pabyValidFlag[iBMX+(iBMY+1)*nBMXSize] ) 
    289             { 
    290                 dfXSum += psTransform->pafBackMapX[iBMX+(iBMY+1)*nBMXSize]; 
    291                 dfYSum += psTransform->pafBackMapY[iBMX+(iBMY+1)*nBMXSize]; 
    292                 nCount++; 
    293             } 
    294  
    295             if( nCount > 0 ) 
    296             { 
    297                 psTransform->pafBackMapX[iBMX + iBMY * nBMXSize] = (float)(dfXSum/nCount); 
    298                 psTransform->pafBackMapY[iBMX + iBMY * nBMXSize] = (float)(dfYSum/nCount); 
    299             } 
    300         } 
    301     } 
     254    int iIter; 
     255 
     256    for( iIter = 0; iIter < 3; iIter++ ) 
     257    { 
     258        for( iBMY = 1; iBMY < nBMYSize-1; iBMY++ ) 
     259        { 
     260            for( iBMX = 1; iBMX < nBMXSize-1; iBMX++ ) 
     261            { 
     262                // if this point is already set, ignore it.  
     263                if( pabyValidFlag[iBMX + iBMY*nBMXSize] ) 
     264                    continue; 
     265 
     266                int nCount = 0; 
     267                double dfXSum = 0.0, dfYSum = 0.0; 
     268 
     269                // left? 
     270                if( iBMX > 0 && pabyValidFlag[iBMX-1+iBMY*nBMXSize] ) 
     271                { 
     272                    dfXSum += psTransform->pafBackMapX[iBMX-1+iBMY*nBMXSize]; 
     273                    dfYSum += psTransform->pafBackMapY[iBMX-1+iBMY*nBMXSize]; 
     274                    nCount++; 
     275                } 
     276                // right? 
     277                if( iBMX < nBMXSize-1 && pabyValidFlag[iBMX+1+iBMY*nBMXSize] ) 
     278                { 
     279                    dfXSum += psTransform->pafBackMapX[iBMX+1+iBMY*nBMXSize]; 
     280                    dfYSum += psTransform->pafBackMapY[iBMX+1+iBMY*nBMXSize]; 
     281                    nCount++; 
     282                } 
     283                // top? 
     284                if( iBMY > 0 && pabyValidFlag[iBMX+(iBMY-1)*nBMXSize] ) 
     285                { 
     286                    dfXSum += psTransform->pafBackMapX[iBMX+(iBMY-1)*nBMXSize]; 
     287                    dfYSum += psTransform->pafBackMapY[iBMX+(iBMY-1)*nBMXSize]; 
     288                    nCount++; 
     289                } 
     290                // bottom? 
     291                if( iBMY < nBMYSize-1 && pabyValidFlag[iBMX+(iBMY+1)*nBMXSize] ) 
     292                { 
     293                    dfXSum += psTransform->pafBackMapX[iBMX+(iBMY+1)*nBMXSize]; 
     294                    dfYSum += psTransform->pafBackMapY[iBMX+(iBMY+1)*nBMXSize]; 
     295                    nCount++; 
     296                } 
     297 
     298                if( nCount > 0 ) 
     299                { 
     300                    psTransform->pafBackMapX[iBMX + iBMY * nBMXSize] = (float)(dfXSum/nCount); 
     301                    psTransform->pafBackMapY[iBMX + iBMY * nBMXSize] = (float)(dfYSum/nCount); 
     302                } 
     303            } 
     304        } 
     305    } 
     306 
     307#ifdef notdef 
     308    GDALDatasetH hBMDS = GDALCreate( GDALGetDriverByName( "GTiff" ), 
     309                                     "backmap.tif", nBMXSize, nBMYSize, 2,  
     310                                     GDT_Float32, NULL ); 
     311    GDALSetGeoTransform( hBMDS, psTransform->adfBackMapGeoTransform ); 
     312    GDALRasterIO( GDALGetRasterBand(hBMDS,1), GF_Write,  
     313                  0, 0, nBMXSize, nBMYSize,  
     314                  psTransform->pafBackMapX, nBMXSize, nBMYSize,  
     315                  GDT_Float32, 0, 0 ); 
     316    GDALRasterIO( GDALGetRasterBand(hBMDS,2), GF_Write,  
     317                  0, 0, nBMXSize, nBMYSize,  
     318                  psTransform->pafBackMapY, nBMXSize, nBMYSize,  
     319                  GDT_Float32, 0, 0 ); 
     320    GDALClose( hBMDS ); 
     321#endif 
    302322 
    303323    CPLFree( pabyValidFlag );