Hi all, I try to learn how to create a shapefile with Geotools following Csv2Shape tutorial [1].
Most of the code (below) is exactly the same as the tutorial code. I used the csv file as suggested in the tutorial [2]. I just : 1) changed the line "SimpleFeatureCollection collection = FeatureCollections.newCollection();" by "SimpleFeatureCollection collection = new DefaultFeatureCollection(null,null);" because FeatureCollections seems deprecated. 2) add a dependency to the pom.xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-epsg-hsql</artifactId> <version>${geotools.version}</version> </dependency> *Problem* : the created shapefile does not seem to have geometries : - when I print the shapefile in QGIS or using the QuickStart application, it's empty. - the code above try to print the attributes of the SimpleFeatures of the shapefile, the result is : [null, Cape Town, 550] [null, Victoria, 721] [null, Lausanne, 560] [null, Minneapolis, 350] [null, Ottawa, 200] [null, Bangkok, 150] [null, St Paul, 125] [null, Trento, 140] + I don't understand why the last line of the Main System.out.println("This sentence doesn't print ..."); does not print ... Hope somebody here can help me again, thank you ! *Code* import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import org.geotools.styling.Style; import org.geotools.data.DataUtilities; import org.geotools.data.DefaultTransaction; import org.geotools.data.FileDataStore; import org.geotools.data.FileDataStoreFinder; import org.geotools.data.Transaction; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.data.shapefile.ShapefileDataStoreFactory; import org.geotools.data.simple.SimpleFeatureCollection; import org.geotools.data.simple.SimpleFeatureSource; import org.geotools.data.simple.SimpleFeatureStore; import org.geotools.feature.DefaultFeatureCollection; import org.geotools.feature.FeatureIterator; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.geometry.jts.JTSFactoryFinder; import org.geotools.map.FeatureLayer; import org.geotools.map.Layer; import org.geotools.map.MapContent; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.swing.JMapFrame; import org.geotools.swing.data.JFileDataStoreChooser; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.Point; import org.geotools.styling.SLD; /** * This example reads data for point locations and associated attributes from a comma separated text * (CSV) file and exports them as a new shapefile. It illustrates how to build a feature type. * <p> * Note: to keep things simple in the code below the input file should not have additional spaces or * tabs between fields. */ public class Csv2Shape { public static void main(String[] args) throws Exception { File file = JFileDataStoreChooser.showOpenFile("csv", null); if (file == null) { return; } /* * We use the DataUtilities class to create a FeatureType that will describe the data in our * shapefile. * * See also the createFeatureType method below for another, more flexible approach. */ final SimpleFeatureType TYPE = DataUtilities.createType("Location", "location:Point:srid=4326," + // <- the geometry attribute: Point type "name:String," + // <- a String attribute "number:Integer" // a number attribute ); /* * We create a FeatureCollection into which we will put each Feature created from a record * in the input csv data file */ SimpleFeatureCollection collection = new DefaultFeatureCollection(null,null); /* * GeometryFactory will be used to create the geometry attribute of each feature (a Point * object for the location) */ GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE); BufferedReader reader = new BufferedReader(new FileReader(file)); try { /* First line of the data file is the header */ String line = reader.readLine(); System.out.println("Header: " + line); for (line = reader.readLine(); line != null; line = reader.readLine()) { if (line.trim().length() > 0) { // skip blank lines String tokens[] = line.split("\\,"); double latitude = Double.parseDouble(tokens[0]); System.out.println("latitude : " + latitude); double longitude = Double.parseDouble(tokens[1]); System.out.println("longitude : " + longitude); String name = tokens[2].trim(); int number = Integer.parseInt(tokens[3].trim()); /* Longitude (= x coord) first ! */ Coordinate coord = new Coordinate(longitude, latitude); Point point = geometryFactory.createPoint(coord); featureBuilder.add(point); featureBuilder.add(name); featureBuilder.add(number); SimpleFeature feature = featureBuilder.buildFeature(null); ((DefaultFeatureCollection) collection).add(feature); } } } finally { reader.close(); } /* * Get an output file name and create the new shapefile */ File newFile = getNewShapeFile(file); ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory(); Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put("url", newFile.toURI().toURL()); params.put("create spatial index", Boolean.TRUE); ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params); newDataStore.createSchema(TYPE); /* * You can comment out this line if you are using the createFeatureType method (at end of * class file) rather than DataUtilities.createType */ newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84); /* * Write the features to the shapefile */ Transaction transaction = new DefaultTransaction("create"); String typeName = newDataStore.getTypeNames()[0]; SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName); if (featureSource instanceof SimpleFeatureStore) { SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource; featureStore.setTransaction(transaction); try { featureStore.addFeatures(collection); transaction.commit(); FeatureIterator featuresIte = featureStore.getFeatures().features(); featuresIte.next(); //on saute la première ligne déjà traitée dans l'initialisation while (featuresIte.hasNext()) { System.out.println(((SimpleFeature) featuresIte.next()).getAttributes()); } } catch (Exception problem) { problem.printStackTrace(); transaction.rollback(); } finally { transaction.close(); } System.exit(0); // success! } else { System.out.println(typeName + " does not support read/write access"); System.exit(1); } System.out.println("This sentence doesn't print ..."); } /** * Prompt the user for the name and path to use for the output shapefile * * @param csvFile * the input csv file used to create a default shapefile name * * @return name and path for the shapefile as a new File object */ private static File getNewShapeFile(File csvFile) { String path = csvFile.getAbsolutePath(); String newPath = path.substring(0, path.length() - 4) + ".shp"; JFileDataStoreChooser chooser = new JFileDataStoreChooser("shp"); chooser.setDialogTitle("Save shapefile"); chooser.setSelectedFile(new File(newPath)); int returnVal = chooser.showSaveDialog(null); if (returnVal != JFileDataStoreChooser.APPROVE_OPTION) { // the user cancelled the dialog System.exit(0); } File newFile = chooser.getSelectedFile(); if (newFile.equals(csvFile)) { System.out.println("Error: cannot replace " + csvFile); System.exit(0); } return newFile; } } [1] http://docs.geotools.org/stable/tutorials/feature/csv2shp.html [2] http://docs.geotools.org/stable/tutorials/_downloads/locations1.csv ------------------------------------------------------------------------------ _______________________________________________ GeoTools-GT2-Users mailing list GeoTools-GT2-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users