| 153 | |
| 154 | |
| 155 | point_count_t OptechReader::read(PointViewPtr data, |
| 156 | point_count_t countRequested) |
| 157 | { |
| 158 | point_count_t numRead = 0; |
| 159 | point_count_t dataIndex = data->size(); |
| 160 | |
| 161 | while (numRead < countRequested) |
| 162 | { |
| 163 | if (m_returnIndex == 0) |
| 164 | { |
| 165 | if (!m_extractor.good()) |
| 166 | { |
| 167 | if (m_recordIndex >= m_header.numRecords) |
| 168 | { |
| 169 | break; |
| 170 | } |
| 171 | m_recordIndex += fillBuffer(); |
| 172 | } |
| 173 | |
| 174 | m_extractor >> m_pulse.gpsTime >> m_pulse.returnCount >> |
| 175 | m_pulse.range[0] >> m_pulse.range[1] >> m_pulse.range[2] >> |
| 176 | m_pulse.range[3] >> m_pulse.intensity[0] >> |
| 177 | m_pulse.intensity[1] >> m_pulse.intensity[2] >> |
| 178 | m_pulse.intensity[3] >> m_pulse.scanAngle >> m_pulse.roll >> |
| 179 | m_pulse.pitch >> m_pulse.heading >> m_pulse.latitude >> |
| 180 | m_pulse.longitude >> m_pulse.elevation; |
| 181 | |
| 182 | if (m_pulse.returnCount == 0) |
| 183 | { |
| 184 | m_returnIndex = 0; |
| 185 | continue; |
| 186 | } |
| 187 | |
| 188 | // In all the csd files that we've tested, the longitude |
| 189 | // values have been less than -2pi. |
| 190 | if (m_pulse.longitude < -M_PI * 2) |
| 191 | { |
| 192 | m_pulse.longitude = m_pulse.longitude + M_PI * 2; |
| 193 | } |
| 194 | else if (m_pulse.longitude > M_PI * 2) |
| 195 | { |
| 196 | m_pulse.longitude = m_pulse.longitude - M_PI * 2; |
| 197 | } |
| 198 | } |
| 199 | |
| 200 | georeference::Xyz gpsPoint = georeference::Xyz( |
| 201 | m_pulse.longitude, m_pulse.latitude, m_pulse.elevation); |
| 202 | georeference::RotationMatrix rotationMatrix = |
| 203 | createOptechRotationMatrix(m_pulse.roll, m_pulse.pitch, |
| 204 | m_pulse.heading); |
| 205 | georeference::Xyz point = pdal::georeference::georeferenceWgs84( |
| 206 | m_pulse.range[m_returnIndex], m_pulse.scanAngle, |
| 207 | m_boresightMatrix, rotationMatrix, gpsPoint); |
| 208 | |
| 209 | data->setField(Dimension::Id::X, dataIndex, point.X * 180 / M_PI); |
| 210 | data->setField(Dimension::Id::Y, dataIndex, point.Y * 180 / M_PI); |
| 211 | data->setField(Dimension::Id::Z, dataIndex, point.Z); |
| 212 | data->setField(Dimension::Id::GpsTime, dataIndex, m_pulse.gpsTime); |
nothing calls this directly
no test coverage detected