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 szName[0] = '\0'; }
00170
00171 int Set( DDFField * );
00172
00173 const char *GetName();
00174
00176 char szModule[8];
00177
00180 long nRecord;
00181
00184 char szOBRP[8];
00185
00187 char szName[20];
00188
00189
00190 };
00191
00192
00193
00194
00195
00200 class SDTSFeature
00201 {
00202 public:
00203
00204 SDTSFeature();
00205 virtual ~SDTSFeature();
00206
00208 SDTSModId oModId;
00209
00211 int nAttributes;
00212
00215 SDTSModId *paoATID;
00216
00217 void ApplyATID( DDFField * );
00218
00219
00221 virtual void Dump( FILE * ) = 0;
00222 };
00223
00224
00225
00226
00227
00233 class SDTSIndexedReader
00234 {
00235 int nIndexSize;
00236 SDTSFeature **papoFeatures;
00237
00238 int iCurrentFeature;
00239
00240 protected:
00241 DDFModule oDDFModule;
00242
00243 public:
00244 SDTSIndexedReader();
00245 virtual ~SDTSIndexedReader();
00246
00247 virtual SDTSFeature *GetNextRawFeature() = 0;
00248
00249 SDTSFeature *GetNextFeature();
00250
00251 virtual void Rewind();
00252
00253 void FillIndex();
00254 void ClearIndex();
00255 int IsIndexed();
00256
00257 SDTSFeature *GetIndexedFeatureRef( int );
00258 char ** ScanModuleReferences( const char * = "ATID" );
00259
00260 DDFModule *GetModule() { return &oDDFModule; }
00261 };
00262
00263
00264
00265
00266
00267
00270 class SDTSRawLine : public SDTSFeature
00271 {
00272 public:
00273 SDTSRawLine();
00274 virtual ~SDTSRawLine();
00275
00276 int Read( SDTS_IREF *, DDFRecord * );
00277
00279 int nVertices;
00280
00282 double *padfX;
00284 double *padfY;
00286 double *padfZ;
00287
00290 SDTSModId oLeftPoly;
00291
00294 SDTSModId oRightPoly;
00295
00298 SDTSModId oStartNode;
00299
00302 SDTSModId oEndNode;
00303
00304 void Dump( FILE * );
00305 };
00306
00307
00308
00309
00310
00311
00312
00321 class SDTSLineReader : public SDTSIndexedReader
00322 {
00323 SDTS_IREF *poIREF;
00324
00325 public:
00326 SDTSLineReader( SDTS_IREF * );
00327 ~SDTSLineReader();
00328
00329 int Open( const char * );
00330 SDTSRawLine *GetNextLine( void );
00331 void Close();
00332
00333 SDTSFeature *GetNextRawFeature( void ) { return GetNextLine(); }
00334
00335 void AttachToPolygons( SDTSTransfer *, int iPolyLayer );
00336 };
00337
00338
00339
00340
00341
00351 class SDTSAttrRecord : public SDTSFeature
00352 {
00353 public:
00354 SDTSAttrRecord();
00355 virtual ~SDTSAttrRecord();
00356
00358 DDFRecord *poWholeRecord;
00359
00363 DDFField *poATTR;
00364
00365 virtual void Dump( FILE * );
00366 };
00367
00368
00369
00370
00371
00377 class SDTSAttrReader : public SDTSIndexedReader
00378 {
00379 SDTS_IREF *poIREF;
00380
00381 int bIsSecondary;
00382
00383 public:
00384 SDTSAttrReader( SDTS_IREF * );
00385 virtual ~SDTSAttrReader();
00386
00387 int Open( const char * );
00388 DDFField *GetNextRecord( SDTSModId * = NULL,
00389 DDFRecord ** = NULL,
00390 int bDuplicate = FALSE );
00391 SDTSAttrRecord *GetNextAttrRecord();
00392 void Close();
00393
00398 int IsSecondary() { return bIsSecondary; }
00399
00400 SDTSFeature *GetNextRawFeature( void ) { return GetNextAttrRecord(); }
00401 };
00402
00403
00404
00405
00406
00410 class SDTSRawPoint : public SDTSFeature
00411 {
00412 public:
00413 SDTSRawPoint();
00414 virtual ~SDTSRawPoint();
00415
00416 int Read( SDTS_IREF *, DDFRecord * );
00417
00419 double dfX;
00421 double dfY;
00423 double dfZ;
00424
00426 SDTSModId oAreaId;
00427
00428 virtual void Dump( FILE * );
00429 };
00430
00431
00432
00433
00434
00440 class SDTSPointReader : public SDTSIndexedReader
00441 {
00442 SDTS_IREF *poIREF;
00443
00444 public:
00445 SDTSPointReader( SDTS_IREF * );
00446 virtual ~SDTSPointReader();
00447
00448 int Open( const char * );
00449 SDTSRawPoint *GetNextPoint( void );
00450 void Close();
00451
00452 SDTSFeature *GetNextRawFeature( void ) { return GetNextPoint(); }
00453 };
00454
00455
00456
00457
00458
00476 class SDTSRawPolygon : public SDTSFeature
00477 {
00478 void AddEdgeToRing( int, double *, double *, double *, int, int );
00479
00480 public:
00481 SDTSRawPolygon();
00482 virtual ~SDTSRawPolygon();
00483
00484 int Read( DDFRecord * );
00485
00486 int nEdges;
00487 SDTSRawLine **papoEdges;
00488
00489 void AddEdge( SDTSRawLine * );
00490
00493 int AssembleRings();
00494
00496 int nRings;
00498 int nVertices;
00501 int *panRingStart;
00502
00505 double *padfX;
00508 double *padfY;
00511 double *padfZ;
00512
00513 virtual void Dump( FILE * );
00514 };
00515
00516
00517
00518
00519
00522 class SDTSPolygonReader : public SDTSIndexedReader
00523 {
00524 int bRingsAssembled;
00525
00526 public:
00527 SDTSPolygonReader();
00528 virtual ~SDTSPolygonReader();
00529
00530 int Open( const char * );
00531 SDTSRawPolygon *GetNextPolygon( void );
00532 void Close();
00533
00534 SDTSFeature *GetNextRawFeature( void ) { return GetNextPolygon(); }
00535
00536 void AssembleRings( SDTSTransfer *, int iPolyLayer );
00537 };
00538
00539
00540
00541
00542
00551 class SDTSRasterReader
00552 {
00553 DDFModule oDDFModule;
00554
00555 char szModule[20];
00556
00557 int nXSize;
00558 int nYSize;
00559 int nXBlockSize;
00560 int nYBlockSize;
00561
00562 int nXStart;
00563 int nYStart;
00564
00565 double adfTransform[6];
00566
00567 public:
00568 char szINTR[4];
00569 char szFMT[32];
00570 char szUNITS[64];
00571 char szLabel[64];
00572
00573 SDTSRasterReader();
00574 ~SDTSRasterReader();
00575
00576 int Open( SDTS_CATD * poCATD, SDTS_IREF *,
00577 const char * pszModule );
00578 void Close();
00579
00580 int GetRasterType();
00581 #define SDTS_RT_INT16 1
00582 #define SDTS_RT_FLOAT32 6
00583
00584 int GetTransform( double * );
00585
00586 int GetMinMax( double * pdfMin, double * pdfMax,
00587 double dfNoData );
00588
00594 int GetXSize() { return nXSize; }
00600 int GetYSize() { return nYSize; }
00601
00603 int GetBlockXSize() { return nXBlockSize; }
00605 int GetBlockYSize() { return nYBlockSize; }
00606
00607 int GetBlock( int nXOffset, int nYOffset, void * pData );
00608 };
00609
00610
00611
00612
00613
00622 class SDTSTransfer
00623 {
00624 public:
00625 SDTSTransfer();
00626 ~SDTSTransfer();
00627
00628 int Open( const char * );
00629 void Close();
00630
00631 int FindLayer( const char * );
00632 int GetLayerCount() { return nLayers; }
00633 SDTSLayerType GetLayerType( int );
00634 int GetLayerCATDEntry( int );
00635
00636 SDTSLineReader *GetLayerLineReader( int );
00637 SDTSPointReader *GetLayerPointReader( int );
00638 SDTSPolygonReader *GetLayerPolygonReader( int );
00639 SDTSAttrReader *GetLayerAttrReader( int );
00640 SDTSRasterReader *GetLayerRasterReader( int );
00641 DDFModule *GetLayerModuleReader( int );
00642
00643 SDTSIndexedReader *GetLayerIndexedReader( int );
00644
00650 SDTS_CATD *GetCATD() { return &oCATD ; }
00651
00652 SDTS_IREF *GetIREF() { return &oIREF; }
00653
00659 SDTS_XREF *GetXREF() { return &oXREF; }
00660
00661 SDTSFeature *GetIndexedFeatureRef( SDTSModId *,
00662 SDTSLayerType *peType = NULL);
00663
00664 DDFField *GetAttr( SDTSModId * );
00665
00666 int GetBounds( double *pdfMinX, double *pdfMinY,
00667 double *pdfMaxX, double *pdfMaxY );
00668
00669 private:
00670
00671 SDTS_CATD oCATD;
00672 SDTS_IREF oIREF;
00673 SDTS_XREF oXREF;
00674
00675 int nLayers;
00676 int *panLayerCATDEntry;
00677 SDTSIndexedReader **papoLayerReader;
00678 };
00679
00680 #endif