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) {

Java代码  

  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) {

Java代码  

  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为例:

Java代码  

  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文件(图形信息+属性信息)的写法:

Java代码  

  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. }

二、读图形信息

Java代码  

  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文件

Java代码  

  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文件

Java代码  

  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文件

Java代码  

  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. }

JAVA用geotools读写shape格式文件

时间: 2024-10-12 15:21:50

JAVA用geotools读写shape格式文件的相关文章

Python怎么读写json格式文件

JSON-是一个轻量级的数据交换格式.点击打开百度百科 JSON维基百科:http://zh.wikipedia.org/wiki/JSON json模块 关于json的官方文档:点击打开链接 本文由@The_Third_Wave(Blog地址:http://blog.csdn.net/zhanh1218)原创.不定期更新,有错误请指正. Sina微博关注:@The_Third_Wave 如果这篇博文对您有帮助,为了好的网络环境,不建议转载,建议收藏!如果您一定要转载,请带上后缀和本文地址. d

如何用python读写CSV 格式文件

工作中经常会碰到读写CSV文件的情况.记录下,方便自己以后查询并与大家一起分享: 写CSV文件方法一: import csv          #导入CSV with open("D:\egg.csv","wb") as csvfile       #新建一个叫egg.csv"的文件在D盘. a=csv.writer(csvfile)                                    #以CSV的格式 写数据到文件CSVFILE中. a

&lt;转&gt;Matlab读写TIFF格式文件

1.简介 通常情况下,使用MATLAB做图像处理后,使用下面的命令就可以保存处理结果为图片. imwrite(im,'im.bmp'); 而如果需要保存的图像为single或者double类型,或保存的图像超过RGB三个通道时,则不能使用imwrite来直接进行,此时需要将矩阵保存为TIFF格式的图片. matlab支持LibTIFF库作为TIFF图像读写的工具,因此只要学习如果使用LibTIFF提供的matlab接口就可以完成TIFF图像的读写任务. 使用TIFF保存图像时使用的详细的TAG信

Java生成和解析XML格式文件和字符串的实例代码

1.基础知识:Java解析XML一般有四种方法:DOM.SAX.JDOM.DOM4J. 2.使用介绍1).DOM(1)简介 由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作.优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作:缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理. (2)示例代码: 1.基础知识:Java解析XML一般有四种方法:DOM.SAX.JDOM.DO

java FileReader/FileWriter读写文件

java FileReader/FileWriter读写字母和数字没问题,但读写汉字就乱码.记录下,后面找到解决方法再补上. public static void main(String[] args) { FileReader fr = null; FileWriter fw = null; try { int a = 0; fr = new FileReader("c:/a.txt");//读取目标 fw = new FileWriter("c:/b.txt")

java byte【】数组与文件读写(增加新功能)

今天在测试直接写的文章: java byte[]数组与文件读写 时,想调用FileHelper类对字节数组以追加的方式写文件,结果无论怎样竟然数据录入不全,重新看了下文件的追加模式,提供了两种方式: 方式一: 字节数组写入文件(不追加) //将byte数组写入文件 public void createFile(String path, byte[] content) throws IOException { FileOutputStream fos = new FileOutputStream(

Java知多少(72)文件的随机读写

Java.io 包提供了 RandomAccessFile 类用于随机文件的创建和访问.使用这个类,可以跳转到文件的任意位置读写数据.程序可以在随机文件中插入数据,而不会破坏该文件的其他数据.此外,程序也可以更新或删除先前存储的数据,而不用重写整个文件. RandomAccessFile类是Object类的直接子类,包含两个主要的构造方法用来创 建RandomAccessFile 的对象,如表 10-11 所示. 表 10-11 RandomAccessFile 类的构造方法 构造方法 功能描述

ubuntu下用java代码调用命令将java格式文件转换为html格式文件

首先我们应该在电脑上装上GNU Source-highlight 3.1.7,给个链接参考: http://www.gnu.org/software/src-highlite/#mozTocId120994 下面代码实现了 将java类型的代码转换为html文件类型的代码,如果java代码的文件名为 helloword.java,则转换为html格式的文件名为helloword.java.html,将java代码在浏览器上显示出来.其次我还将html文件中的内容提取出来,便于在html文件里编写

SpringBatch Sample (四)(固定长格式文件读写)

前篇关于Spring Batch的文章,讲述了Spring Batch 对XML文件的读写操作. 本文将通过一个完整的实例,与大家一起讨论运用Spring Batch对固定长格式文件的读写操作.实例延续前面的例子,读取一个含有四个字段的TXT文件(ID,Name,Age,Score),对读取的字段做简单的处理,然后输出到另外一个TXT文件中. 工程结构如下图: applicationContext.xml和log4j.xml前文已经叙述过,在此不做赘述. 本文核心配置文件batch.xml内容如