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); }