Changeset 12447

Show
Ignore:
Timestamp:
10/16/07 16:36:35 (1 year ago)
Author:
warmerdam
Message:

fix geoloc backmap shape bug, improve hole filling (#1919)

Files:

Legend:

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

    r10646 r12447  
    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); 
     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                } 
    299303            } 
    300304        }