SDTS_AL
|
00001 /****************************************************************************** 00002 * $Id: sdts_al.h 19952 2010-07-02 05:44:18Z 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 */