Beispiel #1
0
void LOFFilter::addDimensions(PointLayoutPtr layout)
{
    using namespace Dimension;
    m_kdist = layout->registerOrAssignDim("KDistance", Type::Double);
    m_lrd = layout->registerOrAssignDim("LocalReachabilityDistance", Type::Double);
    m_lof = layout->registerOrAssignDim("LocalOutlierFactor", Type::Double);
}
Beispiel #2
0
// Try to map dimension names to existing PDAL dimension names by
// checking them with certain characters removed.
Dimension::Id NumpyReader::registerDim(PointLayoutPtr layout,
    const std::string& name, Dimension::Type pdalType)
{
    Dimension::Id id;

    auto registerName = [&layout, &pdalType, &id](std::string name, char elim)
    {
        if (elim != '\0')
            Utils::remove(name, elim);
        Dimension::Id tempId = Dimension::id(name);
        if (tempId != Dimension::Id::Unknown)
        {
            id = tempId;
            layout->registerDim(id, pdalType);
            return true;
        }
        return false;
    };

    // Try registering the name in various ways.  If that doesn't work,
    // just punt and use the name as is.
    if (!registerName(name, '\0') && !registerName(name, '-') &&
        !registerName(name, ' ') && !registerName(name, '_'))
        id = layout->registerOrAssignDim(name, pdalType);
    return id;
}
Beispiel #3
0
void FerryFilter::addDimensions(PointLayoutPtr layout)
{
    for (const auto& dim_par : m_name_map)
    {
        layout->registerOrAssignDim(dim_par.second, Dimension::Type::Double);
    }
}
void MrsidReader::addDimensions(PointLayoutPtr layout)
{
    using namespace Dimension;

    if (!m_PS)
        throw pdal_error("MrSID object not initialized!");
    const LizardTech::PointInfo& pointinfo = m_PS->getPointInfo();

    // add a map for PDAL names that aren't the same as LT ones (GPSTime vs Time)
    std::map<std::string, std::string> dimensionTranslations;
    dimensionTranslations.insert(std::pair<std::string, std::string>("Time", "GPSTime"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("NumReturns", "NumberOfReturns"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("ReturnNum", "ReturnNumber"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("ScanDir", "ScanDirectionFlag"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("EdgeFlightLine", "EdgeOfFlightLine"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("ScanAngle", "ScanAngleRank"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("ClassId", "Classification"));
    dimensionTranslations.insert(std::pair<std::string, std::string>("SourceId", "PointSourceId"));

    for (unsigned int i=0; i<pointinfo.getNumChannels(); i++)
    {
        const LizardTech::ChannelInfo &channel = pointinfo.getChannel(i);
        const char* name = channel.getName();
        auto translated = dimensionTranslations.find(name);
        if (translated != dimensionTranslations.end())
            name = translated->second.c_str();

        LizardTech::DataType t = channel.getDataType();
        Dimension::Type::Enum pdal_type = getPDALType(t);
        layout->registerOrAssignDim(name, pdal_type);
    }
    m_layout = layout;

}
void TextReader::addDimensions(PointLayoutPtr layout)
{
    for (auto name : m_dimNames)
    {
        Dimension::Id::Enum id = layout->registerOrAssignDim(name,
            Dimension::Type::Double);
        m_dims.push_back(id);
    }
}
Beispiel #6
0
void TileDBReader::addDimensions(PointLayoutPtr layout)
{
    // Dimensions are X/Y and maybe Z
    std::vector<tiledb::Dimension> dims =
        m_array->schema().domain().dimensions();

    Dimension::Id id;
    for (size_t i = 0; i < dims.size(); ++i)
    {
        tiledb::Dimension& dim = dims[i];

        DimInfo di;

        di.m_name = dim.name();
        di.m_offset = i;
        di.m_span = dims.size();
        di.m_dimCategory = DimCategory::Dimension;
        di.m_tileType = dim.type();
        di.m_type = getPdalType(di.m_tileType);
        di.m_id = layout->registerOrAssignDim(dim.name(), di.m_type);

        m_dims.push_back(di);
    }

    auto attrs = m_array->schema().attributes();
    for (const auto& a : attrs)
    {
        DimInfo di;

        di.m_name = a.first;
        di.m_offset = 0;
        di.m_span = 1;
        di.m_dimCategory = DimCategory::Attribute;
        di.m_tileType = a.second.type();
        di.m_type = getPdalType(di.m_tileType);
        di.m_id = layout->registerOrAssignDim(a.first, di.m_type);

        m_dims.push_back(di);
    }

    //ABELL
    // Should we check that X Y and Z exist and remap the primary/secondary
    // dimensions to X Y and Z if necessary?
}
Beispiel #7
0
void GDALReader::addDimensions(PointLayoutPtr layout)
{
    layout->registerDim(pdal::Dimension::Id::X);
    layout->registerDim(pdal::Dimension::Id::Y);
    for (int i = 0; i < m_raster->m_band_count; ++i)
    {
        std::ostringstream oss;
        oss << "band-" << (i + 1);
        layout->registerOrAssignDim(oss.str(), Dimension::Type::Double);
    }
}
Beispiel #8
0
void TextReader::addDimensions(PointLayoutPtr layout)
{
    m_dims.clear();
    for (auto name : m_dimNames)
    {
        Utils::trim(name);
        Dimension::Id id = layout->registerOrAssignDim(name,
            Dimension::Type::Double);
        if (Utils::contains(m_dims, id) && id != pdal::Dimension::Id::Unknown)
            throwError("Duplicate dimension '" + name +
                "' detected in input file '" + m_filename + "'.");
        m_dims.push_back(id);
    }
}
Beispiel #9
0
void BpfReader::addDimensions(PointLayoutPtr layout)
{
    for (size_t i = 0; i < m_dims.size(); ++i)
    {
        Dimension::Type::Enum type = Dimension::Type::Float;

        BpfDimension& dim = m_dims[i];
        if (dim.m_label == "X" ||
            dim.m_label == "Y" ||
            dim.m_label == "Z")
            type = Dimension::Type::Double;
        dim.m_id = layout->registerOrAssignDim(dim.m_label, type);
    }
}
Beispiel #10
0
void FerryFilter::addDimensions(PointLayoutPtr layout)
{
    for (auto& info : m_dims)
    {
        const Dimension::Id fromId = layout->findDim(info.m_fromName);
        // Dimensions being created with the "=>Dim" syntax won't
        // be in the layout, so we have to assign a default type.
        Dimension::Type fromType = layout->dimType(fromId);
        if (fromType == Dimension::Type::None)
            fromType = Dimension::Type::Double;

        info.m_toId = layout->registerOrAssignDim(info.m_toName, fromType);
    }
}
void DbReader::loadSchema(PointLayoutPtr layout, const XMLSchema& schema)
{
    m_layout = layout;
    m_dims = schema.xmlDims();

    // Override XYZ to doubles and use those going forward
    // we will apply any scaling set before handing it off
    // to PDAL.
    layout->registerDim(Dimension::Id::X);
    layout->registerDim(Dimension::Id::Y);
    layout->registerDim(Dimension::Id::Z);

    m_orientation = schema.orientation();
    m_packedPointSize = 0;
    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
    {
        di->m_dimType.m_id =
            layout->registerOrAssignDim(di->m_name, di->m_dimType.m_type);
        m_packedPointSize += Dimension::size(di->m_dimType.m_type);
    }
}
void ProgrammableFilter::addDimensions(PointLayoutPtr layout)
{
    for (const std::string& s : m_addDimensions)
        layout->registerOrAssignDim(s, pdal::Dimension::Type::Double);
}
Beispiel #13
0
void FerryFilter::addDimensions(PointLayoutPtr layout)
{
    for (auto& info : m_dims)
        info.m_toId = layout->registerOrAssignDim(info.m_toName,
            Dimension::Type::Double);
}
Beispiel #14
0
void MyFilter::addDimensions(PointLayoutPtr layout)
{
    layout->registerDim(Dimension::Id::Intensity);
    m_myDimension = layout->registerOrAssignDim("MyDimension",
            Dimension::Type::Unsigned8);
}
Beispiel #15
0
void GreyhoundReader::addDimensions(PointLayoutPtr layout)
{
    std::map<std::string, const Json::Value*> remote;
    for (const auto& d : m_info["schema"])
        remote[d["name"].asString()] = &d;

    // The dimensions we will query are determined in the following order, the
    // first of which is present taking precedence:
    //  - The `dims` PDAL option on this stage.
    //  - A `schema` query parameter parsed from the `url` option.
    //  - Finally, fall back to the full `info.schema`.
    if (m_args.dims.isNull())
    {
        // If no dimensions are explicitly listed, only include the indexed
        // schema - omitting any appended dimensions.  Those must be explicitly
        // specified if desired.
        Json::Value nativeSchema;
        for (const Json::Value d : m_info["schema"])
            if (!d["addon"].asBool())
                nativeSchema.append(d);

        const Json::Value& readSchema = m_params["schema"].isNull() ?
            nativeSchema : m_params["schema"];

        for (const auto& d : readSchema)
        {
            m_args.dims.append(d["name"].asString());
        }
    }

    auto isXyz([](const std::string& name)
    {
        return name == "X" || name == "Y" || name == "Z";
    });

    // Build the request layout from the specified `dims`.
    for (const auto& n : m_args.dims)
    {
        const auto name(n.asString());

        if (!remote.count(name))
            throw pdal_error(name + " does not exist in the remote schema");

        const auto& d(*remote.at(name));

        const int baseType(
                Utils::toNative(Dimension::fromName(d["type"].asString())));

        const int size(d["size"].asInt());

        const Dimension::Type type(
                isXyz(name) ?
                    Dimension::Type::Double :
                    static_cast<Dimension::Type>(baseType | size));

        layout->registerOrAssignDim(name, type);
        m_readLayout.registerOrAssignDim(name, type);
    }

    if (!m_params.obounds().isNull())
    {
        layout->registerDim(Dimension::Id::Omit);
    }

    // We'll keep track of the point ordering here in case any intermediate
    // filters reorder them.  We need to write them with a 1:1 mapping to the
    // original query.
    layout->registerDim(Dimension::Id::PointId);

    m_params["schema"] = layoutToSchema(m_readLayout);

    log()->get(LogLevel::Debug) << "Schema: " << m_params["schema"] <<
        std::endl;
}
Beispiel #16
0
void EstimateRankFilter::addDimensions(PointLayoutPtr layout)
{
    m_rank = layout->registerOrAssignDim("Rank", Dimension::Type::Unsigned8);
}
Beispiel #17
0
void KDistanceFilter::addDimensions(PointLayoutPtr layout)
{
    using namespace Dimension;
    m_kdist = layout->registerOrAssignDim("KDistance", Type::Double);
}
Beispiel #18
0
void ColorizationFilter::addDimensions(PointLayoutPtr layout)
{
    for (auto& band : m_bands)
        band.m_dim = layout->registerOrAssignDim(band.m_name,
            Dimension::defaultType(Dimension::Id::Red));
}