| 311 | |
| 312 | |
| 313 | void CopcReader::initialize(PointTableRef table) |
| 314 | { |
| 315 | if (m_args->threads > 100) |
| 316 | log()->get(LogLevel::Warning) << "Using a large thread count: " << |
| 317 | m_args->threads << " threads" << std::endl; |
| 318 | // Make sure we allow at least as many chunks as we have threads. |
| 319 | m_args->keepAliveChunkCount = (std::max)(m_args->threads, (size_t)m_args->keepAliveChunkCount); |
| 320 | |
| 321 | m_p->connector.reset(new connector::Connector(m_filespec)); |
| 322 | |
| 323 | MetadataNode forward = table.privateMetadata("lasforward"); |
| 324 | MetadataNode m = getMetadata(); |
| 325 | |
| 326 | // alert consumers that we are a COPC file |
| 327 | m.add("copc", true); |
| 328 | |
| 329 | fetchHeader(); |
| 330 | |
| 331 | MetadataNode copc_metadata = m.add("copc_info"); |
| 332 | |
| 333 | copc_metadata.add("center_x", m_p->copc_info.center_x); |
| 334 | copc_metadata.add("center_y", m_p->copc_info.center_y); |
| 335 | copc_metadata.add("center_z", m_p->copc_info.center_z); |
| 336 | copc_metadata.add("halfsize", m_p->copc_info.halfsize); |
| 337 | copc_metadata.add("spacing", m_p->copc_info.spacing); |
| 338 | copc_metadata.add("root_hier_offset", m_p->copc_info.root_hier_offset); |
| 339 | copc_metadata.add("root_hier_size", m_p->copc_info.root_hier_size); |
| 340 | copc_metadata.add("gpstime_minimum", m_p->copc_info.gpstime_minimum); |
| 341 | copc_metadata.add("gpstime_maximum", m_p->copc_info.gpstime_maximum); |
| 342 | las::extractHeaderMetadata(m_p->header, forward, m); |
| 343 | |
| 344 | using namespace std::placeholders; |
| 345 | las::VlrCatalog catalog(std::bind(&CopcReader::fetch, this, _1, _2)); |
| 346 | catalog.load(las::Header::Size14, m_p->header.vlrCount, m_p->header.evlrOffset, |
| 347 | m_p->header.evlrCount); |
| 348 | las::Vlr ebVlr = fetchEbVlr(catalog); |
| 349 | |
| 350 | las::VlrList srsVlrs = fetchSrsVlrs(catalog); |
| 351 | las::Srs srs; |
| 352 | srs.init(srsVlrs, m_args->srsVlrOrder.types, true, log()); |
| 353 | setSpatialReference(srs.get()); |
| 354 | |
| 355 | if (m_args->doVlrs) |
| 356 | { |
| 357 | int i = 0; |
| 358 | // This simply avoids re-requesting the VLR data from a remote source for those |
| 359 | // VLRs where we already have data. |
| 360 | if (ebVlr.dataSize()) |
| 361 | las::addVlrMetadata(ebVlr, "vlr_" + std::to_string(i++), forward, m); |
| 362 | for (const las::Vlr& vlr : srsVlrs) |
| 363 | if (vlr.dataSize()) |
| 364 | las::addVlrMetadata(vlr, "vlr_" + std::to_string(i++), forward, m); |
| 365 | |
| 366 | las::VlrList ignored = las::parseIgnoreVlrs({}); |
| 367 | for (const las::VlrCatalog::Entry& e : catalog) |
| 368 | { |
| 369 | las::Vlr vlr(e.userId, e.recordId); |
| 370 | if (las::shouldIgnoreVlr(vlr, ignored) || vlr == ebVlr || Utils::contains(srsVlrs, vlr)) |
nothing calls this directly
no test coverage detected