// Build the list of dimensions for the output schema. // Placing this here allows validation of dimensions before execution begins. void DbWriter::prepared(PointTableRef table) { using namespace Dimension; PointLayoutPtr layout = table.layout(); if (m_outputDims.empty()) { for (auto& dimType : layout->dimTypes()) m_dbDims.push_back(XMLDim(dimType, layout->dimName(dimType.m_id))); return; } DimTypeList dims; for (std::string& s : m_outputDims) { DimType dt = layout->findDimType(s); if (dt.m_id == Id::Unknown) { std::ostringstream oss; oss << "Invalid dimension '" << s << "' specified for " "'output_dims' option."; throw pdal_error(oss.str()); } m_dbDims.push_back(XMLDim(dt, layout->dimName(dt.m_id))); } }
int DeltaKernel::execute() { PointTable srcTable; PointTable candTable; DimIndexMap dims; PointViewPtr srcView = loadSet(m_sourceFile, srcTable); PointViewPtr candView = loadSet(m_candidateFile, candTable); PointLayoutPtr srcLayout = srcTable.layout(); PointLayoutPtr candLayout = candTable.layout(); Dimension::IdList ids = srcLayout->dims(); for (Dimension::Id dim : ids) { std::string name = srcLayout->dimName(dim); if (!m_allDims) if (name != "X" && name != "Y" && name != "Z") continue; DimIndex d; d.m_name = name; d.m_srcId = dim; dims[name] = d; } ids = candLayout->dims(); for (Dimension::Id dim : ids) { std::string name = candLayout->dimName(dim); auto di = dims.find(name); if (di == dims.end()) continue; DimIndex& d = di->second; d.m_candId = dim; } // Remove dimensions that aren't in both the source and candidate lists. for (auto di = dims.begin(); di != dims.end();) { DimIndex& d = di->second; if (d.m_candId == Dimension::Id::Unknown) dims.erase(di++); else ++di; } // Index the candidate data. KD3Index index(*candView); index.build(); MetadataNode root; if (m_detail) root = dumpDetail(srcView, candView, index, dims); else root = dump(srcView, candView, index, dims); Utils::toJSON(root, std::cout); return 0; }
void TextWriter::writeCSVHeader(PointTableRef table) { const PointLayoutPtr layout(table.layout()); for (auto di = m_dims.begin(); di != m_dims.end(); ++di) { if (di != m_dims.begin()) *m_stream << m_delimiter; if (m_quoteHeader) *m_stream << "\"" << layout->dimName(*di) << "\""; else *m_stream << layout->dimName(*di); } *m_stream << m_newline; }
void LasWriter::prepared(PointTableRef table) { FlexWriter::validateFilename(table); PointLayoutPtr layout = table.layout(); // If we've asked for all dimensions, add to extraDims all dimensions // in the layout that aren't already destined for LAS output. if (m_extraDims.size() == 1 && m_extraDims[0].m_name == "all") { m_extraDims.clear(); Dimension::IdList ids = m_lasHeader.usedDims(); DimTypeList dimTypes = layout->dimTypes(); for (auto& dt : dimTypes) { if (!Utils::contains(ids, dt.m_id)) m_extraDims.push_back( ExtraDim(layout->dimName(dt.m_id), dt.m_type)); } } m_extraByteLen = 0; for (auto& dim : m_extraDims) { dim.m_dimType.m_id = table.layout()->findDim(dim.m_name); if (dim.m_dimType.m_id == Dimension::Id::Unknown) { std::ostringstream oss; oss << "Dimension '" << dim.m_name << "' specified in " "'extra_dim' option not found."; throw pdal_error(oss.str()); } m_extraByteLen += Dimension::size(dim.m_dimType.m_type); } }
XMLSchema::XMLSchema(const PointLayoutPtr& layout, MetadataNode m, Orientation orientation) : m_orientation(orientation), m_metadata(m) { DimTypeList dimTypes = layout->dimTypes(); for (DimType& d : dimTypes) m_dims.push_back(XMLDim(d, layout->dimName(d.m_id))); }
inline MetadataNode toMetadata(PointTableRef table) { const PointLayoutPtr layout(table.layout()); MetadataNode root; for (const auto& id : layout->dims()) { MetadataNode dim("dimensions"); dim.add("name", layout->dimName(id)); Dimension::Type::Enum t = layout->dimType(id); dim.add("type", Dimension::toName(Dimension::base(t))); dim.add("size", layout->dimSize(id)); root.addList(dim); } return root; }
void BpfWriter::loadBpfDimensions(PointLayoutPtr layout) { // Verify that we have X, Y and Z and that they're the first three // dimensions. Dimension::IdList dims = layout->dims(); std::sort(dims.begin(), dims.end()); if (dims.size() < 3 || dims[0] != Dimension::Id::X || dims[1] != Dimension::Id::Y || dims[2] != Dimension::Id::Z) { throw pdal_error("Missing one of dimensions X, Y or Z. " "Can't write BPF."); } for (auto id : dims) { BpfDimension dim; dim.m_id = id; dim.m_label = layout->dimName(id); m_dims.push_back(dim); } }
void BpfWriter::loadBpfDimensions(PointLayoutPtr layout) { Dimension::IdList dims; if (m_outputDims.size()) { for (std::string& s : m_outputDims) { Dimension::Id::Enum id = layout->findDim(s); if (id == Dimension::Id::Unknown) { std::ostringstream oss; oss << "Invalid dimension '" << s << "' specified for " "'output_dims' option."; throw pdal_error(oss.str()); } dims.push_back(id); } } else dims = layout->dims(); // Verify that we have X, Y and Z and that they're the first three // dimensions. std::sort(dims.begin(), dims.end()); if (dims.size() < 3 || dims[0] != Dimension::Id::X || dims[1] != Dimension::Id::Y || dims[2] != Dimension::Id::Z) { throw pdal_error("Missing one of dimensions X, Y or Z. " "Can't write BPF."); } for (auto id : dims) { BpfDimension dim; dim.m_id = id; dim.m_label = layout->dimName(id); m_dims.push_back(dim); } }
void LasWriter::prepared(PointTableRef table) { FlexWriter::validateFilename(table); PointLayoutPtr layout = table.layout(); // Make sure the dataformatID is set so that we can get the proper // dimensions being written as part of the standard LAS record. fillHeader(); // If we've asked for all dimensions, add to extraDims all dimensions // in the layout that aren't already destined for LAS output. if (m_extraDims.size() == 1 && m_extraDims[0].m_name == "all") { m_extraDims.clear(); Dimension::IdList ids = m_lasHeader.usedDims(); DimTypeList dimTypes = layout->dimTypes(); for (auto& dt : dimTypes) { if (!Utils::contains(ids, dt.m_id)) m_extraDims.push_back( ExtraDim(layout->dimName(dt.m_id), dt.m_type)); } } m_extraByteLen = 0; for (auto& dim : m_extraDims) { dim.m_dimType.m_id = table.layout()->findDim(dim.m_name); if (dim.m_dimType.m_id == Dimension::Id::Unknown) throwError("Dimension '" + dim.m_name + "' specified in " "'extra_dim' option not found."); m_extraByteLen += Dimension::size(dim.m_dimType.m_type); log()->get(LogLevel::Info) << getName() << ": Writing dimension " << dim.m_name << "(" << Dimension::interpretationName(dim.m_dimType.m_type) << ") " << " to LAS extra bytes." << std::endl; } }