コード例 #1
0
void RialtoTest::populateDatabase(pdal::PointTable& table,
                                pdal::PointViewPtr view,
                                const std::string& filename,
                                uint32_t maxLevel,
                                const std::string& tableName)
{
    assert(FileUtils::fileExists(filename));

    {
        time_t now;
        time(&now);
        char buf[sizeof("yyyy-mm-ddThh:mm:ss.sssZ")+1];
        // TODO: this produces "ss", not "ss.sss" as the gpkg spec implies is required
        strftime(buf, sizeof(buf), "%FT%TZ", gmtime(&now));
        const std::string timestamp(buf);

        pdal::Options readerOptions;
        pdal::BufferReader reader;
        reader.setOptions(readerOptions);
        reader.addView(view);
        reader.setSpatialReference(SpatialReference("EPSG:4326"));

        pdal::StageFactory f;
        pdal::Options writerOptions;
        writerOptions.add("filename", filename);
        writerOptions.add("name", tableName);
        writerOptions.add("numColsAtL0", 2);
        writerOptions.add("numRowsAtL0", 1);
        writerOptions.add("timestamp", timestamp);
        writerOptions.add("description", "");
        writerOptions.add("maxLevel", maxLevel);
        writerOptions.add("tms_minx", -180.0);
        writerOptions.add("tms_miny", -90.0);
        writerOptions.add("tms_maxx", 180.0);
        writerOptions.add("tms_maxy", 90.0);

        //writerOptions.add("overwrite", true);
        //writerOptions.add("verbose", LogLevel::Debug);
        pdal::Stage* writer = new RialtoWriter();
        writer->setOptions(writerOptions);
        writer->setInput(reader);

        // execution: write to database
        writer->prepare(table);
        PointViewSet outputViews = writer->execute(table);
        delete writer;
    }

    assert(FileUtils::fileExists(filename));
}
コード例 #2
0
ファイル: PgReader.cpp プロジェクト: rskelly/PDAL
void PgReader::processOptions(const Options& options)
{
    // If we don't know the table name, we're SOL
    m_table_name = options.getValueOrThrow<std::string>("table");

    // Connection string needs to exist and actually work
    m_connection = options.getValueOrThrow<std::string>("connection");

    // Schema and column name can be defaulted safely
    m_column_name = options.getValueOrDefault<std::string>("column", "pa");
    m_schema_name = options.getValueOrDefault<std::string>("schema", "");

    // Read other preferences
    m_where = options.getValueOrDefault<std::string>("where", "");

    // Spatial reference.
    setSpatialReference(options.getValueOrDefault<SpatialReference>(
        "spatialreference", SpatialReference()));
}
コード例 #3
0
ファイル: PointTable.hpp プロジェクト: EricAlex/PDAL
 SpatialReference anySpatialReference() const
 {
     return m_spatialRefs.size() ?
         *m_spatialRefs.begin() : SpatialReference();
 }
