Revision: 5641 http://sourceforge.net/p/jump-pilot/code/5641 Author: ma15569 Date: 2017-12-15 11:43:56 +0000 (Fri, 15 Dec 2017) Log Message: ----------- Extended IOTools to export DBase files and Vector Style SLD files
Modified Paths: -------------- core/trunk/src/org/openjump/core/apitools/IOTools.java Modified: core/trunk/src/org/openjump/core/apitools/IOTools.java =================================================================== --- core/trunk/src/org/openjump/core/apitools/IOTools.java 2017-12-15 11:22:59 UTC (rev 5640) +++ core/trunk/src/org/openjump/core/apitools/IOTools.java 2017-12-15 11:43:56 UTC (rev 5641) @@ -14,131 +14,408 @@ package org.openjump.core.apitools; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.util.Date; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Vector; +import org.geotools.dbffile.DbfFieldDef; +import org.geotools.dbffile.DbfFile; +import org.geotools.dbffile.DbfFileWriter; +import org.openjump.core.ui.util.ScreenScale; + +import com.vividsolutions.jts.geom.Geometry; +import com.vividsolutions.jump.I18N; +import com.vividsolutions.jump.feature.AttributeType; +import com.vividsolutions.jump.feature.BasicFeature; import com.vividsolutions.jump.feature.Feature; import com.vividsolutions.jump.feature.FeatureCollection; -import com.vividsolutions.jump.io.*; +import com.vividsolutions.jump.feature.FeatureSchema; +import com.vividsolutions.jump.io.DriverProperties; +import com.vividsolutions.jump.io.FMEGMLReader; +import com.vividsolutions.jump.io.JMLReader; +import com.vividsolutions.jump.io.JMLWriter; +import com.vividsolutions.jump.io.ShapefileReader; +import com.vividsolutions.jump.io.ShapefileWriter; +import com.vividsolutions.jump.io.WKTReader; import com.vividsolutions.jump.io.datasource.DataSource; +import com.vividsolutions.jump.io.datasource.DataSourceQuery; +import com.vividsolutions.jump.util.java2xml.Java2XML; +import com.vividsolutions.jump.workbench.JUMPWorkbench; +import com.vividsolutions.jump.workbench.model.Layer; +import com.vividsolutions.jump.workbench.model.LayerManager; -public class IOTools -{ +import de.latlon.deejump.plugin.style.LayerStyle2SLDPlugIn; - private static String getExtension(String filename) - { - int len = filename.length(); - return filename.substring(len - 3, len); - } +public class IOTools { - public static FeatureCollection load(String filename) - throws Exception - { - String extension = getExtension(filename); - if (extension.equalsIgnoreCase("SHP")) - return loadShapefile(filename); - if (extension.equalsIgnoreCase("JML")) - return loadJMLFile(filename); - if (extension.equalsIgnoreCase("WKT")) - return loadWKT(filename); - throw new Exception("Unknown file type: " + extension); - } + static LayerManager manager = JUMPWorkbench.getInstance().getFrame() + .getContext().getLayerManager(); - public static FeatureCollection load(String filename, String zipFileName) - throws Exception - { - String extension = getExtension(filename); - if (extension.equalsIgnoreCase("SHP")) - return loadShapefile(filename, zipFileName); - throw new Exception("Unknown file type: " + extension); - } + private static String getExtension(String filename) { + int len = filename.length(); + return filename.substring(len - 3, len); + } - public static FeatureCollection loadJMLFile(String filename) - throws Exception - { - JMLReader rdr = new JMLReader(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - return rdr.read(dp); - } + public static FeatureCollection load(String filename) throws Exception { + String extension = getExtension(filename); + if (extension.equalsIgnoreCase("SHP")) + return loadShapefile(filename); + if (extension.equalsIgnoreCase("JML")) + return loadJMLFile(filename); + if (extension.equalsIgnoreCase("WKT")) + return loadWKT(filename); + throw new Exception("Unknown file type: " + extension); + } - public static FeatureCollection loadShapefile(String filename) - throws Exception - { - ShapefileReader rdr = new ShapefileReader(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - return rdr.read(dp); - } + public static FeatureCollection load(String filename, String zipFileName) + throws Exception { + String extension = getExtension(filename); + if (extension.equalsIgnoreCase("SHP")) + return loadShapefile(filename, zipFileName); + throw new Exception("Unknown file type: " + extension); + } - public static FeatureCollection loadShapefile(String filename, String zipFileName) - throws Exception - { - ShapefileReader rdr = new ShapefileReader(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - if (zipFileName != null) - dp.set(DataSource.COMPRESSED_KEY, zipFileName); - return rdr.read(dp); - } + public static FeatureCollection loadJMLFile(String filename) + throws Exception { + JMLReader rdr = new JMLReader(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + return rdr.read(dp); + } - public static FeatureCollection loadFMEGML(String filename) - throws Exception - { - FMEGMLReader rdr = new FMEGMLReader(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - return rdr.read(dp); - } + public static FeatureCollection loadShapefile(String filename) + throws Exception { + ShapefileReader rdr = new ShapefileReader(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + return rdr.read(dp); + } - public static FeatureCollection loadWKT(String filename) - throws Exception - { - WKTReader rdr = new WKTReader(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - FeatureCollection fc = rdr.read(dp); - return fc; - } + public static FeatureCollection loadShapefile(String filename, + String zipFileName) throws Exception { + ShapefileReader rdr = new ShapefileReader(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + if (zipFileName != null) + dp.set(DataSource.COMPRESSED_KEY, zipFileName); + return rdr.read(dp); + } - public static void save(FeatureCollection fc, String filename) - throws Exception - { - String extension = getExtension(filename); - if (extension.equalsIgnoreCase("SHP")) { - saveShapefile(fc, filename); - return; - } - else if (extension.equalsIgnoreCase("JML")) { - saveJMLFile(fc, filename); - return; - } - throw new Exception("Unknown file type: " + extension); - } + public static FeatureCollection loadFMEGML(String filename) + throws Exception { + FMEGMLReader rdr = new FMEGMLReader(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + return rdr.read(dp); + } - public static void saveShapefile(FeatureCollection fc, String filename) - throws Exception - { - ShapefileWriter writer = new ShapefileWriter(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - writer.write(fc, dp); - } - public static void saveJMLFile(FeatureCollection fc, String filename) - throws Exception - { - JMLWriter writer = new JMLWriter(); - DriverProperties dp = new DriverProperties(); - dp.set(DataSource.FILE_KEY, filename); - writer.write(fc, dp); - } - public static void print(FeatureCollection fc) - { - List featList = fc.getFeatures(); - for (Iterator i = featList.iterator(); i.hasNext(); ) { - Feature f = (Feature) i.next(); - System.out.println(f.getGeometry()); - } - } + public static FeatureCollection loadWKT(String filename) throws Exception { + WKTReader rdr = new WKTReader(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + FeatureCollection fc = rdr.read(dp); + return fc; + } + public static void save(FeatureCollection fc, String filename) + throws Exception { + String extension = getExtension(filename); + if (extension.equalsIgnoreCase("SHP")) { + saveShapefile(fc, filename); + return; + } else if (extension.equalsIgnoreCase("JML")) { + saveJMLFile(fc, filename); + return; + } + throw new Exception("Unknown file type: " + extension); + } + + public static void saveShapefile(FeatureCollection fc, String filename) + throws Exception { + ShapefileWriter writer = new ShapefileWriter(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + writer.write(fc, dp); + } + + public static void saveJMLFile(FeatureCollection fc, String filename) + throws Exception { + JMLWriter writer = new JMLWriter(); + DriverProperties dp = new DriverProperties(); + dp.set(DataSource.FILE_KEY, filename); + writer.write(fc, dp); + } + + public static void saveDbfFile(FeatureCollection fc, String filename) + + throws Exception { + final FeatureSchema fs = fc.getFeatureSchema(); + final DbfFieldDef[] fields = new DbfFieldDef[fs.getAttributeCount()]; + + // dbf column type and size + int f = 0; + + for (int t = 0; t < fs.getAttributeCount(); t++) { + final AttributeType columnType = fs.getAttributeType(t); + final String columnName = fs.getAttributeName(t); + + if (columnType == AttributeType.INTEGER) { + fields[f] = new DbfFieldDef(columnName, 'N', 16, 0); + f++; + } else if (columnType == AttributeType.DOUBLE) { + fields[f] = new DbfFieldDef(columnName, 'N', 33, 16); + f++; + } else if (columnType == AttributeType.STRING) { + final int maxlength = findMaxStringLength(fc, t); + fields[f] = new DbfFieldDef(columnName, 'C', maxlength, 0); + f++; + } else if (columnType == AttributeType.DATE) { + fields[f] = new DbfFieldDef(columnName, 'D', 8, 0); + f++; + } else if (columnType == AttributeType.BOOLEAN) { + fields[f] = new DbfFieldDef(columnName, 'L', 1, 0); + f++; + } else if (columnType == AttributeType.NUMERIC) { + final int maxlength = findMaxStringLength(fc, t); + fields[f] = new DbfFieldDef(columnName, 'C', maxlength, 0); + f++; + } else if (columnType == AttributeType.TIMESTAMP) { + fields[f] = new DbfFieldDef(columnName, '@', 8, 0); + f++; + } else if (columnType == AttributeType.LONG) { + final int maxlength = findMaxStringLength(fc, t); + fields[f] = new DbfFieldDef(columnName, 'C', maxlength, 0); + f++; + } else if (columnType == AttributeType.FLOAT) { + fields[f] = new DbfFieldDef(columnName, 'I', 4, 0); + f++; + } else { + final int maxlength = findMaxStringLength(fc, t); + fields[f] = new DbfFieldDef(columnName, 'C', maxlength, 0); + f++; + } + } + // write header + final DbfFileWriter dbf = new DbfFileWriter(filename); + dbf.writeHeader(fields, fc.size()); + + // write rows + final int num = fc.size(); + + final List<Feature> features = fc.getFeatures(); + + for (int t = 0; t < num; t++) { + final Feature feature = features.get(t); + final Vector<Object> DBFrow = new Vector<Object>(); + // make data for each column in this feature (row) + for (int u = 0; u < fs.getAttributeCount(); u++) { + final AttributeType columnType = fs.getAttributeType(u); + + if (columnType == AttributeType.INTEGER) { + final Object a = feature.getAttribute(u); + + if (a == null) { + DBFrow.add(new Integer(0)); + } else { + DBFrow.add(a); + } + } else if (columnType == AttributeType.DOUBLE) { + final Object a = feature.getAttribute(u); + + if (a == null) { + DBFrow.add(new Double(0.0)); + } else { + DBFrow.add(a); + } + } else if (columnType == AttributeType.FLOAT) { + final Object a = feature.getAttribute(u); + + if (a == null) { + DBFrow.add(new Float(0.0)); + } else { + DBFrow.add(a); + } + } else if (columnType == AttributeType.BOOLEAN) { + final Object a = feature.getAttribute(u); + if (a == null) { + DBFrow.add(new Boolean(false)); + } else { + DBFrow.add(a); + } + } else if (columnType == AttributeType.TIMESTAMP) { + final Object a = feature.getAttribute(u); + if (a == null) { + DBFrow.add(new String("")); + } else { + DBFrow.add(a); + } + } + + else if (columnType == AttributeType.DATE) { + final Object a = feature.getAttribute(u); + if (a == null) { + DBFrow.add(""); + } else { + DBFrow.add(DbfFile.DATE_PARSER.format((Date) a)); + } + } else if (columnType == AttributeType.STRING + || columnType == AttributeType.NUMERIC + || columnType == AttributeType.LONG) { + final Object a = feature.getAttribute(u); + + if (a == null) { + DBFrow.add(new String("")); + } else { + // MD 16 jan 03 - added some defensive programming + if (a instanceof String) { + DBFrow.add(a); + } else { + DBFrow.add(a.toString()); + } + } + } + } + + dbf.writeRecord(DBFrow); + } + + dbf.close(); + + } + + public static void saveShapefile(Layer layer, String filename) + throws Exception { + DataSourceQuery dsq = layer.getDataSourceQuery(); + DriverProperties dp = new DriverProperties(); + Object charsetName = dsq.getDataSource().getProperties().get("charset"); + if (charsetName != null) + dp.set("charset", charsetName.toString()); + (new ShapefileWriter()).write(layer.getFeatureCollectionWrapper(), dp); + dp.set("File", filename); + (new ShapefileWriter()).write(layer.getFeatureCollectionWrapper(), dp); + } + + public static void saveJMLFile(Layer layer, String filename) + throws Exception { + DataSourceQuery dsq = layer.getDataSourceQuery(); + DriverProperties dp = new DriverProperties(); + Object charsetName = dsq.getDataSource().getProperties().get("charset"); + if (charsetName != null) + dp.set("charset", charsetName.toString()); + (new JMLWriter()).write(layer.getFeatureCollectionWrapper(), dp); + dp.set("File", filename); + (new JMLWriter()).write(layer.getFeatureCollectionWrapper(), dp); + } + + /** + * look at all the data in the column of the featurecollection, and find the + * largest string! + * + * @param fc + * features to look at + * @param attributeNumber + * which of the column to test. + */ + static int findMaxStringLength(final FeatureCollection fc, + final int attributeNumber) { + int l; + int maxlen = 0; + Feature f; + + for (final Iterator i = fc.iterator(); i.hasNext();) { + f = (Feature) i.next(); + l = f.getString(attributeNumber).length(); + + if (l > maxlen) { + maxlen = l; + } + } + + return maxlen; + } + + /* + * This method derives from + * de.latlon.deejump.plugin.style.LayerStyle2SLDPlugIn.class and it has been + * modified to automatically export SLD files for vectors + */ + + public static void saveStyleToFile(Layer layer, String path) + throws Exception { + double internalScale = 1d / JUMPWorkbench.getInstance().getFrame() + .getContext().getLayerViewPanel().getViewport().getScale(); + double realScale = ScreenScale.getHorizontalMapScale(JUMPWorkbench + .getInstance().getFrame().getContext().getLayerViewPanel() + .getViewport()); + double scaleFactor = internalScale / realScale; + String outSLD = manager.uniqueLayerName(layer.getName() + ".sld"); + + File sld_outFile = new File(path.concat(File.separator).concat(outSLD)); + File inputXML = File.createTempFile("temptask", ".xml"); + inputXML.deleteOnExit(); + String name = layer.getName(); + // TODO don't assume has 1 item!!! + // Should create this condition in EnableCheckFactory + if (layer.getFeatureCollectionWrapper().getFeatures().size() == 0) { + throw new Exception( + I18N.get("org.openjump.core.ui.plugin.tools.statistics.StatisticOverViewPlugIn.Selected-layer-is-empty")); + } + BasicFeature bf = (BasicFeature) layer.getFeatureCollectionWrapper() + .getFeatures().get(0); + Geometry geo = bf.getGeometry(); + String geoType = geo.getGeometryType(); + Java2XML java2Xml = new Java2XML(); + java2Xml.write(layer, "layer", inputXML); + FileInputStream input = new FileInputStream(inputXML); + // FileWriter fw = new FileWriter( outputXML ); + OutputStreamWriter fw = new OutputStreamWriter(new FileOutputStream( + sld_outFile), Charset.defaultCharset()); + // "UTF-8"); + HashMap<String, String> map = new HashMap<String, String>(9); + map.put("wmsLayerName", name); + map.put("featureTypeStyle", name); + map.put("styleName", name); + map.put("styleTitle", name); + map.put("geoType", geoType); + map.put("geomProperty", I18N + .get("deejump.pluging.style.LayerStyle2SLDPlugIn.geomProperty")); + map.put("Namespace", "http://www.deegree.org/app"); + // map.put("NamespacePrefix", prefix + ":"); + // map.put("NamespacePrefixWithoutColon", prefix); + // ATENTION : note that min and max are swapped in JUMP!!! + // will swap later, in transformContext + Double d = layer.getMinScale(); + d = d != null ? d : new Double(0); + map.put("minScale", + "" + + LayerStyle2SLDPlugIn.toRealWorldScale(scaleFactor, + d.doubleValue())); + // using Double.MAX_VALUE is creating a large number - too many 0's + // make it simple and hardcode a large number + final double largeNumber = 99999999999d; + d = layer.getMaxScale(); + d = d != null ? d : new Double(largeNumber); + map.put("maxScale", + "" + + LayerStyle2SLDPlugIn.toRealWorldScale(scaleFactor, + d.doubleValue())); + fw.write(LayerStyle2SLDPlugIn.transformContext(input, map)); + fw.close(); + } + + public static void print(FeatureCollection fc) { + List featList = fc.getFeatures(); + for (Iterator i = featList.iterator(); i.hasNext();) { + Feature f = (Feature) i.next(); + System.out.println(f.getGeometry()); + } + } + } ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel