/* GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2010-2014, Open Source Geospatial Foundation (OSGeo) * * This file is hereby placed into the Public Domain. This means anyone is * free to do whatever they wish with this file. Use it well and enjoy! */ package org.geotools.tutorial.csv2; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.geotools.data.Query; import org.geotools.data.store.ContentDataStore; import org.geotools.data.store.ContentEntry; import org.geotools.data.store.ContentFeatureSource; import org.geotools.feature.NameImpl; import org.geotools.referencing.CRS; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.feature.type.AttributeDescriptor; import org.opengis.feature.type.GeometryDescriptor; import org.opengis.feature.type.Name; import com.csvreader.CsvReader; import com.csvreader.CsvWriter; import com.vividsolutions.jts.geom.Point; /** * DataStore for Comma Separated Value (CSV) files. * * @author Jody Garnett (Boundless) */ public class CSVDataStore extends ContentDataStore { // header end // constructor start File file; public CSVDataStore( File file ){ this.file = file; } // constructor end // reader start /** * Allow read access to file; for our package visible "friends". * Please close the reader when done. * @return CsvReader for file */ CsvReader read() throws IOException { Reader reader = new FileReader(file); CsvReader csvReader = new CsvReader(reader); return csvReader; } // reader end // createTypeNames start protected List<Name> createTypeNames() throws IOException { String name = file.getName(); name = name.substring(0, name.lastIndexOf('.')); Name typeName = new NameImpl( name ); return Collections.singletonList(typeName); } // createTypeNames end // createSchema start @Override public void createSchema(SimpleFeatureType featureType) throws IOException { List<String> header = new ArrayList<>(); GeometryDescriptor geometryDescrptor = featureType.getGeometryDescriptor(); if (geometryDescrptor != null && CRS.equalsIgnoreMetadata(DefaultGeographicCRS.WGS84, geometryDescrptor.getCoordinateReferenceSystem()) && geometryDescrptor.getType().getBinding().isAssignableFrom(Point.class)) { header.add("LAT"); header.add("LON"); } else { throw new IOException("Unable use LAT/LON to represent " + geometryDescrptor); } for (AttributeDescriptor descriptor : featureType.getAttributeDescriptors()) { if (descriptor instanceof GeometryDescriptor) continue; header.add(descriptor.getLocalName()); } // Write out header, producing an empty file of the correct type CsvWriter writer = new CsvWriter(new FileWriter(file),','); try { writer.writeRecord( header.toArray(new String[header.size()])); } finally { writer.close(); } } // createSchema end // createFeatureSource start @Override protected ContentFeatureSource createFeatureSource(ContentEntry entry) throws IOException { if (file.canWrite()) { return new CSVFeatureStore(entry, Query.ALL); } else { return new CSVFeatureSource(entry, Query.ALL); } } // createFeatureSource end }