コード例 #4
0
ファイル: TIndexReader.cpp プロジェクト: Rafaelaniemann/PDAL
void TIndexReader::initialize()
{
    if (!m_bounds.empty())
        m_wkt = m_bounds.toWKT();
    m_out_ref.reset(new gdal::SpatialRef());

    log()->get(LogLevel::Debug) << "Opening file " << m_filename <<
        std::endl;

    gdal::registerDrivers();
    m_dataset = OGROpen(m_filename.c_str(), FALSE, NULL);
    if (!m_dataset)
    {
        std::stringstream oss;
        oss << "unable to datasource '" << m_filename << "'";
        throw pdal::pdal_error(oss.str());
    }

    OGRGeometryH geometry(0);
    if (m_sql.size())
    {
        m_layer = OGR_DS_ExecuteSQL(m_dataset, m_sql.c_str(), geometry,
            m_dialect.c_str());
    }
    else
    {
        m_layer = OGR_DS_GetLayerByName(m_dataset, m_layerName.c_str());
    }
    if (!m_layer)
    {
        std::stringstream oss;
        oss << getName() << ": Unable to open layer '" << m_layerName <<
            "' from OGR datasource '" << m_filename << "'";
        throw pdal::pdal_error(oss.str());
    }

    m_out_ref->setFromLayer(m_layer);

    // Override the SRS if the user set one, otherwise, take it
    // from the layer
    if (m_tgtSrsString.size())
        m_out_ref.reset(new gdal::SpatialRef(m_tgtSrsString));
    else
        m_out_ref.reset(new gdal::SpatialRef(m_out_ref->wkt()));

    setSpatialReference(SpatialReference(m_out_ref->wkt()));

    std::unique_ptr<gdal::Geometry> wkt_g;

    // If the user set either explicit 'polygon' or 'boundary' options
    // we will filter by that geometry. The user can set a 'filter_srs'
    // option to override the SRS of the input geometry and we will
    // reproject to the output projection as needed.
    if (m_wkt.size())
    {
        // Reproject the given wkt to the output SRS so
        // filtering/cropping works
        gdal::SpatialRef assign(m_filterSRS);
        gdal::Geometry before(m_wkt, assign);
        before.transform(*m_out_ref);

        wkt_g.reset (new gdal::Geometry(before.wkt(), *m_out_ref));

        geometry = wkt_g->get();
        m_wkt = wkt_g->wkt();
        OGR_L_SetSpatialFilter(m_layer, geometry);
    }

    if (m_attributeFilter.size())
    {
        OGRErr err = OGR_L_SetAttributeFilter(m_layer,
            m_attributeFilter.c_str());
        if (err != OGRERR_NONE)
        {
            std::stringstream oss;
            oss << getName() << ": Unable to set attribute filter '"
                << m_attributeFilter << "' for OGR datasource '"
                << m_filename << "'";
            throw pdal::pdal_error(oss.str());
        }
    }

    Options cropOptions;
    if (m_wkt.size())
        cropOptions.add("polygon", m_wkt);

    for (auto f : getFiles())
    {
        log()->get(LogLevel::Debug) << "Adding file "
                                    << f.m_filename
                                    << " to merge filter" <<std::endl;

        std::string driver = m_factory.inferReaderDriver(f.m_filename);
        Stage *reader = m_factory.createStage(driver);
        if (!reader)
        {
            std::stringstream out;
            out << "Unable to create reader for file '"
                << f.m_filename << "'.";
            throw pdal_error(out.str());
        }
        Options readerOptions;
        readerOptions.add("filename", f.m_filename);
        reader->setOptions(readerOptions);
        Stage *premerge = reader;

        if (m_tgtSrsString != f.m_srs &&
            (m_tgtSrsString.size() && f.m_srs.size()))
        {
            Stage *repro = m_factory.createStage("filters.reprojection");
            repro->setInput(*reader);
            Options reproOptions;
            reproOptions.add("out_srs", m_tgtSrsString);
            reproOptions.add("in_srs", f.m_srs);
            log()->get(LogLevel::Debug2) << "Repro = "
                                         << m_tgtSrsString << "/"
                                         << f.m_srs << "!\n";
            repro->setOptions(reproOptions);
            premerge = repro;
        }

        // WKT is set even if we're using a bounding box for filtering, so
        // can be used as a test here.
        if (!m_wkt.empty())
        {
            Stage *crop = m_factory.createStage("filters.crop");
            crop->setOptions(cropOptions);
            crop->setInput(*premerge);
            log()->get(LogLevel::Debug3) << "Cropping data with wkt '"
                                         << m_wkt << "'" << std::endl;
            premerge = crop;
        }

        m_merge.setInput(*premerge);
    }

    if (m_sql.size())
    {
        // We were created with OGR_DS_ExecuteSQL which needs to have
        // its layer explicitly released
        OGR_DS_ReleaseResultSet(m_dataset, m_layer);
    }
    else
    {
        OGR_DS_Destroy(m_dataset);
    }
    m_layer = 0;
    m_dataset = 0;
}
コード例 #5
0
ファイル: PointTable.hpp プロジェクト: EricAlex/PDAL
 SpatialReference spatialReference() const
 {
     return spatialReferenceUnique() ? anySpatialReference() :
         SpatialReference();
 }