ShapefileHeader.java
/*
* Copyright (c) 2016 Vivid Solutions.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
/*
* Copyright (c) 2003 Open Source Geospatial Foundation, All rights reserved.
*
* This program and the accompanying materials are made available under the terms
* of the OSGeo BSD License v1.0 available at:
*
* https://www.osgeo.org/sites/osgeo.org/files/Page/osgeo-bsd-license.txt
*/
/*
* Header.java
*
* Created on February 12, 2002, 3:29 PM
*/
package org.locationtech.jtstest.testbuilder.io.shapefile;
import java.io.IOException;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.GeometryCollection;
/**
*
* @author jamesm
*/
public class ShapefileHeader{
private final static boolean DEBUG=false;
private int fileCode = -1;
public int fileLength = -1;
private int indexLength = -1;
private int version = -1;
private int shapeType = -1;
//private double[] bounds = new double[4];
private Envelope bounds;
public ShapefileHeader(EndianDataInputStream file) throws IOException {
// file.setLittleEndianMode(false);
fileCode = file.readIntBE();
// if(DEBUG)System.out.println("Sfh->Filecode "+fileCode);
if ( fileCode != Shapefile.SHAPEFILE_ID )
System.err.println("Sfh->WARNING filecode "+fileCode+" not a match for documented shapefile code "+Shapefile.SHAPEFILE_ID);
for(int i=0;i<5;i++){
int tmp = file.readIntBE();
// if(DEBUG)System.out.println("Sfh->blank "+tmp);
}
fileLength = file.readIntBE();
// file.setLittleEndianMode(true);
version=file.readIntLE();
shapeType=file.readIntLE();
//read in and for now ignore the bounding box
for(int i = 0;i<4;i++){
file.readDoubleLE();
}
//skip remaining unused bytes
// file.setLittleEndianMode(false);//well they may not be unused forever...
file.skipBytes(32);
}
public ShapefileHeader(GeometryCollection geometries,int dims) throws Exception
{
ShapeHandler handle;
if (geometries.getNumGeometries() == 0)
{
handle = new PointHandler(); //default
}
else
{
handle = Shapefile.getShapeHandler(geometries.getGeometryN(0),dims);
}
int numShapes = geometries.getNumGeometries();
shapeType = handle.getShapeType();
version = Shapefile.VERSION;
fileCode = Shapefile.SHAPEFILE_ID;
bounds = geometries.getEnvelopeInternal();
fileLength = 0;
for(int i=0;i<numShapes;i++){
fileLength+=handle.getLength(geometries.getGeometryN(i));
fileLength+=4;//for each header
}
fileLength+=50;//space used by this, the main header
indexLength = 50+(4*numShapes);
}
public void setFileLength(int fileLength){
this.fileLength = fileLength;
}
public int getShapeType(){
return shapeType;
}
public int getVersion(){
return version;
}
public Envelope getBounds(){
return bounds;
}
public String toString() {
String res = new String("Sf-->type "+fileCode+" size "+fileLength+" version "+ version + " Shape Type "+shapeType);
return res;
}
}