/*
* 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.liblas;
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 read from liblas.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class LiblasHeader implements ILasHeader {
private LiblasJNALibrary WRAPPER;
// private long srsHandle;
private String signature = "";
private short fileSourceId = 0;
// private byte globalEnchodingBitFirstHalf = 0;
private long projectIdGuidData1 = 0;
private short projectIdGuidData2 = 0;
private short projectIdGuidData3 = 0;
private String projectIdGuidData4 = "";
private byte versionMajor = 0;
private byte versionMinor = 0;
private String systemIdentifier = "";
private String generatingSoftware = "";
private short dayOfYear = 0;
private short year = 0;
private short headerSize = 0;
private long offset = 0;
private long variableLengthRecordNum = 0;
private byte pointDataFormat = 0;
private short recordLength = 0;
private long pointRecordsCount = 0;
private int gpsTimeType;
private double xScale = 0.0;
private double yScale = 0.0;
private double zScale = 0.0;
private double xOffset = 0.0;
private double yOffset = 0.0;
private double zOffset = 0.0;
private double xMax = 0.0;
private double xMin = 0.0;
private double yMax = 0.0;
private double yMin = 0.0;
private double zMax = 0.0;
private double zMin = 0.0;
private CoordinateReferenceSystem crs;
private ReferencedEnvelope3D dataEnvelope;
public LiblasHeader( LiblasJNALibrary wrapper, long headerHandle, CoordinateReferenceSystem crs ) {
this.WRAPPER = wrapper;
this.crs = crs;
// srsHandle = WRAPPER.LASHeader_GetSRS(headerHandle);
pointRecordsCount = WRAPPER.LASHeader_GetPointRecordsCount(headerHandle);
recordLength = WRAPPER.LASHeader_GetDataRecordLength(headerHandle);
xMin = WRAPPER.LASHeader_GetMinX(headerHandle);
yMin = WRAPPER.LASHeader_GetMinY(headerHandle);
zMin = WRAPPER.LASHeader_GetMinZ(headerHandle);
xMax = WRAPPER.LASHeader_GetMaxX(headerHandle);
yMax = WRAPPER.LASHeader_GetMaxY(headerHandle);
zMax = WRAPPER.LASHeader_GetMaxZ(headerHandle);
xOffset = WRAPPER.LASHeader_GetOffsetX(headerHandle);
yOffset = WRAPPER.LASHeader_GetOffsetY(headerHandle);
zOffset = WRAPPER.LASHeader_GetOffsetZ(headerHandle);
xScale = WRAPPER.LASHeader_GetScaleX(headerHandle);
yScale = WRAPPER.LASHeader_GetScaleY(headerHandle);
zScale = WRAPPER.LASHeader_GetScaleZ(headerHandle);
signature = WRAPPER.LASHeader_GetFileSignature(headerHandle);
fileSourceId = WRAPPER.LASHeader_GetFileSourceId(headerHandle);
WRAPPER.LASHeader_GetReserved(headerHandle);
WRAPPER.LASHeader_GetProjectId(headerHandle);
versionMajor = WRAPPER.LASHeader_GetVersionMajor(headerHandle);
versionMinor = WRAPPER.LASHeader_GetVersionMinor(headerHandle);
systemIdentifier = WRAPPER.LASHeader_GetSystemId(headerHandle);
generatingSoftware = WRAPPER.LASHeader_GetSoftwareId(headerHandle);
dayOfYear = WRAPPER.LASHeader_GetCreationDOY(headerHandle);
year = WRAPPER.LASHeader_GetCreationYear(headerHandle);
headerSize = WRAPPER.LASHeader_GetHeaderSize(headerHandle);
offset = WRAPPER.LASHeader_GetDataOffset(headerHandle);
// WRAPPER.LASHeader_GetRecordsCount(headerHandle);
pointDataFormat = WRAPPER.LASHeader_GetDataFormatId(headerHandle);
// WRAPPER.LASHeader_GetPointRecordsByReturnCount(headerHandle, int returnNum );
}
public double[] getXYZScale() {
return new double[]{xScale, yScale, zScale};
}
public double[] getXYZOffset() {
return new double[]{xOffset, yOffset, zOffset};
}
public short getRecordLength() {
return recordLength;
}
public long getOffset() {
return offset;
}
/**
* Sets 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>
*
* @param gpsTimeType the type to set.
*/
public void setGpsTimeType( int gpsTimeType ) {
this.gpsTimeType = gpsTimeType;
}
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(pointRecordsCount).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 String getVersion() {
return versionMajor + "." + versionMinor;
}
public CoordinateReferenceSystem getCrs() {
return crs;
}
@Override
public ReferencedEnvelope3D getDataEnvelope() {
if (dataEnvelope == null) {
dataEnvelope = new ReferencedEnvelope3D(xMin, xMax, yMin, yMax, zMin, zMax, getCrs());
}
return dataEnvelope;
}
@Override
public long getRecordsCount() {
return pointRecordsCount;
}
public boolean hasGpsTime() {
return pointDataFormat == 1 || pointDataFormat == 3;
}
public boolean hasRGB() {
return pointDataFormat == 2 || pointDataFormat == 3;
}
@Override
public byte getPointDataFormat() {
return pointDataFormat;
}
@Override
public int getGpsTimeType() {
return gpsTimeType;
}
@Override
public double[] getRawDataEnvelope() {
return new double[]{xMin, yMin, zMin, xMax, yMax, zMax};
}
}