转自: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. }

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

  1. JAVA用geotools读取shape格式文件

    Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性.但这种格式没法存储地理数据的拓扑信息. 其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是". ...

  2. 使用Spark读写CSV格式文件(转)

    原文链接:使用Spark读写CSV格式文件 CSV格式的文件也称为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号.在本文中的CSV格 ...

  3. Java使用Geotools读取shape矢量数据

    作为GIS开发者而言,矢量数据是我们经常要用到的,而shape数据是矢量数据中最常用的格式,因此解析shape数据也是作为GIS软件开发人员必备的基础技能,而GeoTools无疑是Java最好用来处理 ...

  4. java 调用OpenOffice将word格式文件转换为pdf格式

    一:环境搭建 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/projects/jo ...

  5. 如何用python读写CSV 格式文件

    工作中经常会碰到读写CSV文件的情况.记录下,方便自己以后查询并与大家一起分享: 写CSV文件方法一: import csv          #导入CSV with open("D:\eg ...

  6. python利用lxml读写xml格式文件

    之前在转换数据集格式的时候需要将json转换到xml文件,用lxml包进行操作非常方便. 1. 写xml文件 a) 用etree和objectify from lxml import etree, o ...

  7. java使用jdom生成xml格式文件

    本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...

  8. 使用csv模块读写csv格式文件

    import csv class HandleCsv: ''' csv文件处理类 ''' def __init__(self, filename): ''' 构造器 :param filename: ...

  9. 使用JAVA读写Properties属性文件

     使用JAVA读写Properties属性文件 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数 ...

随机推荐

  1. java编程思想,对象导论

    程序设计的本质就是使用编程语言解决某一类具体问题.对问题的定义叫建模,例如定义问题域中的各种名词,动作,结果等.针对具体的问题提出的解决方案叫算法. 面向对象程序设计的挑战之一,就是在问题空间的元素和 ...

  2. python 自动化之路 day 02

    本节内容: 列表.元组操作 字符串操作 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Alex',&qu ...

  3. ubuntn svn 安装 配置

    参考文章  http://zhan.renren.com/itbegin?gid=3602888498033631485&checked=true 上面的文章说得很详细 sudo apt-ge ...

  4. jQuery学习教程(2)

    由于一件事情打断了我的生活节奏,每天都学习都在托托拉拉,导致很多进度都没有达到自己预期的效果 在上一个章节我学到了环境的搭建,以及对jquery的熟悉.现在开始对其具体进行熟悉了. 一.如何使用选择器 ...

  5. 测试网站是共享还是独立ip

    查看是共享还是独立:http://www.yougetsignal.com/tools/web-sites-on-web-server/ 站长工具:http://tool.webmasterhome. ...

  6. CSS三角形广告文字

    街上经常碰到一些发各类广告传单的,有一次收到一张房地产广告的传单,顺手留下来,看着里面有些广告挺吸引人,同时也想练练自己css技术,故抽空做了一下. 原图某区域如下: 实现上图效果是需要一些想象力的, ...

  7. php练习3——猜拳游戏,评委打分问题

    用户与计算机猜拳 程序caiQuan.html和caiQuan.php: 结果: 评委打分问题,去掉一个最低分和最高分,求平均分,并找出最低分和最高分对应第几个评委,    再找出最佳评委(打分最接近 ...

  8. 如何查看MySQL中每张表占用的空间大小

    如题,找到MySQL中的information_schema表,这张表记录了所有数据库中表的信息,主要字段含义如下: TABLE_SCHEMA : 数据库名 TABLE_NAME:表名 ENGINE: ...

  9. [转载]如何重装Grub,使其可以引导双系统

    引言: GRUB是一个多重操作系统的启动管理器.用来引导不同的系统,如windows,Linux.一般来说要先装Windows,后装Linux,这样grub才能生效(grub存在于linux的安装中) ...

  10. C的快速趋向实验 -->

    今天刚学到C的一个新玩法,非常有意思,叫趋向于,写作“-->”,比如说如果要实现一个倒数的程序,我们可以定义一个变量 counter,然后让它趋向于0... #include <stdio ...