SDTS_AL

sdts_al.h

00001 /******************************************************************************
00002  * $Id: sdts_al.h 19953 2010-07-02 06:03:04Z warmerdam $
00003  *
00004  * Project:  SDTS Translator
00005  * Purpose:  Include file for entire SDTS Abstraction Layer functions.
00006  * Author:   Frank Warmerdam, warmerdam@pobox.com
00007  *
00008  ******************************************************************************
00009  * Copyright (c) 1999, Frank Warmerdam
00010  *
00011  * Permission is hereby granted, free of charge, to any person obtaining a
00012  * copy of this software and associated documentation files (the "Software"),
00013  * to deal in the Software without restriction, including without limitation
00014  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
00015  * and/or sell copies of the Software, and to permit persons to whom the
00016  * Software is furnished to do so, subject to the following conditions:
00017  *
00018  * The above copyright notice and this permission notice shall be included
00019  * in all copies or substantial portions of the Software.
00020  *
00021  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00022  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00023  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
00024  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00025  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
00026  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
00027  * DEALINGS IN THE SOFTWARE.
00028  ****************************************************************************/
00029 
00030 #ifndef SDTS_AL_H_INCLUDED
00031 #define STDS_AL_H_INCLUDED
00032 
00033 #include "cpl_conv.h"
00034 #include "iso8211.h"
00035 
00036 class SDTS_IREF;
00037 class SDTSModId;
00038 class SDTSTransfer;
00039 
00040 #define SDTS_SIZEOF_SADR        8
00041 
00042 char **SDTSScanModuleReferences( DDFModule *, const char * );
00043 
00044 /************************************************************************/
00045 /*                              SDTS_IREF                               */
00046 /************************************************************************/
00047 
00053 class SDTS_IREF
00054 {
00055     int         nDefaultSADRFormat;
00056     
00057   public:
00058                 SDTS_IREF();
00059                 ~SDTS_IREF();
00060 
00061     int         Read( const char *pszFilename );
00062 
00063     char        *pszXAxisName;                  /* XLBL */
00064     char        *pszYAxisName;                  /* YLBL */
00065 
00066     double      dfXScale;                       /* SFAX */
00067     double      dfYScale;                       /* SFAY */
00068 
00069     double      dfXOffset;                      /* XORG */
00070     double      dfYOffset;                      /* YORG */
00071 
00072     double      dfXRes;                         /* XHRS */
00073     double      dfYRes;                         /* YHRS */
00074 
00075     char        *pszCoordinateFormat;           /* HFMT */
00076 
00077     int         GetSADRCount( DDFField * );
00078     int         GetSADR( DDFField *, int, double *, double *, double * );
00079 };
00080 
00081 /************************************************************************/
00082 /*                              SDTS_XREF                               */
00083 /************************************************************************/
00084 
00090 class SDTS_XREF
00091 {
00092   public:
00093                 SDTS_XREF();
00094                 ~SDTS_XREF();
00095 
00096     int         Read( const char *pszFilename );
00097 
00100     char        *pszSystemName;         
00101                                   
00102 
00105     char        *pszDatum;              
00106                                   
00108     int         nZone;                        
00109 };
00110 
00111 /************************************************************************/
00112 /*                              SDTS_CATD                               */
00113 /************************************************************************/
00114 class SDTS_CATDEntry;
00115 
00120 typedef enum {
00121   SLTUnknown,
00122   SLTPoint,
00123   SLTLine,
00124   SLTAttr,
00125   SLTPoly,
00126   SLTRaster
00127 } SDTSLayerType;
00128 
00133 class SDTS_CATD
00134 {
00135     char        *pszPrefixPath;
00136 
00137     int         nEntries;
00138     SDTS_CATDEntry **papoEntries;
00139     
00140   public:
00141                 SDTS_CATD();
00142                 ~SDTS_CATD();
00143 
00144     int         Read( const char * pszFilename );
00145 
00146     const char  *GetModuleFilePath( const char * pszModule );
00147 
00148     int         GetEntryCount() { return nEntries; }
00149     const char * GetEntryModule(int);
00150     const char * GetEntryTypeDesc(int);
00151     const char * GetEntryFilePath(int);
00152     SDTSLayerType GetEntryType(int);
00153 };
00154 
00155 /************************************************************************/
00156 /*                              SDTSModId                               */
00157 /************************************************************************/
00158 
00163 class SDTSModId
00164 {
00165   public:
00166                 SDTSModId() { szModule[0] = '\0';
00167                               nRecord = -1;
00168                               szOBRP[0] = '\0'; }
00169 
00170     int         Set( DDFField * );
00171 
00172     const char *GetName();
00173 
00175     char        szModule[8];
00176 
00179     long        nRecord;
00180 
00183     char        szOBRP[8]; 
00184 };
00185 
00186 /************************************************************************/
00187 /*                             SDTSFeature                              */
00188 /************************************************************************/
00189 
00194 class SDTSFeature
00195 {
00196 public:
00197 
00198                         SDTSFeature();
00199     virtual            ~SDTSFeature();
00200 
00202     SDTSModId           oModId;
00203 
00205     int         nAttributes;
00206 
00209     SDTSModId   *paoATID;
00210 
00211     void        ApplyATID( DDFField * );
00212 
00213 
00215     virtual void Dump( FILE * ) = 0;
00216 };
00217 
00218 /************************************************************************/
00219 /*                          SDTSIndexedReader                           */
00220 /************************************************************************/
00221 
00227 class SDTSIndexedReader
00228 {
00229     int                 nIndexSize;
00230     SDTSFeature       **papoFeatures;
00231 
00232     int                 iCurrentFeature;
00233 
00234 protected:    
00235     DDFModule           oDDFModule;
00236 
00237 public:
00238                         SDTSIndexedReader();
00239     virtual            ~SDTSIndexedReader();
00240     
00241     virtual SDTSFeature  *GetNextRawFeature() = 0;
00242     
00243     SDTSFeature        *GetNextFeature();
00244 
00245     virtual void        Rewind();
00246     
00247     void                FillIndex();
00248     void                ClearIndex();
00249     int                 IsIndexed();
00250 
00251     SDTSFeature        *GetIndexedFeatureRef( int );
00252     char **             ScanModuleReferences( const char * = "ATID" );
00253 
00254     DDFModule          *GetModule() { return &oDDFModule; }
00255 };
00256 
00257 
00258 /************************************************************************/
00259 /*                             SDTSRawLine                              */
00260 /************************************************************************/
00261 
00264 class SDTSRawLine : public SDTSFeature
00265 {
00266   public:
00267                 SDTSRawLine();
00268     virtual    ~SDTSRawLine();
00269 
00270     int         Read( SDTS_IREF *, DDFRecord * );
00271 
00273     int         nVertices;
00274 
00276     double      *padfX;
00278     double      *padfY;
00280     double      *padfZ;
00281 
00284     SDTSModId   oLeftPoly;             
00285 
00288     SDTSModId   oRightPoly;
00289 
00292     SDTSModId   oStartNode;             /* SNID */
00293 
00296     SDTSModId   oEndNode;               /* ENID */
00297 
00298     void        Dump( FILE * );
00299 };
00300 
00301 /************************************************************************/
00302 /*                            SDTSLineReader                            */
00303 /*                                                                      */
00304 /*      Class for reading any of the files lines.                       */
00305 /************************************************************************/
00306 
00315 class SDTSLineReader : public SDTSIndexedReader
00316 {
00317     SDTS_IREF   *poIREF;
00318     
00319   public:
00320                 SDTSLineReader( SDTS_IREF * );
00321                 ~SDTSLineReader();
00322 
00323     int         Open( const char * );
00324     SDTSRawLine *GetNextLine( void );
00325     void        Close();
00326     
00327     SDTSFeature *GetNextRawFeature( void ) { return GetNextLine(); }
00328 
00329     void        AttachToPolygons( SDTSTransfer *, int iPolyLayer  );
00330 };
00331 
00332 /************************************************************************/
00333 /*                            SDTSAttrRecord                            */
00334 /************************************************************************/
00335 
00345 class SDTSAttrRecord : public SDTSFeature
00346 {
00347   public:
00348                 SDTSAttrRecord();
00349     virtual    ~SDTSAttrRecord();
00350 
00352     DDFRecord   *poWholeRecord;
00353 
00357     DDFField    *poATTR;
00358 
00359     virtual void Dump( FILE * );
00360 };
00361 
00362 /************************************************************************/
00363 /*                            SDTSAttrReader                            */
00364 /************************************************************************/
00365 
00371 class SDTSAttrReader : public SDTSIndexedReader
00372 {
00373     SDTS_IREF   *poIREF;
00374 
00375     int         bIsSecondary;
00376     
00377   public:
00378                 SDTSAttrReader( SDTS_IREF * );
00379    virtual     ~SDTSAttrReader();
00380 
00381     int         Open( const char * );
00382     DDFField    *GetNextRecord( SDTSModId * = NULL,
00383                                 DDFRecord ** = NULL,
00384                                 int bDuplicate = FALSE );
00385     SDTSAttrRecord *GetNextAttrRecord();
00386     void        Close();
00387 
00392     int         IsSecondary() { return bIsSecondary; }
00393     
00394     SDTSFeature *GetNextRawFeature( void ) { return GetNextAttrRecord(); }
00395 };
00396 
00397 /************************************************************************/
00398 /*                             SDTSRawPoint                             */
00399 /************************************************************************/
00400 
00404 class SDTSRawPoint : public SDTSFeature
00405 {
00406   public:
00407                 SDTSRawPoint();
00408     virtual    ~SDTSRawPoint();
00409 
00410     int         Read( SDTS_IREF *, DDFRecord * );
00411 
00413     double      dfX;
00415     double      dfY;
00417     double      dfZ;
00418 
00420     SDTSModId   oAreaId;                /* ARID */
00421 
00422     virtual void Dump( FILE * );
00423 };
00424 
00425 /************************************************************************/
00426 /*                           SDTSPointReader                            */
00427 /************************************************************************/
00428 
00434 class SDTSPointReader : public SDTSIndexedReader
00435 {
00436     SDTS_IREF   *poIREF;
00437     
00438   public:
00439                 SDTSPointReader( SDTS_IREF * );
00440     virtual    ~SDTSPointReader();
00441 
00442     int         Open( const char * );
00443     SDTSRawPoint *GetNextPoint( void );
00444     void        Close();
00445 
00446     SDTSFeature *GetNextRawFeature( void ) { return GetNextPoint(); }
00447 };
00448 
00449 /************************************************************************/
00450 /*                             SDTSRawPolygon                           */
00451 /************************************************************************/
00452 
00470 class SDTSRawPolygon : public SDTSFeature
00471 {
00472     void        AddEdgeToRing( int, double *, double *, double *, int, int );
00473     
00474   public:
00475                 SDTSRawPolygon();
00476     virtual    ~SDTSRawPolygon();
00477 
00478     int         Read( DDFRecord * );
00479 
00480     int         nEdges;
00481     SDTSRawLine **papoEdges;
00482 
00483     void        AddEdge( SDTSRawLine * );
00484 
00487     int         AssembleRings();
00488 
00490     int         nRings;
00492     int         nVertices;
00495     int         *panRingStart;
00496 
00499     double      *padfX;
00502     double      *padfY;
00505     double      *padfZ;
00506 
00507     virtual void Dump( FILE * );
00508 };
00509 
00510 /************************************************************************/
00511 /*                          SDTSPolygonReader                           */
00512 /************************************************************************/
00513 
00516 class SDTSPolygonReader : public SDTSIndexedReader
00517 {
00518     int         bRingsAssembled;
00519     
00520   public:
00521                 SDTSPolygonReader();
00522     virtual    ~SDTSPolygonReader();
00523 
00524     int         Open( const char * );
00525     SDTSRawPolygon *GetNextPolygon( void );
00526     void        Close();
00527 
00528     SDTSFeature *GetNextRawFeature( void ) { return GetNextPolygon(); }
00529 
00530     void        AssembleRings( SDTSTransfer *, int iPolyLayer );
00531 };
00532 
00533 /************************************************************************/
00534 /*                           SDTSRasterReader                           */
00535 /************************************************************************/
00536 
00545 class SDTSRasterReader
00546 {
00547     DDFModule   oDDFModule;
00548 
00549     char        szModule[20];
00550 
00551     int         nXSize;
00552     int         nYSize;
00553     int         nXBlockSize;
00554     int         nYBlockSize;
00555 
00556     int         nXStart;                /* SOCI */
00557     int         nYStart;                /* SORI */
00558 
00559     double      adfTransform[6];
00560     
00561   public:
00562     char        szINTR[4];              /* CE is center, TL is top left */
00563     char        szFMT[32];
00564     char        szUNITS[64];
00565     char        szLabel[64];
00566 
00567                 SDTSRasterReader();
00568                 ~SDTSRasterReader();
00569 
00570     int         Open( SDTS_CATD * poCATD, SDTS_IREF *,
00571                       const char * pszModule  );
00572     void        Close();
00573 
00574     int         GetRasterType();        /* 1 = int16, see GDAL types */
00575 #define SDTS_RT_INT16   1   
00576 #define SDTS_RT_FLOAT32 6
00577 
00578     int         GetTransform( double * );
00579 
00580     int         GetMinMax( double * pdfMin, double * pdfMax,
00581                            double dfNoData );
00582 
00588     int         GetXSize() { return nXSize; }
00594     int         GetYSize() { return nYSize; }
00595 
00597     int         GetBlockXSize() { return nXBlockSize; }
00599     int         GetBlockYSize() { return nYBlockSize; }
00600 
00601     int         GetBlock( int nXOffset, int nYOffset, void * pData );
00602 };
00603 
00604 /************************************************************************/
00605 /*                             SDTSTransfer                             */
00606 /************************************************************************/
00607 
00616 class SDTSTransfer
00617 {
00618   public:
00619                 SDTSTransfer();
00620                 ~SDTSTransfer();
00621 
00622     int         Open( const char * );
00623     void        Close();
00624 
00625     int         FindLayer( const char * );
00626     int         GetLayerCount() { return nLayers; }
00627     SDTSLayerType GetLayerType( int );
00628     int         GetLayerCATDEntry( int );
00629 
00630     SDTSLineReader *GetLayerLineReader( int );
00631     SDTSPointReader *GetLayerPointReader( int );
00632     SDTSPolygonReader *GetLayerPolygonReader( int );
00633     SDTSAttrReader *GetLayerAttrReader( int );
00634     SDTSRasterReader *GetLayerRasterReader( int );
00635     DDFModule   *GetLayerModuleReader( int );
00636 
00637     SDTSIndexedReader *GetLayerIndexedReader( int );
00638 
00644     SDTS_CATD   *GetCATD() { return &oCATD ; }
00645 
00646     SDTS_IREF   *GetIREF() { return &oIREF; }
00647 
00653     SDTS_XREF   *GetXREF() { return &oXREF; }
00654 
00655     SDTSFeature *GetIndexedFeatureRef( SDTSModId *,
00656                                        SDTSLayerType *peType = NULL);
00657                 
00658     DDFField *GetAttr( SDTSModId * );
00659 
00660     int          GetBounds( double *pdfMinX, double *pdfMinY,
00661                             double *pdfMaxX, double *pdfMaxY );
00662     
00663   private:
00664 
00665     SDTS_CATD   oCATD;
00666     SDTS_IREF   oIREF;
00667     SDTS_XREF   oXREF;
00668 
00669     int         nLayers;
00670     int         *panLayerCATDEntry;
00671     SDTSIndexedReader **papoLayerReader;
00672 };
00673 
00674 #endif /* ndef SDTS_AL_H_INCLUDED */

Generated for GDAL by doxygen 1.7.3.