⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 laswriter.cpp

📁 Lidar数据处理时
💻 CPP
字号:
/*
===============================================================================

  FILE:  laswriter.cpp
  
  CONTENTS:
  
    see corresponding header file
  
  PROGRAMMERS:
  
    martin isenburg@cs.unc.edu
  
  COPYRIGHT:
  
    copyright (C) 2007  martin isenburg@cs.unc.edu
    
    This software is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  
  CHANGE HISTORY:
  
    see corresponding header file
  
===============================================================================
*/
#include "laswriter.h"

#define ENABLE_LAS_COMPRESSION_SUPPORT
#undef ENABLE_LAS_COMPRESSION_SUPPORT

#include "laspointwriter0raw.h"
#include "laspointwriter1raw.h"

#ifdef ENABLE_LAS_COMPRESSION_SUPPORT
#include "laspointwriter0compressed.h"
#include "laspointwriter1compressed.h"
#endif // ENABLE_LAS_COMPRESSION_SUPPORT

#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif

#include <stdlib.h>
#include <string.h>

bool LASwriter::open(FILE* file, LASheader* header, int compression)
{
  if (file == 0)
  {
    fprintf(stderr,"ERROR: file pointer is zero\n");
    return false;
  }

  if (header == 0)
  {
    fprintf(stderr,"ERROR: header pointer is zero\n");
    return false;
  }

#ifdef _WIN32
  if (file == stdout)
  {
    if(_setmode( _fileno( stdout ), _O_BINARY ) == -1 )
    {
      fprintf(stderr, "ERROR: cannot set stdout to binary (untranslated) mode\n");
    }
  }
#endif

  this->file = file;

  // check header contents

  if (strncmp(header->file_signature, "LASF", 4) != 0)
  {
    fprintf(stderr,"ERROR: wrong file signature '%s'\n", header->file_signature);
    return false;
  }
  if ((header->version_major != 1) || ((header->version_minor != 0) && (header->version_minor != 1)))
  {
    fprintf(stderr,"WARNING: unknown version %d.%d (should be 1.0 or 1.1)\n", header->version_major, header->version_minor);
  }
  if (header->header_size != 227)
  {
    fprintf(stderr,"WARNING: header size is %d but should be 227\n", header->header_size);
  }
  if (header->offset_to_point_data < header->header_size)
  {
    fprintf(stderr,"ERROR: offset to point data %d is smaller than header size %d\n", header->offset_to_point_data, header->header_size);
    return false;
  }
  if (header->point_data_format == 0)
  {
    if (header->point_data_record_length != 20)
    {
      fprintf(stderr,"WARNING: wrong point data record length of %d instead of 20 for format 0\n", header->point_data_record_length);
    }
  }
  else if (header->point_data_format == 1)
  {
    if (header->point_data_record_length != 28)
    {
      fprintf(stderr,"WARNING: wrong point data record length of %d instead of 28 for format 1\n", header->point_data_record_length);
    }
  }
  else
  {
    fprintf(stderr,"WARNING: unknown point data format %d\n", header->point_data_format);
  }
  if (header->x_scale_factor == 0 || header->y_scale_factor == 0 || header->z_scale_factor == 0)
  {
    fprintf(stderr,"WARNING: some scale factors are zero %g %g %g. those are set to 0.01.\n", header->x_scale_factor, header->y_scale_factor, header->z_scale_factor);
    if (header->x_scale_factor == 0) header->x_scale_factor = 0.01;
    if (header->y_scale_factor == 0) header->y_scale_factor = 0.01;
    if (header->z_scale_factor == 0) header->z_scale_factor = 0.01;
  }
  if (header->max_x < header->min_x || header->max_y < header->min_y || header->max_z < header->min_z)
  {
    fprintf(stderr,"WARNING: invalid bounding box [ %g %g %g / %g %g %g ]\n", header->min_x, header->min_y, header->min_z, header->max_x, header->max_y, header->max_z);
  }

  // create the right point writer in dependance on compression and point data format

  if (compression)
  {
#ifdef ENABLE_LAS_COMPRESSION_SUPPORT
    if (header->point_data_format)
    {
      pointWriter = new LASpointWriter1compressed(file);
    }
    else
    {
      pointWriter = new LASpointWriter0compressed(file);
    }
    // change the format to compressed
    header->point_data_format |= 128;
#else // ENABLE_LAS_COMPRESSION_SUPPORT
    fprintf(stderr,"ERROR: this version of the laswriter does not support compression\n");
    return false;
#endif // ENABLE_LAS_COMPRESSION_SUPPORT
  }
  else
  {
    if (header->point_data_format)
    {
      pointWriter = new LASpointWriter1raw(file);
    }
    else
    {
      pointWriter = new LASpointWriter0raw(file);
    }
  }

  // write header variable after variable (to avoid alignment issues)

  if (fwrite(&(header->file_signature), sizeof(char), 4, file) != 4)
  {
    fprintf(stderr,"ERROR: writing header->file_signature\n");
    return false;
  }
  if (fwrite(&(header->file_source_id), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->file_source_id\n");
    return false;
  }
  if (fwrite(&(header->reserved), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->reserved\n");
    return false;
  }
  if (fwrite(&(header->project_ID_GUID_data_1), sizeof(unsigned int), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->project_ID_GUID_data_1\n");
    return false;
  }
  if (fwrite(&(header->project_ID_GUID_data_2), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->project_ID_GUID_data_2\n");
    return false;
  }
  if (fwrite(&(header->project_ID_GUID_data_3), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->project_ID_GUID_data_3\n");
    return false;
  }
  if (fwrite(&(header->project_ID_GUID_data_4), sizeof(char), 8, file) != 8)
  {
    fprintf(stderr,"ERROR: writing header->project_ID_GUID_data_4\n");
    return false;
  }
  if (fwrite(&(header->version_major), sizeof(char), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->version_major\n");
    return false;
  }
  if (fwrite(&(header->version_minor), sizeof(char), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->version_minor\n");
    return false;
  }
  if (fwrite(&(header->system_identifier), sizeof(char), 32, file) != 32)
  {
    fprintf(stderr,"ERROR: writing header->system_identifier\n");
    return false;
  }
  if (fwrite(&(header->generating_software), sizeof(char), 32, file) != 32)
  {
    fprintf(stderr,"ERROR: writing header->generating_software\n");
    return false;
  }
  if (fwrite(&(header->file_creation_day), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->file_creation_day\n");
    return false;
  }
  if (fwrite(&(header->file_creation_year), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->file_creation_year\n");
    return false;
  }
  if (fwrite(&(header->header_size), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->header_size\n");
    return false;
  }
  if (fwrite(&(header->offset_to_point_data), sizeof(unsigned int), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->offset_to_point_data\n");
    return false;
  }
  if (fwrite(&(header->number_of_variable_length_records), sizeof(unsigned int), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->number_of_variable_length_records\n");
    return false;
  }
  if (fwrite(&(header->point_data_format), sizeof(unsigned char), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->point_data_format\n");
    return false;
  }
  if (fwrite(&(header->point_data_record_length), sizeof(unsigned short), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->point_data_record_length\n");
    return false;
  }
  if (fwrite(&(header->number_of_point_records), sizeof(unsigned int), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->number_of_point_records\n");
    return false;
  }
  if (fwrite(&(header->number_of_points_by_return), sizeof(unsigned int), 5, file) != 5)
  {
    fprintf(stderr,"ERROR: writing header->number_of_points_by_return\n");
    return false;
  }
  if (fwrite(&(header->x_scale_factor), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->x_scale_factor\n");
    return false;
  }
  if (fwrite(&(header->y_scale_factor), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->y_scale_factor\n");
    return false;
  }
  if (fwrite(&(header->z_scale_factor), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->z_scale_factor\n");
    return false;
  }
  if (fwrite(&(header->x_offset), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->x_offset\n");
    return false;
  }
  if (fwrite(&(header->y_offset), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->y_offset\n");
    return false;
  }
  if (fwrite(&(header->z_offset), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->z_offset\n");
    return false;
  }
  if (fwrite(&(header->max_x), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->max_x\n");
    return false;
  }
  if (fwrite(&(header->min_x), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->min_x\n");
    return false;
  }
  if (fwrite(&(header->max_y), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->max_y\n");
    return false;
  }
  if (fwrite(&(header->min_y), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->min_y\n");
    return false;
  }
  if (fwrite(&(header->max_z), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->max_z\n");
    return false;
  }
  if (fwrite(&(header->min_z), sizeof(double), 1, file) != 1)
  {
    fprintf(stderr,"ERROR: writing header->min_z\n");
    return false;
  }

#ifdef ENABLE_LAS_COMPRESSION_SUPPORT
  // change the format to compressed back to what it was
  header->point_data_format &= 127;
#endif // ENABLE_LAS_COMPRESSION_SUPPORT

  npoints = header->number_of_point_records;
  p_count = 0;

  return true;
}

bool LASwriter::write_point(LASpoint* point, double gps_time)
{
  p_count++;
  return pointWriter->write_point(point, gps_time);
}

void LASwriter::close()
{
  if (npoints && p_count != npoints)  fprintf(stderr,"WARNING: written %d points but expected %d points\n", p_count, npoints);
  p_count = -1;
  file = 0;
  if (pointWriter) 
  {
    delete pointWriter;
    pointWriter = 0;
  }
}

LASwriter::LASwriter()
{
  npoints = -1;
  p_count = -1;
  file = 0;
  pointWriter = 0;
}

LASwriter::~LASwriter()
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -