inline ptree toPTree(MetadataNode const& node) { typedef ptree::path_type path; ptree tree; tree.put("name", node.name()); tree.put("description", node.description()); tree.put("type", node.type()); tree.put("value", node.value()); MetadataNodeList children = node.children(); for (auto n = children.begin(); n != children.end(); ++n) { ptree pnode = toPTree(*n); if (node.kind() == MetadataType::Array) { boost::optional<ptree&> opt = tree.get_child_optional(path(node.name(), '/')); if (opt) opt->push_back(std::make_pair("", pnode)); else { tree.push_back(ptree::value_type(node.name(), ptree())); auto& p = tree.get_child(path(node.name(), '/')); p.push_back(std::make_pair("", pnode)); } } else if (node.name().size()) tree.push_back(std::make_pair(node.name(), pnode)); } return tree; }
TEST(Stats, metadata) { BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0); Options ops; ops.add("bounds", bounds); ops.add("count", 1000); ops.add("mode", "constant"); StageFactory f; std::unique_ptr<Stage> reader(f.createStage("readers.faux")); EXPECT_TRUE(reader.get()); reader->setOptions(ops); Options filterOps; filterOps.add("dimensions", " , X, Z "); StatsFilter filter; filter.setInput(*reader); filter.setOptions(filterOps); PointTable table; filter.prepare(table); filter.execute(table); MetadataNode m = filter.getMetadata(); std::vector<MetadataNode> children = m.children("statistic"); auto findNode = [](MetadataNode m, const std::string name, const std::string val) { auto findNameVal = [name, val](MetadataNode m) { return (m.name() == name && m.value() == val); }; return m.find(findNameVal); }; for (auto mi = children.begin(); mi != children.end(); ++mi) { if (findNode(*mi, "name", "X").valid()) { EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 1.0); EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 1.0); EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 1.0); EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0); } if (findNode(*mi, "name", "Z").valid()) { EXPECT_DOUBLE_EQ(mi->findChild("average").value<double>(), 3.0); EXPECT_DOUBLE_EQ(mi->findChild("minimum").value<double>(), 3.0); EXPECT_DOUBLE_EQ(mi->findChild("maximum").value<double>(), 3.0); EXPECT_DOUBLE_EQ(mi->findChild("count").value<double>(), 1000.0); } } }
void toJSON(const MetadataNode& m, std::ostream& o) { if (m.name().empty()) pdal::subnodesToJSON(m, o, 0); else if (m.kind() == MetadataType::Array) pdal::arrayToJSON(m.children(), o, 0); else { o << "{" << std::endl; pdal::toJSON(m, o, 1); o << std::endl; o << "}"; } o << std::endl; }
void Stage::setSpatialReference(MetadataNode& m, const SpatialReference& spatialRef) { m_spatialReference = spatialRef; auto pred = [](MetadataNode m){ return m.name() == "spatialreference"; }; MetadataNode spatialNode = m.findChild(pred); if (spatialNode.empty()) { m.add(spatialRef.toMetadata()); m.add("spatialreference", spatialRef.getWKT(), "SRS of this stage"); m.add("comp_spatialreference", spatialRef.getWKT(), "SRS of this stage"); } }
void Stage::setSpatialReference(MetadataNode& m, const SpatialReference& spatialRef) { m_spatialReference = spatialRef; auto pred = [](MetadataNode m){ return m.name() == "spatialreference"; }; MetadataNode spatialNode = m.findChild(pred); if (spatialNode.empty()) { m.add(Utils::toMetadata(spatialRef)); m.add("spatialreference", spatialRef.getWKT(SpatialReference::eHorizontalOnly, false), "SRS of this stage"); m.add("comp_spatialreference", spatialRef.getWKT(SpatialReference::eCompoundOK, false), "SRS of this stage"); } }
TEST(NitfReaderTest, test_one) { StageFactory f; Options nitf_opts; nitf_opts.add("filename", Support::datapath("nitf/autzen-utm10.ntf")); nitf_opts.add("count", 750); PointTable table; Stage* nitf_reader(f.createStage("readers.nitf")); EXPECT_TRUE(nitf_reader); nitf_reader->setOptions(nitf_opts); nitf_reader->prepare(table); PointViewSet pbSet = nitf_reader->execute(table); EXPECT_EQ(pbSet.size(), 1u); PointViewPtr view = *pbSet.begin(); // check metadata MetadataNode m = nitf_reader->getMetadata(); MetadataNode n = m.findChild( [](MetadataNode& m) { return m.name() == "IM:0.IGEOLO"; } ); EXPECT_EQ(n.value(), "440344N1230429W440344N1230346W440300N1230346W440300N1230429W"); n = m.findChild("FH.FDT"); EXPECT_EQ(n.value(), "20120323002946"); // // read LAS // Options las_opts; las_opts.add("count", 750); las_opts.add("filename", Support::datapath("nitf/autzen-utm10.las")); PointTable table2; Stage* las_reader(f.createStage("readers.las")); EXPECT_TRUE(las_reader); las_reader->setOptions(las_opts); las_reader->prepare(table2); PointViewSet pbSet2 = las_reader->execute(table2); EXPECT_EQ(pbSet2.size(), 1u); PointViewPtr view2 = *pbSet.begin(); // // // compare the two views // EXPECT_EQ(view->size(), view2->size()); for (PointId i = 0; i < view2->size(); i++) { int32_t nitf_x = view->getFieldAs<int32_t>(Dimension::Id::X, i); int32_t nitf_y = view->getFieldAs<int32_t>(Dimension::Id::Y, i); int32_t nitf_z = view->getFieldAs<int32_t>(Dimension::Id::Z, i); int32_t las_x = view2->getFieldAs<int32_t>(Dimension::Id::X, i); int32_t las_y = view2->getFieldAs<int32_t>(Dimension::Id::Y, i); int32_t las_z = view2->getFieldAs<int32_t>(Dimension::Id::Z, i); EXPECT_EQ(nitf_x, las_x); EXPECT_EQ(nitf_y, las_y); EXPECT_EQ(nitf_z, las_z); } }