Exemple #1
0
void ZipWriterImpl::WritePoint(liblas::Point const& point)
{
    //if (m_point_writer.get() == 0) {
    //    m_point_writer = PointWriterPtr(new writer::Point(m_ofs, m_pointCount, m_header));
    //}
    //m_point_writer->write(point);

    if (m_zipper==NULL)
    {
        try
        {
            m_zipper = new LASzipper();
        }
        catch(...)
        {
            throw liblas_error("Error opening compression engine (1)");
        }

        PointFormatName format = m_header->GetDataFormatId();
        m_zipPoint = new ZipPoint(format);

        unsigned int stat = 1;
        try
        {
            stat = m_zipper->open(m_ofs, m_zipPoint->m_num_items, m_zipPoint->m_items, LASzip::DEFAULT_COMPRESSION);
        }
        catch(...)
        {
            throw liblas_error("Error opening compression engine (3)");
        }
        if (stat != 0)
        {
            throw liblas_error("Error opening compression engine (2)");
        }
    }

    bool ok = false;
    try
    {
        const std::vector<boost::uint8_t>* data;

        data = &point.GetData();

        if (data->size() != m_zipPoint->m_lz_point_size)
        {
            // We need to repack the data.
            liblas::Point p(point);
            p.SetHeaderPtr(m_header);
            data = &p.GetData();
            //      m_zipPoint->m_lz_point_data = const_cast<unsigned char*>(&(data->front()));
            for (unsigned int i=0; i<m_zipPoint->m_lz_point_size; i++)
            {
                m_zipPoint->m_lz_point_data[i] = data->at(i);
                //printf("%d %d\n", v[i], i);
            }
            ok = m_zipper->write(m_zipPoint->m_lz_point);
        } else
        {
//          m_zipPoint->m_lz_point_data = const_cast<unsigned char*>(&(data->front()));
            for (unsigned int i=0; i<m_zipPoint->m_lz_point_size; i++)
            {
                m_zipPoint->m_lz_point_data[i] = data->at(i);
                //printf("%d %d\n", v[i], i);
            }

            ok = m_zipper->write(m_zipPoint->m_lz_point);
        }

    }
    catch(...)
    {
        throw liblas_error("Error writing compressed point data (1)");
    }
    if (!ok)
    {
        throw liblas_error("Error writing compressed point data (2)");
    }
    ++m_pointCount;
    m_header->SetPointRecordsCount(m_pointCount);
}