package com.opendoorlogistics.core.geometry; import java.io.File; import org.apache.commons.io.FilenameUtils; import com.opendoorlogistics.api.io.ImportFileType; import com.opendoorlogistics.api.tables.ODLColumnType; import com.opendoorlogistics.api.tables.ODLDatastoreAlterable; import com.opendoorlogistics.api.tables.ODLTable; import com.opendoorlogistics.api.tables.ODLTableAlterable; import com.opendoorlogistics.core.CommandLineInterface; import com.opendoorlogistics.core.tables.io.TableIOUtils; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.PrecisionModel; public class Shapefile2TextCommand implements CommandLineInterface.Command{ @Override public String[] getKeywords() { return new String[]{ "shp2tab"}; } @Override public String getDescription() { return "Turn a shapefile into a tab separated file with WKT geometry"; } @Override public boolean execute(String[] args) { String inputFile =args[0]; String outputFile =args[1]; convert(inputFile, outputFile); return true; } private static void convert(String inputFile, String outputFile) { ODLDatastoreAlterable<ODLTableAlterable> tables = TableIOUtils.importFile(new File(inputFile), ImportFileType.SHAPEFILE_COPIED_GEOM, null,null); ODLTable table = tables.getTableAt(0); // by default use 6 digit precision GeometryFactory factory = new GeometryFactory(new PrecisionModel(100000)); for(int col =0 ; col< table.getColumnCount() ; col++){ if(table.getColumnType(col)==ODLColumnType.GEOM){ for(int row=0;row < table.getRowCount(); row++){ ODLGeomImpl geom = (ODLGeomImpl)table.getValueAt(row, col); if(geom!=null){ // take down precision Geometry geometry =geom.getJTSGeometry(); geometry = factory.createGeometry(geometry); // set back ODLLoadedGeometry loadedGeometry = new ODLLoadedGeometry(geometry); table.setValueAt(loadedGeometry,row, col); } } } } TableIOUtils.writeToTabFile(table, new File(outputFile)); } public static class Shapefile2TextCommandDir implements CommandLineInterface.Command{ @Override public String[] getKeywords() { return new String[]{ "shp2tabdir"}; } @Override public String getDescription() { return "Turn a whole directory of shapefiles into WKT geometry files"; } @Override public boolean execute(String[] args) { File dir = new File(args[0]); for(File child:dir.listFiles()){ String filename = child.getAbsolutePath(); if(FilenameUtils.getExtension(filename).toLowerCase().equals("shp")){ String outputFile = FilenameUtils.removeExtension(filename)+".wkt.txt"; System.out.println("Converting " + filename + " to " + outputFile); convert(filename, outputFile); } } return true; } } }