/*
* This file is part of JGrasstools (http://www.jgrasstools.org)
* (C) HydroloGIS - www.hydrologis.com
*
* JGrasstools is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jgrasstools.gears.io.las.core.v_1_0;
import org.geotools.geometry.jts.ReferencedEnvelope3D;
import org.jgrasstools.gears.io.las.core.ILasHeader;
import org.jgrasstools.gears.io.las.utils.LasUtils;
import org.joda.time.DateTime;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
/**
* Las header object for las spec 1.0.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class LasHeader implements ILasHeader {
/**
* file signature (LASF)
*/
String signature;
/**
* file source ID
*/
short fileSourceId;
/**
* The gps time type.
*
* <p>
* <ul>
* <li>0 (not set) = GPS time in the point record fields is GPS Week Time</li>
* <li>1 (set) = GPS time is standard GPS time (satellite gps time) minus 1E9 (Adjusted standard GPS time)</li>
* </ul>
*/
int gpsTimeType;
/**
* Project ID - data 1 (optional)
*/
long projectIdGuidData1;
/**
* Project ID - data 2 (optional)
*/
short projectIdGuidData2;
/**
* Project ID - data 3 (optional)
*/
short projectIdGuidData3;
/**
* Project ID - data 4 (optional)
*/
String projectIdGuidData4;
/**
* Version Major
*/
byte versionMajor;
/**
* Version Minor
*/
byte versionMinor;
/**
* System identifier
*/
String systemIdentifier;
/**
* generating software
*/
String generatingSoftware;
/**
* File creation Day of Year (optional)
*/
short dayOfYear;
/**
* File creation Year (optional)
*/
short year;
/**
* header size
*/
short headerSize;
/**
* offset to point data
*/
long offset;
/**
* Number of variable length records
*/
long variableLengthRecordNum;
/**
* point data format ID (0-99 for spec)
*/
byte pointDataFormat;
/**
* Record length
*/
short recordLength;
/**
* Number of point records
*/
long records;
double xScale;
double yScale;
double zScale;
double xOffset;
double yOffset;
double zOffset;
double xMin;
double yMin;
double zMin;
double xMax;
double yMax;
double zMax;
private ReferencedEnvelope3D dataEnvelope;
private CoordinateReferenceSystem crs;
public LasHeader( CoordinateReferenceSystem crs ) {
this.crs = crs;
}
public String getVersion() {
return versionMajor + "." + versionMinor;
}
public CoordinateReferenceSystem getCrs() {
return crs;
}
public long getRecordsCount() {
return records;
}
@Override
public long getOffset() {
return offset;
}
public double[] getXYZScale() {
return new double[]{xScale, yScale, zScale};
}
public double[] getXYZOffset() {
return new double[]{xOffset, yOffset, zOffset};
}
public short getRecordLength() {
return recordLength;
}
public ReferencedEnvelope3D getDataEnvelope() {
if (dataEnvelope == null) {
dataEnvelope = new ReferencedEnvelope3D(xMin, xMax, yMin, yMax, zMin, zMax, getCrs());
}
return dataEnvelope;
}
public boolean hasGpsTime() {
return pointDataFormat == 1 || pointDataFormat == 3;
}
public int getGpsTimeType() {
return gpsTimeType;
}
public boolean hasRGB() {
return pointDataFormat == 2 || pointDataFormat == 3;
}
public byte getPointDataFormat() {
return pointDataFormat;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("File signature: ").append(signature).append("\n");
sb.append("File source ID: ").append(fileSourceId).append("\n");
sb.append("Project ID - data 1: ").append(projectIdGuidData1).append("\n");
sb.append("Project ID - data 2: ").append(projectIdGuidData2).append("\n");
sb.append("Project ID - data 3: ").append(projectIdGuidData3).append("\n");
sb.append("Project ID - data 4: ").append(projectIdGuidData4).append("\n");
sb.append("Version: ").append(versionMajor).append(".").append(versionMinor).append("\n");
sb.append("System identifier: ").append(systemIdentifier).append("\n");
sb.append("Generating software: ").append(generatingSoftware).append("\n");
if (dayOfYear != 0 && year != 0) {
DateTime dateTime = new DateTime();
dateTime = dateTime.withYear(year).withDayOfYear(dayOfYear);
String dtString = dateTime.toString(LasUtils.dateTimeFormatterYYYYMMDD);
sb.append("File creation date: ").append(dtString).append("\n");
} else {
sb.append("File creation Day of Year: ").append(dayOfYear).append("\n");
sb.append("File creation Year: ").append(year).append("\n");
}
sb.append("Header size: ").append(headerSize).append("\n");
sb.append("Offset to data: ").append(offset).append("\n");
sb.append("Variable length records: ").append(variableLengthRecordNum).append("\n");
sb.append("Point data format ID (0-99 for spec): ").append(pointDataFormat).append("\n");
sb.append("Number of point records: ").append(records).append("\n");
sb.append("Record length: ").append(recordLength).append("\n");
sb.append("Scale: [").append(xScale).append(", ").append(yScale).append(", ").append(zScale).append("]\n");
sb.append("Offset: [").append(xOffset).append(", ").append(yOffset).append(", ").append(zOffset).append("]\n");
sb.append("X Range: [").append(xMin).append(", ").append(xMax).append("]\n");
sb.append("Y Range: [").append(yMin).append(", ").append(yMax).append("]\n");
sb.append("Z Range: [").append(zMin).append(", ").append(zMax).append("]\n");
sb.append("Has gps time info: ").append(hasGpsTime()).append("\n");
sb.append("Has color info: ").append(hasRGB()).append("\n");
sb.append("Gps time type: ").append(gpsTimeType).append("\n");
return sb.toString();
}
@Override
public double[] getRawDataEnvelope() {
return new double[]{xMin, yMin, zMin, xMax, yMax, zMax};
}
}