/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2016 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.pentaho.gis.shapefiles;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.core.row.RowMetaInterface;
import org.pentaho.di.trans.steps.xbaseinput.XBase;
/*
* Created on 30-jun-2004
*
* @author Matt
*
*/
public class ShapeFile {
private List<ShapeInterface> shapes;
private ShapeFileHeader fileheader;
private LogChannelInterface log;
private String dbfFilename;
private String shapeFilename;
public ShapeFile( LogChannelInterface log, String name ) {
this.log = log;
dbfFilename = name + ".dbf";
shapeFilename = name + ".shp";
shapes = new ArrayList<ShapeInterface>();
}
public ShapeFile( LogChannelInterface log, String shapeFilename, String dbfFilename ) {
this.log = log;
this.shapeFilename = shapeFilename;
this.dbfFilename = dbfFilename;
shapes = new ArrayList<ShapeInterface>();
}
/**
* @return Returns the shapeFilename.
*/
public String getShapeFilename() {
return shapeFilename;
}
/**
* @return Returns the dbfFilename.
*/
public String getDbfFilename() {
return dbfFilename;
}
public void readFile() throws GisException, KettleException {
File file = new File( shapeFilename );
try {
// Open shape file & DBF file...
DataInputStream dis = new DataInputStream( new FileInputStream( file ) );
XBase xbase = new XBase( log, dbfFilename );
xbase.open(); // throws exception now
// First determine the meta-data for this dbf file...
RowMetaInterface fields = xbase.getFields();
// Read the header data...
byte[] header = new byte[100];
dis.read( header );
fileheader = new ShapeFileHeader( header );
int id = 0;
while ( dis.available() > 0 ) {
// Read the record header to see the length of the next shape...
byte[] record_header = new byte[8];
dis.read( record_header );
ShapeRecordHeader erh = new ShapeRecordHeader( record_header );
// Read the actual content of the shape
if ( erh.length <= dis.available() ) {
byte[] content = new byte[erh.length];
dis.read( content );
// Determine the shape type...
int btype = Converter.getIntegerLittle( content, 0 );
ShapeInterface esi = null;
switch ( btype ) {
case Shape.SHAPE_TYPE_NULL:
esi = new ShapeNull( content );
break;
case Shape.SHAPE_TYPE_POINT:
esi = new ShapePoint( content );
break;
case Shape.SHAPE_TYPE_POLYLINE:
esi = new ShapePolyLine( content );
break;
case Shape.SHAPE_TYPE_POLYGON:
esi = new ShapePolygon( content );
break;
case Shape.SHAPE_TYPE_POLYLINE_M:
esi = new ShapePolyLineM( content );
break;
default:
throw new GisException( "shape type : " + btype + " not recognized! (" + Shape.getEsriTypeDesc( btype ) + ")" );
}
// Get a row from the associated DBF file...
Object[] row = xbase.getRow( fields );
if ( row != null ) {
esi.setDbfData( row );
esi.setDbfMeta( xbase.getFields() );
}
shapes.add( esi );
id++;
}
}
dis.close();
xbase.close();
} catch ( IOException e ) {
throw new GisException( "Error reading shape file", e );
}
}
public int getNrShapes() {
return shapes.size();
}
public ShapeInterface getShape( int i ) {
return shapes.get( i );
}
public void addShape( ShapeInterface esi ) {
shapes.add( esi );
}
public ShapeFileHeader getFileHeader() {
return fileheader;
}
public String getFilename() {
return shapeFilename;
}
}