00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
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
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;
00064 char *pszYAxisName;
00065
00066 double dfXScale;
00067 double dfYScale;
00068
00069 double dfXOffset;
00070 double dfYOffset;
00071
00072 double dfXRes;
00073 double dfYRes;
00074
00075 char *pszCoordinateFormat;
00076
00077 int GetSADRCount( DDFField * );
00078 int GetSADR( DDFField *, int, double *, double *, double * );
00079 };
00080
00081
00082
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
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
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
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
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
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;
00293
00296 SDTSModId oEndNode;
00297
00298 void Dump( FILE * );
00299 };
00300
00301
00302
00303
00304
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
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
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
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;
00421
00422 virtual void Dump( FILE * );
00423 };
00424
00425
00426
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
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
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
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;
00557 int nYStart;
00558
00559 double adfTransform[6];
00560
00561 public:
00562 char szINTR[4];
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();
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
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