JAVA用geotools读写shape格式文件

时间:2023-03-08 20:43:26
JAVA用geotools读写shape格式文件

转自:http://toplchx.iteye.com/blog/1335007

JAVA用geotools读写shape格式文件 (对应geotools版本:2.7.2)

(后面添加对应geotools 10.0版本的写法)

读shape文件。

shape格式文件最少包含3个文件,他们的后缀是:.shp, .dbf, .shx。

.shp存储地理形状和位置信息,.dbf存储属性信息,.shx是索引文件。

单独读取DBF文件

public void readDBF(String path) {

  1. DbaseFileReader reader = null;
  2. try {
  3. reader = new DbaseFileReader(new ShpFiles(path), false, Charset.forName("GBK"));
  4. DbaseFileHeader header = reader.getHeader();
  5. int numFields = header.getNumFields();
  6. //迭代读取记录
  7. while (reader.hasNext()) {
  8. try {
  9. Object[] entry = reader.readEntry();
  10. for (int i=0; i<numFields; i++) {
  11. String title = header.getFieldName(i);
  12. Object value = entry[i];
  13. System.out.println(title+"="+value);
  14. }
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. } finally {
  22. if (reader != null) {
  23. //关闭
  24. try {reader.close();} catch (Exception e) {}
  25. }
  26. }
  27. }

读取3个文件,以point为例:

public void readSHP(String path) {

  1. ShapefileDataStore shpDataStore = null;
  2. try{
  3. shpDataStore = new ShapefileDataStore(new File(path).toURI().toURL());
  4. shpDataStore.setStringCharset(Charset.forName("GBK"));
  5. String typeName = shpDataStore.getTypeNames()[0];
  6. FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = null;
  7. featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>)shpDataStore.getFeatureSource(typeName);
  8. FeatureCollection<SimpleFeatureType, SimpleFeature> result = featureSource.getFeatures();
  9. System.out.println(result.size());
  10. FeatureIterator<SimpleFeature> itertor = result.features();
  11. while(itertor.hasNext()){
  12. SimpleFeature feature = itertor.next();
  13. Collection<Property> p = feature.getProperties();
  14. Iterator<Property> it = p.iterator();
  15. while(it.hasNext()) {
  16. Property pro = it.next();
  17. if (pro.getValue() instanceof Point) {
  18. System.out.println("PointX = " + ((Point)(pro.getValue())).getX());
  19. System.out.println("PointY = " + ((Point)(pro.getValue())).getY());
  20. } else {
  21. System.out.println(pro.getName() + " = " + pro.getValue());
  22. }
  23. }
  24. }
  25. itertor.close();
  26. } catch (MalformedURLException e) {
  27. e.printStackTrace();
  28. } catch(IOException e) { e.printStackTrace(); }
  29. }

写shape文件,以point为例:

  1. public static void main(String[] args) {
  2. try{
  3. //定义属性
  4. final SimpleFeatureType TYPE = DataUtilities.createType("Location",
  5. "location:Point," + // <- the geometry attribute: Point type
  6. "POIID:String," + // <- a String attribute
  7. "MESHID:String," + // a number attribute
  8. "OWNER:String"
  9. );
  10. SimpleFeatureCollection collection = FeatureCollections.newCollection();
  11. GeometryFactory geometryFactory = new GeometryFactory();
  12. SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
  13. double latitude = Double.parseDouble("116.123456789");
  14. double longitude = Double.parseDouble("39.120001");
  15. String POIID = "2050003092";
  16. String MESHID = "0";
  17. String OWNER = "340881";
  18. /* Longitude (= x coord) first ! */
  19. Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
  20. Object[] obj = {point, POIID, MESHID, OWNER};
  21. SimpleFeature feature = featureBuilder.buildFeature(null, obj);
  22. collection.add(feature);
  23. feature = featureBuilder.buildFeature(null, obj);
  24. collection.add(feature);
  25. File newFile = new File("D:/newPoi.shp");
  26. ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
  27. Map<String, Serializable> params = new HashMap<String, Serializable>();
  28. params.put("url", newFile.toURI().toURL());
  29. params.put("create spatial index", Boolean.TRUE);
  30. ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
  31. newDataStore.createSchema(TYPE);
  32. newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);
  33. Transaction transaction = new DefaultTransaction("create");
  34. String typeName = newDataStore.getTypeNames()[0];
  35. SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
  36. if (featureSource instanceof SimpleFeatureStore) {
  37. SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
  38. featureStore.setTransaction(transaction);
  39. try {
  40. featureStore.addFeatures(collection);
  41. transaction.commit();
  42. } catch (Exception problem) {
  43. problem.printStackTrace();
  44. transaction.rollback();
  45. } finally {
  46. transaction.close();
  47. }
  48. } else {
  49. System.out.println(typeName + " does not support read/write access");
  50. }
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }
  54. }

以下代码对应geotools10.0版本

