Search in sources :

Example 1 with ShapeInterface

use of org.pentaho.gis.shapefiles.ShapeInterface in project pentaho-kettle by pentaho.

the class ShapeFileReader method processRow.

public synchronized boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleStepException {
    meta = (ShapeFileReaderMeta) smi;
    data = (ShapeFileReaderData) sdi;
    boolean retval = true;
    if (data.shapeNr >= data.shapeFile.getNrShapes()) {
        setOutputDone();
        return false;
    }
    if (first) {
        first = false;
        data.outputRowMeta = new RowMeta();
        meta.getFields(data.outputRowMeta, getStepname(), null, null, this);
    }
    // building new row
    Object[] outputRow = RowDataUtil.allocateRowData(data.outputRowMeta.size());
    int outputIndex;
    // getting shape # data.shapeNr from shapefile
    // Get the shape from the shapefile
    // 
    ShapeInterface si = data.shapeFile.getShape(data.shapeNr);
    switch(si.getType()) {
        case Shape.SHAPE_TYPE_POLYLINE_M:
            {
                // PolyLimeM";
                ShapePolyLineM eplm = (ShapePolyLineM) si;
                int partnr = 0;
                for (int j = 0; j < eplm.nrpoints; j++) {
                    // PolyLimeM, point #"+j;
                    for (int k = 0; k < eplm.nrparts; k++) {
                        if (j == eplm.part_starts[k])
                            partnr++;
                    }
                    outputIndex = 0;
                    // adding the basics";
                    // Add the basics...
                    // The filename...
                    outputRow[outputIndex++] = meta.getShapeFilename();
                    // The file type
                    outputRow[outputIndex++] = data.shapeFile.getFileHeader().getShapeTypeDesc();
                    // The shape nr
                    outputRow[outputIndex++] = new Long(data.shapeNr + 1);
                    // The part nr
                    outputRow[outputIndex++] = new Long(partnr);
                    // The nr of parts
                    outputRow[outputIndex++] = new Long(eplm.nrparts);
                    // The point nr
                    outputRow[outputIndex++] = new Long(j + 1);
                    // The nr of points
                    outputRow[outputIndex++] = new Long(eplm.nrpoints);
                    // The X coordinate
                    outputRow[outputIndex++] = new Double(eplm.point[j].x);
                    // The Y coordinate
                    outputRow[outputIndex++] = new Double(eplm.point[j].y);
                    // The measure
                    outputRow[outputIndex++] = new Double(eplm.measures[j]);
                    // The Values in the DBF file...
                    // PolyLimeM, point #"+j+", add dbf data";
                    Object[] dbfData = si.getDbfData();
                    RowMetaInterface dbfMeta = si.getDbfMeta();
                    for (int d = 0; d < dbfMeta.size(); d++) {
                        outputRow[outputIndex++] = dbfData[d];
                    }
                    linesInput++;
                    // Put it out to the rest of the world...
                    putRow(data.outputRowMeta, outputRow);
                }
            }
            break;
        case Shape.SHAPE_TYPE_POLYGON:
            {
                // ShapePolygon";
                ShapePolygon epl = (ShapePolygon) si;
                int partnr = 0;
                for (int j = 0; j < epl.nrpoints; j++) {
                    // PolyLime, point #"+j;
                    for (int k = 0; k < epl.nrparts; k++) {
                        if (j == epl.part_starts[k])
                            partnr++;
                    }
                    outputIndex = 0;
                    // adding the basics";
                    // Add the basics...
                    // The filename...
                    outputRow[outputIndex++] = meta.getShapeFilename();
                    // The file type
                    outputRow[outputIndex++] = data.shapeFile.getFileHeader().getShapeTypeDesc();
                    // The shape nr
                    outputRow[outputIndex++] = new Long(data.shapeNr + 1);
                    // The part nr
                    outputRow[outputIndex++] = new Long(partnr);
                    // The nr of parts
                    outputRow[outputIndex++] = new Long(epl.nrparts);
                    // The point nr
                    outputRow[outputIndex++] = new Long(j + 1);
                    // The nr of points
                    outputRow[outputIndex++] = new Long(epl.nrpoints);
                    // The X coordinate
                    outputRow[outputIndex++] = new Double(epl.point[j].x);
                    // The Y coordinate
                    outputRow[outputIndex++] = new Double(epl.point[j].y);
                    // The measure
                    outputRow[outputIndex++] = new Double(0.0);
                    // The Values in the DBF file...
                    // PolyLime, point #"+j+", add dbf data";
                    // 
                    Object[] dbfData = si.getDbfData();
                    RowMetaInterface dbfMeta = si.getDbfMeta();
                    for (int d = 0; d < dbfMeta.size(); d++) {
                        outputRow[outputIndex++] = dbfData[d];
                    }
                    linesInput++;
                    // Put it out to the rest of the world...
                    putRow(data.outputRowMeta, outputRow);
                }
            }
            break;
        case Shape.SHAPE_TYPE_POLYLINE:
            {
                // PolyLime";
                ShapePolyLine epl = (ShapePolyLine) si;
                int partnr = 0;
                for (int j = 0; j < epl.nrpoints; j++) {
                    // PolyLime, point #"+j;
                    for (int k = 0; k < epl.nrparts; k++) {
                        if (j == epl.part_starts[k])
                            partnr++;
                    }
                    outputIndex = 0;
                    // adding the basics";
                    // Add the basics...
                    // The filename...
                    outputRow[outputIndex++] = meta.getShapeFilename();
                    // The file type
                    outputRow[outputIndex++] = data.shapeFile.getFileHeader().getShapeTypeDesc();
                    // The shape nr
                    outputRow[outputIndex++] = new Long(data.shapeNr + 1);
                    // The part nr
                    outputRow[outputIndex++] = new Long(partnr);
                    // The nr of parts
                    outputRow[outputIndex++] = new Long(epl.nrparts);
                    // The point nr
                    outputRow[outputIndex++] = new Long(j + 1);
                    // The nr of points
                    outputRow[outputIndex++] = new Long(epl.nrpoints);
                    // The X coordinate
                    outputRow[outputIndex++] = new Double(epl.point[j].x);
                    // The Y coordinate
                    outputRow[outputIndex++] = new Double(epl.point[j].y);
                    // The measure
                    outputRow[outputIndex++] = new Double(0.0);
                    // The Values in the DBF file...
                    // PolyLime, point #"+j+", add dbf data";
                    // 
                    Object[] dbfData = si.getDbfData();
                    RowMetaInterface dbfMeta = si.getDbfMeta();
                    for (int d = 0; d < dbfMeta.size(); d++) {
                        outputRow[outputIndex++] = dbfData[d];
                    }
                    linesInput++;
                    // Put it out to the rest of the world...
                    putRow(data.outputRowMeta, outputRow);
                }
            }
            break;
        case Shape.SHAPE_TYPE_POINT:
            {
                // Point";
                ShapePoint ep = (ShapePoint) si;
                // Add the basics...
                outputIndex = 0;
                // The filename...
                outputRow[outputIndex++] = meta.getShapeFilename();
                // The file type
                outputRow[outputIndex++] = data.shapeFile.getFileHeader().getShapeTypeDesc();
                // The shape nr
                outputRow[outputIndex++] = new Long(data.shapeNr);
                // The part nr
                outputRow[outputIndex++] = new Long(0L);
                // The nr of parts
                outputRow[outputIndex++] = new Long(0L);
                // The point nr
                outputRow[outputIndex++] = new Long(0L);
                // The nr of points
                outputRow[outputIndex++] = new Long(0L);
                // The X coordinate
                outputRow[outputIndex++] = new Double(ep.x);
                // The Y coordinate
                outputRow[outputIndex++] = new Double(ep.y);
                // The measure
                outputRow[outputIndex++] = new Double(0.0);
                // The Values in the DBF file...
                // PolyLimeM, point #"+data.shapeNr+", add dbf data";
                // 
                Object[] dbfData = si.getDbfData();
                RowMetaInterface dbfMeta = si.getDbfMeta();
                for (int d = 0; d < dbfMeta.size(); d++) {
                    outputRow[outputIndex++] = dbfData[d];
                }
                linesInput++;
                // Put it out to the rest of the world...
                putRow(data.outputRowMeta, outputRow);
            }
            break;
        default:
            System.out.println("Unable to parse shape type [" + Shape.getEsriTypeDesc(si.getType()) + "] : not yet implemented.");
            throw new KettleStepException("Unable to parse shape type [" + Shape.getEsriTypeDesc(si.getType()) + "] : not yet implemented.");
    }
    // Next shape please!
    data.shapeNr++;
    if ((linesInput % Const.ROWS_UPDATE) == 0)
        logBasic("linenr " + linesInput);
    return retval;
}
Also used : KettleStepException(org.pentaho.di.core.exception.KettleStepException) RowMeta(org.pentaho.di.core.row.RowMeta) RowMetaInterface(org.pentaho.di.core.row.RowMetaInterface) ShapePoint(org.pentaho.gis.shapefiles.ShapePoint) ShapePoint(org.pentaho.gis.shapefiles.ShapePoint) ShapePolyLineM(org.pentaho.gis.shapefiles.ShapePolyLineM) ShapePolyLine(org.pentaho.gis.shapefiles.ShapePolyLine) ShapeInterface(org.pentaho.gis.shapefiles.ShapeInterface) ShapePolygon(org.pentaho.gis.shapefiles.ShapePolygon)

Aggregations

KettleStepException (org.pentaho.di.core.exception.KettleStepException)1 RowMeta (org.pentaho.di.core.row.RowMeta)1 RowMetaInterface (org.pentaho.di.core.row.RowMetaInterface)1 ShapeInterface (org.pentaho.gis.shapefiles.ShapeInterface)1 ShapePoint (org.pentaho.gis.shapefiles.ShapePoint)1 ShapePolyLine (org.pentaho.gis.shapefiles.ShapePolyLine)1 ShapePolyLineM (org.pentaho.gis.shapefiles.ShapePolyLineM)1 ShapePolygon (org.pentaho.gis.shapefiles.ShapePolygon)1