Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: SDTS Translator 4 : * Purpose: Implementation of SDTSPointReader and SDTSRawPoint classes. 5 : * Author: Frank Warmerdam, warmerdam@pobox.com 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 1999, Frank Warmerdam 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "sdts_al.h" 14 : 15 : /************************************************************************/ 16 : /* ==================================================================== */ 17 : /* SDTSRawPoint */ 18 : /* */ 19 : /* This is a simple class for holding the data related with a */ 20 : /* point feature. */ 21 : /* ==================================================================== */ 22 : /************************************************************************/ 23 : 24 : /************************************************************************/ 25 : /* SDTSRawPoint() */ 26 : /************************************************************************/ 27 : 28 129 : SDTSRawPoint::SDTSRawPoint() : dfX(0.0), dfY(0.0), dfZ(0.0) 29 : { 30 129 : nAttributes = 0; 31 129 : } 32 : 33 : /************************************************************************/ 34 : /* ~STDSRawPoint() */ 35 : /************************************************************************/ 36 : 37 258 : SDTSRawPoint::~SDTSRawPoint() 38 : { 39 258 : } 40 : 41 : /************************************************************************/ 42 : /* Read() */ 43 : /* */ 44 : /* Read a record from the passed SDTSPointReader, and assign the */ 45 : /* values from that record to this point. This is the bulk of */ 46 : /* the work in this whole file. */ 47 : /************************************************************************/ 48 : 49 129 : int SDTSRawPoint::Read(SDTS_IREF *poIREF, DDFRecord *poRecord) 50 : 51 : { 52 : /* ==================================================================== */ 53 : /* Loop over fields in this record, looking for those we */ 54 : /* recognise, and need. */ 55 : /* ==================================================================== */ 56 551 : for (int iField = 0; iField < poRecord->GetFieldCount(); iField++) 57 : { 58 422 : DDFField *poField = poRecord->GetField(iField); 59 422 : if (poField == nullptr) 60 0 : return FALSE; 61 422 : DDFFieldDefn *poFieldDefn = poField->GetFieldDefn(); 62 422 : if (poFieldDefn == nullptr) 63 0 : return FALSE; 64 : 65 422 : const char *pszFieldName = poFieldDefn->GetName(); 66 : 67 422 : if (EQUAL(pszFieldName, "PNTS")) 68 129 : oModId.Set(poField); 69 : 70 293 : else if (EQUAL(pszFieldName, "ATID")) 71 0 : ApplyATID(poField); 72 : 73 293 : else if (EQUAL(pszFieldName, "ARID")) 74 : { 75 35 : oAreaId.Set(poField); 76 : } 77 258 : else if (EQUAL(pszFieldName, "SADR")) 78 : { 79 129 : poIREF->GetSADR(poField, 1, &dfX, &dfY, &dfZ); 80 : } 81 : } 82 : 83 129 : return TRUE; 84 : } 85 : 86 : /************************************************************************/ 87 : /* Dump() */ 88 : /************************************************************************/ 89 : 90 0 : void SDTSRawPoint::Dump(FILE *fp) 91 : 92 : { 93 0 : fprintf(fp, "SDTSRawPoint %s: ", oModId.GetName()); 94 : 95 0 : if (oAreaId.nRecord != -1) 96 0 : fprintf(fp, " AreaId=%s", oAreaId.GetName()); 97 : 98 0 : for (int i = 0; i < nAttributes; i++) 99 0 : fprintf(fp, " ATID[%d]=%s", i, paoATID[i].GetName()); 100 : 101 0 : fprintf(fp, " Vertex = (%.2f,%.2f,%.2f)\n", dfX, dfY, dfZ); 102 0 : } 103 : 104 : /************************************************************************/ 105 : /* ==================================================================== */ 106 : /* SDTSPointReader */ 107 : /* */ 108 : /* This is the class used to read a point module. */ 109 : /* ==================================================================== */ 110 : /************************************************************************/ 111 : 112 : /************************************************************************/ 113 : /* SDTSPointReader() */ 114 : /************************************************************************/ 115 : 116 3 : SDTSPointReader::SDTSPointReader(SDTS_IREF *poIREFIn) : poIREF(poIREFIn) 117 : { 118 3 : } 119 : 120 : /************************************************************************/ 121 : /* ~SDTSLineReader() */ 122 : /************************************************************************/ 123 : 124 6 : SDTSPointReader::~SDTSPointReader() 125 : { 126 6 : } 127 : 128 : /************************************************************************/ 129 : /* Close() */ 130 : /************************************************************************/ 131 : 132 0 : void SDTSPointReader::Close() 133 : 134 : { 135 0 : oDDFModule.Close(); 136 0 : } 137 : 138 : /************************************************************************/ 139 : /* Open() */ 140 : /* */ 141 : /* Open the requested line file, and prepare to start reading */ 142 : /* data records. */ 143 : /************************************************************************/ 144 : 145 3 : int SDTSPointReader::Open(const char *pszFilename) 146 : 147 : { 148 3 : return oDDFModule.Open(pszFilename); 149 : } 150 : 151 : /************************************************************************/ 152 : /* GetNextPoint() */ 153 : /* */ 154 : /* Fetch the next feature as an STDSRawPoint. */ 155 : /************************************************************************/ 156 : 157 132 : SDTSRawPoint *SDTSPointReader::GetNextPoint() 158 : 159 : { 160 : /* -------------------------------------------------------------------- */ 161 : /* Read a record. */ 162 : /* -------------------------------------------------------------------- */ 163 132 : if (oDDFModule.GetFP() == nullptr) 164 0 : return nullptr; 165 : 166 132 : DDFRecord *poRecord = oDDFModule.ReadRecord(); 167 : 168 132 : if (poRecord == nullptr) 169 3 : return nullptr; 170 : 171 : /* -------------------------------------------------------------------- */ 172 : /* Transform into a point feature. */ 173 : /* -------------------------------------------------------------------- */ 174 129 : SDTSRawPoint *poRawPoint = new SDTSRawPoint(); 175 : 176 129 : if (poRawPoint->Read(poIREF, poRecord)) 177 : { 178 129 : return poRawPoint; 179 : } 180 : 181 0 : delete poRawPoint; 182 0 : return nullptr; 183 : }