📄 lasdiff.cpp
字号:
/*
===============================================================================
FILE: lasdiff.cpp
CONTENTS:
This tool reads two LIDAR files in LAS format and checks whether they are
identical. Both the standard header, the variable header, and all points
are checked.
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:
11 July 2007 -- added more complete reporting about differences
23 February 2007 -- created just before getting ready for the cabin trip
===============================================================================
*/
#include "lasreader.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
extern "C" FILE* fopenGzipped(const char* filename, const char* mode);
#endif
void usage()
{
fprintf(stderr,"usage:\n");
fprintf(stderr,"lasdiff lidar1.las lidar2.las\n");
fprintf(stderr,"lasdiff lidar1.las lidar1.las.lz\n");
fprintf(stderr,"lasdiff -i lidar1.las -i lidar1.laz\n");
fprintf(stderr,"lasdiff -h\n");
exit(1);
}
static int lidardouble2string(char* string, double value0, double value1)
{
int len;
len = sprintf(string, "%f", value0) - 1;
while (string[len] == '0') len--;
if (string[len] != '.') len++;
len += sprintf(&(string[len]), " %f", value1) - 1;
while (string[len] == '0') len--;
if (string[len] != '.') len++;
string[len] = '\0';
return len;
}
int main(int argc, char *argv[])
{
int i;
char* file_name_in1 = 0;
char* file_name_in2 = 0;
for (i = 1; i < argc; i++)
{
if (strcmp(argv[i],"-i") == 0)
{
i++;
if (file_name_in1) file_name_in2 = argv[i];
else file_name_in1 = argv[i];
}
else if (i == argc - 2 && file_name_in1 == 0 && file_name_in2 == 0)
{
if (file_name_in1) file_name_in2 = argv[i];
else file_name_in1 = argv[i];
}
else if (i == argc - 1 && file_name_in1 && file_name_in2 == 0)
{
if (file_name_in1) file_name_in2 = argv[i];
else file_name_in1 = argv[i];
}
else
{
usage();
}
}
FILE* file_in1;
if (file_name_in1)
{
if (strstr(file_name_in1, ".gz"))
{
#ifdef _WIN32
file_in1 = fopenGzipped(file_name_in1, "rb");
#else
fprintf(stderr, "ERROR: no support for gzipped input\n");
exit(1);
#endif
}
else
{
file_in1 = fopen(file_name_in1, "rb");
}
if (file_in1 == 0)
{
fprintf (stderr, "ERROR: could not open file '%s'\n", file_name_in1);
usage();
}
}
else
{
fprintf (stderr, "ERROR: no input specified\n");
usage();
}
LASreader* lasreader1 = new LASreader();
if (lasreader1->open(file_in1,false) == false)
{
fprintf (stderr, "ERROR: lasreader open failed for '%s'\n", file_name_in1);
usage();
}
FILE* file_in2;
if (file_name_in2)
{
if (strstr(file_name_in2, ".gz"))
{
#ifdef _WIN32
file_in2 = fopenGzipped(file_name_in2, "rb");
#else
fprintf(stderr, "ERROR: no support for gzipped input\n");
exit(1);
#endif
}
else
{
file_in2 = fopen(file_name_in2, "rb");
}
if (file_in2 == 0)
{
fprintf (stderr, "ERROR: could not open file '%s'\n", file_name_in2);
usage();
}
}
else
{
fprintf (stderr, "ERROR: no input specified\n");
usage();
}
LASreader* lasreader2 = new LASreader();
if (lasreader2->open(file_in2,false) == false)
{
fprintf (stderr, "ERROR: lasreader open failed for '%s'\n", file_name_in2);
usage();
}
// check header
if (memcmp((const void*)&(lasreader1->header), (const void*)&(lasreader2->header), sizeof(LASheader)))
{
char printstring[128];
fprintf(stderr, "header is different\n");
LASheader* lasheader1 = &(lasreader1->header);
LASheader* lasheader2 = &(lasreader2->header);
bool fatal_difference = false;
if (strncmp(lasheader1->file_signature, lasheader2->file_signature, 4))
{
fprintf(stderr, " file_signature: %s %s\n", lasheader1->file_signature, lasheader2->file_signature);
}
if (lasheader2->file_source_id != lasheader2->file_source_id)
{
fprintf(stderr, " file_source_id: %d %d\n", lasheader1->file_source_id, lasheader2->file_source_id);
}
if (lasheader1->reserved != lasheader2->reserved)
{
fprintf(stderr, " reserved: %d %d\n", lasheader1->reserved, lasheader2->reserved);
}
if (lasheader1->project_ID_GUID_data_1 != lasheader2->project_ID_GUID_data_1)
{
fprintf(stderr, " project_ID_GUID_data_1: %d %d\n", lasheader1->project_ID_GUID_data_1, lasheader2->project_ID_GUID_data_1);
}
if (lasheader1->project_ID_GUID_data_2 != lasheader2->project_ID_GUID_data_2)
{
fprintf(stderr, " project_ID_GUID_data_2: %d %d\n", lasheader1->project_ID_GUID_data_2, lasheader2->project_ID_GUID_data_2);
}
if (lasheader1->project_ID_GUID_data_3 != lasheader2->project_ID_GUID_data_3)
{
fprintf(stderr, " project_ID_GUID_data_3: %d %d\n", lasheader1->project_ID_GUID_data_3, lasheader2->project_ID_GUID_data_3);
}
if (strncmp(lasheader1->project_ID_GUID_data_4, lasheader2->project_ID_GUID_data_4, 8))
{
fprintf(stderr, " project_ID_GUID_data_4: %s %s\n", lasheader1->project_ID_GUID_data_4, lasheader2->project_ID_GUID_data_4);
}
if (lasheader1->version_major != lasheader2->version_major || lasheader1->version_minor != lasheader2->version_minor)
{
fprintf(stderr, " version: %d.%d %d.%d\n", lasheader1->version_major, lasheader1->version_minor, lasheader2->version_major, lasheader2->version_minor);
}
if (strncmp(lasheader1->system_identifier, lasheader2->system_identifier, 32))
{
fprintf(stderr, " system_identifier: %s %s\n", lasheader1->system_identifier, lasheader2->system_identifier);
}
if (strncmp(lasheader1->generating_software, lasheader2->generating_software, 32))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -