Changeset 17276


Ignore:
Timestamp:
Jun 20, 2009 7:33:11 AM (7 years ago)
Author:
warmerdam
Message:

several geotiff driver optimizations related coordinate system lookup (#2957)

Location:
sandbox/warmerdam/1.6-esri/gdal
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sandbox/warmerdam/1.6-esri/gdal/frmts/gtiff/geotiff.cpp

    r17187 r17276  
    116116
    117117    char        *pszProjection;
     118    int         bLookedForProjection;
     119
     120    void        LookForProjection();
     121
    118122    double      adfGeoTransform[6];
    119123    int         bGeoTransformValid;
     
    21642168    dfNoDataValue = -9999.0;
    21652169    pszProjection = CPLStrdup("");
     2170    bLookedForProjection = FALSE;
    21662171    bBase = TRUE;
    21672172    bCloseTIFFHandle = FALSE;
     
    27752780    CPLAssert( bBase );
    27762781
     2782    FlushDirectory();
     2783    *ppoActiveDSRef = NULL;
     2784
    27772785/* -------------------------------------------------------------------- */
    27782786/*      Cleanup overviews objects, and get offsets to all overview      */
    27792787/*      directories.                                                    */
    27802788/* -------------------------------------------------------------------- */
    2781     std::vector<uint64>  anOvDirOffsets;
     2789    std::vector<toff_t>  anOvDirOffsets;
    27822790    int i;
    27832791
     
    33153323    {
    33163324        bNeedsRewrite = TRUE;
     3325
     3326/* -------------------------------------------------------------------- */
     3327/*      Clear old tags to ensure we don't end up with conflicting       */
     3328/*      information. (#2625)                                            */
     3329/* -------------------------------------------------------------------- */
     3330#ifdef HAVE_UNSETFIELD
     3331        TIFFUnsetField( hTIFF, TIFFTAG_GEOPIXELSCALE );
     3332        TIFFUnsetField( hTIFF, TIFFTAG_GEOTIEPOINTS );
     3333        TIFFUnsetField( hTIFF, TIFFTAG_GEOTRANSMATRIX );
     3334#endif
    33173335
    33183336/* -------------------------------------------------------------------- */
     
    35073525    char **papszDomainList;
    35083526
     3527    (void) pszProfile;
     3528
    35093529/* ==================================================================== */
    35103530/*      Process each domain.                                            */
     
    41524172
    41534173/************************************************************************/
     4174/*                         LookForProjection()                          */
     4175/************************************************************************/
     4176
     4177void GTiffDataset::LookForProjection()
     4178
     4179{
     4180    if( bLookedForProjection )
     4181        return;
     4182
     4183    bLookedForProjection = TRUE;
     4184    SetDirectory();
     4185
     4186/* -------------------------------------------------------------------- */
     4187/*      Capture the GeoTIFF projection, if available.                   */
     4188/* -------------------------------------------------------------------- */
     4189    GTIF        *hGTIF;
     4190    GTIFDefn    sGTIFDefn;
     4191
     4192    CPLFree( pszProjection );
     4193    pszProjection = NULL;
     4194   
     4195    hGTIF = GTIFNew(hTIFF);
     4196
     4197    if ( !hGTIF )
     4198    {
     4199        CPLError( CE_Warning, CPLE_AppDefined,
     4200                  "GeoTIFF tags apparently corrupt, they are being ignored." );
     4201    }
     4202    else
     4203    {
     4204        if( GTIFGetDefn( hGTIF, &sGTIFDefn ) )
     4205        {
     4206            pszProjection = GTIFGetOGISDefn( hGTIF, &sGTIFDefn );
     4207        }
     4208
     4209        // Is this a pixel-is-point dataset?
     4210        short nRasterType;
     4211
     4212        if( GTIFKeyGet(hGTIF, GTRasterTypeGeoKey, &nRasterType,
     4213                       0, 1 ) == 1 )
     4214        {
     4215            int bMetadataChangedSaved = bMetadataChanged;
     4216            if( nRasterType == (short) RasterPixelIsPoint )
     4217                SetMetadataItem( GDALMD_AREA_OR_POINT, GDALMD_AOP_POINT );
     4218            else
     4219                SetMetadataItem( GDALMD_AREA_OR_POINT, GDALMD_AOP_AREA );
     4220            bMetadataChanged = bMetadataChangedSaved;
     4221        }
     4222
     4223        GTIFFree( hGTIF );
     4224    }
     4225
     4226    if( pszProjection == NULL )
     4227    {
     4228        pszProjection = CPLStrdup( "" );
     4229    }
     4230
     4231    bGeoTIFFInfoChanged = FALSE;
     4232}
     4233
     4234/************************************************************************/
    41544235/*                            ApplyPamInfo()                            */
    41554236/*                                                                      */
     
    41794260        CPLFree( pszProjection );
    41804261        pszProjection = CPLStrdup( pszPamSRS );
     4262        bLookedForProjection= TRUE;
    41814263    }
    41824264
     
    46524734
    46534735/* -------------------------------------------------------------------- */
     4736/*      Otherwise try looking for a .tfw, .tifw or .wld file.           */
     4737/* -------------------------------------------------------------------- */
     4738        else
     4739        {
     4740            bGeoTransformValid =
     4741                GDALReadWorldFile( osFilename, NULL, adfGeoTransform );
     4742
     4743            if( !bGeoTransformValid )
     4744            {
     4745                bGeoTransformValid =
     4746                    GDALReadWorldFile( osFilename, "wld", adfGeoTransform );
     4747            }
     4748
     4749            if( !bGeoTransformValid )
     4750            {
     4751                int bTabFileOK =
     4752                    GDALReadTabFile( osFilename, adfGeoTransform,
     4753                                     &pszTabWKT, &nGCPCount, &pasGCPList );
     4754
     4755                if( bTabFileOK && nGCPCount == 0 )
     4756                    bGeoTransformValid = TRUE;
     4757            }
     4758        }
     4759
     4760/* -------------------------------------------------------------------- */
    46544761/*      Check for GCPs.  Note, we will allow there to be GCPs and a     */
    46554762/*      transform in some circumstances.                                */
    46564763/* -------------------------------------------------------------------- */
    4657         else if( TIFFGetField(hTIFF,TIFFTAG_GEOTIEPOINTS,&nCount,&padfTiePoints )
    4658                  && nCount >= 12 )
     4764        if( TIFFGetField(hTIFF,TIFFTAG_GEOTIEPOINTS,&nCount,&padfTiePoints )
     4765            && !bGeoTransformValid )
    46594766        {
    46604767            nGCPCount = nCount / 6;
     
    46774784
    46784785/* -------------------------------------------------------------------- */
    4679 /*      Otherwise try looking for a .tfw, .tifw or .wld file.           */
    4680 /* -------------------------------------------------------------------- */
    4681         else
    4682         {
    4683             bGeoTransformValid =
    4684                 GDALReadWorldFile( GetDescription(), "tfw", adfGeoTransform );
    4685 
    4686             if( !bGeoTransformValid )
    4687             {
    4688                 bGeoTransformValid =
    4689                     GDALReadWorldFile( GetDescription(), "tifw", adfGeoTransform );
    4690             }
    4691             if( !bGeoTransformValid )
    4692             {
    4693                 bGeoTransformValid =
    4694                     GDALReadWorldFile( GetDescription(), "wld", adfGeoTransform );
    4695             }
    4696             if( !bGeoTransformValid )
    4697             {
    4698                 int bTabFileOK =
    4699                     GDALReadTabFile( GetDescription(), adfGeoTransform,
    4700                                      &pszTabWKT, &nGCPCount, &pasGCPList );
    4701 
    4702                 if( bTabFileOK && nGCPCount == 0 )
    4703                     bGeoTransformValid = TRUE;
    4704             }
    4705         }
    4706 
    4707 /* -------------------------------------------------------------------- */
    4708 /*      Capture the GeoTIFF projection, if available.                   */
    4709 /* -------------------------------------------------------------------- */
    4710         GTIF    *hGTIF;
    4711         GTIFDefn        sGTIFDefn;
    4712 
    4713         CPLFree( pszProjection );
    4714         pszProjection = NULL;
    4715    
    4716         hGTIF = GTIFNew(hTIFF);
    4717 
    4718         if ( !hGTIF )
    4719         {
    4720             CPLError( CE_Warning, CPLE_AppDefined,
    4721                       "GeoTIFF tags apparently corrupt, they are being ignored." );
    4722         }
    4723         else
    4724         {
    4725             if( GTIFGetDefn( hGTIF, &sGTIFDefn ) )
    4726             {
    4727                 pszProjection = GTIFGetOGISDefn( hGTIF, &sGTIFDefn );
    4728             }
    4729 
    4730             // Is this a pixel-is-point dataset?
    4731             short nRasterType;
    4732            
    4733 
    4734             if( GTIFKeyGet(hGTIF, GTRasterTypeGeoKey, &nRasterType,
    4735                            0, 1 ) == 1 )
    4736             {
    4737                 if( nRasterType == (short) RasterPixelIsPoint )
    4738                     SetMetadataItem( GDALMD_AREA_OR_POINT, GDALMD_AOP_POINT );
    4739                 else
    4740                     SetMetadataItem( GDALMD_AREA_OR_POINT, GDALMD_AOP_AREA );
    4741             }
    4742 
    4743             GTIFFree( hGTIF );
    4744         }
    4745        
    4746 /* -------------------------------------------------------------------- */
    4747 /*      If we didn't get a geotiff projection definition, but we did    */
    4748 /*      get one from the .tab file, use that instead.                   */
     4786/*      Did we find a tab file?  If so we will use it's coordinate      */
     4787/*      system and give it precidence.                                  */
    47494788/* -------------------------------------------------------------------- */
    47504789        if( pszTabWKT != NULL
     
    47544793            pszProjection = pszTabWKT;
    47554794            pszTabWKT = NULL;
     4795            bLookedForProjection = TRUE;
    47564796        }
    47574797       
    4758         if( pszProjection == NULL )
    4759         {
    4760             pszProjection = CPLStrdup( "" );
    4761         }
    4762        
    4763         if( pszTabWKT != NULL )
    4764             CPLFree( pszTabWKT );
    4765 
     4798        CPLFree( pszTabWKT );
    47664799        bGeoTIFFInfoChanged = FALSE;
    47674800    }
     
    49154948            const char *pszKey, *pszValue, *pszRole, *pszDomain;
    49164949            char *pszUnescapedValue;
    4917             int nBand;
     4950            int nBand, bIsXML = FALSE;
    49184951
    49194952            if( psItem->eType != CXT_Element
     
    49304963                continue;
    49314964
    4932             int bIsXML = FALSE;
    49334965            if( EQUALN(pszDomain,"xml:",4) )
    49344966                bIsXML = TRUE;
     
    58045836    poDS->ppoActiveDSRef = &(poDS->poActiveDS);
    58055837
    5806     poDS->osFilename = pszFilename;
    58075838    poDS->nRasterXSize = nXSize;
    58085839    poDS->nRasterYSize = nYSize;
     
    58105841    poDS->bCrystalized = FALSE;
    58115842    poDS->nSamplesPerPixel = (uint16) nBands;
     5843    poDS->osFilename = pszFilename;
     5844
     5845    /* Avoid premature crystalization that will cause directory re-writting */
     5846    /* if GetProjectionRef() or GetGeoTransform() are called on the newly created GeoTIFF */
     5847    poDS->bLookedForProjection = TRUE;
    58125848
    58135849    TIFFGetField( hTIFF, TIFFTAG_SAMPLEFORMAT, &(poDS->nSampleFormat) );
     
    63906426                                     pszFilename, papszOptions, TRUE /* don't write RPC and IMG file again */);
    63916427
     6428    /* To avoid unnecessary directory rewriting */
     6429    poDS->bMetadataChanged = FALSE;
     6430    poDS->bGeoTIFFInfoChanged = FALSE;
     6431
    63926432    /* We must re-set the compression level at this point, since it has */
    63936433    /* been lost a few lines above when closing the newly create TIFF file */
     
    64426482    if( nGCPCount == 0 )
    64436483    {
     6484        LookForProjection();
     6485
    64446486        if( EQUAL(pszProjection,"") )
    64456487            return GDALPamDataset::GetProjectionRef();
     
    64586500
    64596501{
     6502    LookForProjection();
     6503
    64606504    if( !EQUALN(pszNewProjection,"GEOGCS",6)
    64616505        && !EQUALN(pszNewProjection,"PROJCS",6)
     
    65356579{
    65366580    if( nGCPCount > 0 )
     6581    {
     6582        LookForProjection();
    65376583        return pszProjection;
     6584    }
    65386585    else
    6539         return "";
     6586        return GDALPamDataset::GetGCPProjection();
    65406587}
    65416588
     
    65596606    if( GetAccess() == GA_Update )
    65606607    {
     6608        bLookedForProjection = TRUE;
     6609
    65616610        if( this->nGCPCount > 0 )
    65626611        {
  • sandbox/warmerdam/1.6-esri/gdal/port/cpl_csv.cpp

    r15264 r17276  
    940940
    941941{
     942/* -------------------------------------------------------------------- */
     943/*      Do we already have this file accessed?  If so, just return      */
     944/*      the existing path without any further probing.                  */
     945/* -------------------------------------------------------------------- */
     946    CSVTable **ppsCSVTableList;
     947
     948    ppsCSVTableList = (CSVTable **) CPLGetTLS( CTLS_CSVTABLEPTR );
     949    if( ppsCSVTableList != NULL )
     950    {
     951        CSVTable *psTable;
     952        int nBasenameLen = strlen(pszBasename);
     953
     954        for( psTable = *ppsCSVTableList;
     955             psTable != NULL;
     956             psTable = psTable->psNext )
     957        {
     958            int nFullLen = strlen(psTable->pszFilename);
     959
     960            if( nFullLen > nBasenameLen
     961                && strcmp(psTable->pszFilename+nFullLen-nBasenameLen,
     962                          pszBasename) == 0
     963                && strchr("/\\",psTable->pszFilename[+nFullLen-nBasenameLen-1])
     964                          != NULL )
     965            {
     966                return psTable->pszFilename;
     967            }
     968        }
     969    }
     970               
     971/* -------------------------------------------------------------------- */
     972/*      Otherwise we need to look harder for it.                        */
     973/* -------------------------------------------------------------------- */
    942974    static CPL_THREADLOCAL char         szPath[512];
    943975    FILE    *fp = NULL;
Note: See TracChangeset for help on using the changeset viewer.