一、读shp文件(图形信息+属性信息)的写法:

  1. import java.io.File;
  2. import java.nio.charset.Charset;
  3. import java.util.Iterator;
  4. import org.geotools.data.shapefile.ShapefileDataStore;
  5. import org.geotools.data.shapefile.ShapefileDataStoreFactory;
  6. import org.geotools.data.simple.SimpleFeatureIterator;
  7. import org.geotools.data.simple.SimpleFeatureSource;
  8. import org.opengis.feature.Property;
  9. import org.opengis.feature.simple.SimpleFeature;
  10. public class ShpNew {
  11. public static void main(String[] args) {
  12. ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
  13. try {
  14. ShapefileDataStore sds = (ShapefileDataStore)dataStoreFactory.createDataStore(new File("D:\\work\\shpdir\\Poi.shp").toURI().toURL());
  15. sds.setCharset(Charset.forName("GBK"));
  16. SimpleFeatureSource featureSource = sds.getFeatureSource();
  17. SimpleFeatureIterator itertor = featureSource.getFeatures().features();
  18. while(itertor.hasNext()) {
  19. SimpleFeature feature = itertor.next();
  20. Iterator<Property> it = feature.getProperties().iterator();
  21. while(it.hasNext()) {
  22. Property pro = it.next();
  23. System.out.println(pro);
  24. }
  25. }
  26. itertor.close();
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }

二、读图形信息

  1. try {
  2. ShpFiles sf = new ShpFiles("D:\\Poi.shp");
  3. ShapefileReader r = new ShapefileReader( sf, false, false, new GeometryFactory() );
  4. while (r.hasNext()) {
  5. Geometry shape = (Geometry) r.nextRecord().shape();  //com.vividsolutions.jts.geom.Geometry;
  6. System.out.println(shape.toString());
  7. }
  8. r.close();
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }

三、读dbf文件

  1. public void readDBF() {
  2. try {
  3. FileChannel in = new FileInputStream("D:\\Poi.dbf").getChannel();
  4. DbaseFileReader dbfReader =  new DbaseFileReader(in, false,  Charset.forName("GBK"));
  5. DbaseFileHeader header = dbfReader.getHeader();
  6. int fields = header.getNumFields();
  7. while ( dbfReader.hasNext() ){
  8. DbaseFileReader.Row row =  dbfReader.readRow();
  9. //              System.out.println(row.toString());
  10. for (int i=0; i<fields; i++) {
  11. System.out.println(header.getFieldName(i) + " : " + row.read(i));
  12. }
  13. }
  14. dbfReader.close();
  15. in.close();
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }

四、写shape文件

  1. public void write(String filepath) {
  2. try {
  3. //创建shape文件对象
  4. File file = new File(filepath);
  5. Map<String, Serializable> params = new HashMap<String, Serializable>();
  6. params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );
  7. ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
  8. //定义图形信息和属性信息
  9. SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
  10. tb.setCRS(DefaultGeographicCRS.WGS84);
  11. tb.setName("shapefile");
  12. tb.add("the_geom", Point.class);
  13. tb.add("POIID", Long.class);
  14. tb.add("NAMEC", String.class);
  15. ds.createSchema(tb.buildFeatureType());
  16. ds.setCharset(Charset.forName("GBK"));
  17. //设置Writer
  18. FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
  19. //写下一条
  20. SimpleFeature feature = writer.next();
  21. feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.123, 39.345)));
  22. feature.setAttribute("POIID", 1234567890l);
  23. feature.setAttribute("NAMEC", "某兴趣点1");
  24. feature = writer.next();
  25. feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.456, 39.678)));
  26. feature.setAttribute("POIID", 1234567891l);
  27. feature.setAttribute("NAMEC", "某兴趣点2");
  28. writer.write();
  29. writer.close();
  30. ds.dispose();
  31. //读取刚写完shape文件的图形信息
  32. ShpFiles shpFiles = new ShpFiles(filepath);
  33. ShapefileReader reader = new ShapefileReader(shpFiles, false, true, new GeometryFactory(), false);
  34. try {
  35. while (reader.hasNext()) {
  36. System.out.println(reader.nextRecord().shape());
  37. }
  38. } finally {
  39. reader.close();
  40. }
  41. } catch (Exception e) { }
  42. }

五、由源shape文件创建新的shape文件

  1. public void transShape(String srcfilepath, String destfilepath) {
  2. try {
  3. //源shape文件
  4. ShapefileDataStore shapeDS = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(new File(srcfilepath).toURI().toURL());
  5. //创建目标shape文件对象
  6. Map<String, Serializable> params = new HashMap<String, Serializable>();
  7. FileDataStoreFactorySpi factory = new ShapefileDataStoreFactory();
  8. params.put(ShapefileDataStoreFactory.URLP.key, new File(destfilepath).toURI().toURL());
  9. ShapefileDataStore ds = (ShapefileDataStore) factory.createNewDataStore(params);
  10. // 设置属性
  11. SimpleFeatureSource fs = shapeDS.getFeatureSource(shapeDS.getTypeNames()[0]);
  12. //下面这行还有其他写法,根据源shape文件的simpleFeatureType可以不用retype,而直接用fs.getSchema设置
  13. ds.createSchema(SimpleFeatureTypeBuilder.retype(fs.getSchema(), DefaultGeographicCRS.WGS84));
  14. //设置writer
  15. FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
  16. //写记录
  17. SimpleFeatureIterator it = fs.getFeatures().features();
  18. try {
  19. while (it.hasNext()) {
  20. SimpleFeature f = it.next();
  21. SimpleFeature fNew = writer.next();
  22. fNew.setAttributes(f.getAttributes());
  23. writer.write();
  24. }
  25. } finally {
  26. it.close();
  27. }
  28. writer.close();
  29. ds.dispose();
  30. shapeDS.dispose();
  31. } catch (Exception e) { e.printStackTrace();    }
  32. }