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) {
- DbaseFileReader reader = null;
- try {
- reader = new DbaseFileReader(new ShpFiles(path), false, Charset.forName("GBK"));
- DbaseFileHeader header = reader.getHeader();
- int numFields = header.getNumFields();
- //迭代读取记录
- while (reader.hasNext()) {
- try {
- Object[] entry = reader.readEntry();
- for (int i=0; i<numFields; i++) {
- String title = header.getFieldName(i);
- Object value = entry[i];
- System.out.println(title+"="+value);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (reader != null) {
- //关闭
- try {reader.close();} catch (Exception e) {}
- }
- }
- }
读取3个文件,以point为例:
public void readSHP(String path) {
- ShapefileDataStore shpDataStore = null;
- try{
- shpDataStore = new ShapefileDataStore(new File(path).toURI().toURL());
- shpDataStore.setStringCharset(Charset.forName("GBK"));
- String typeName = shpDataStore.getTypeNames()[0];
- FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = null;
- featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>)shpDataStore.getFeatureSource(typeName);
- FeatureCollection<SimpleFeatureType, SimpleFeature> result = featureSource.getFeatures();
- System.out.println(result.size());
- FeatureIterator<SimpleFeature> itertor = result.features();
- while(itertor.hasNext()){
- SimpleFeature feature = itertor.next();
- Collection<Property> p = feature.getProperties();
- Iterator<Property> it = p.iterator();
- while(it.hasNext()) {
- Property pro = it.next();
- if (pro.getValue() instanceof Point) {
- System.out.println("PointX = " + ((Point)(pro.getValue())).getX());
- System.out.println("PointY = " + ((Point)(pro.getValue())).getY());
- } else {
- System.out.println(pro.getName() + " = " + pro.getValue());
- }
- }
- }
- itertor.close();
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch(IOException e) { e.printStackTrace(); }
- }
写shape文件,以point为例:
- public static void main(String[] args) {
- try{
- //定义属性
- final SimpleFeatureType TYPE = DataUtilities.createType("Location",
- "location:Point," + // <- the geometry attribute: Point type
- "POIID:String," + // <- a String attribute
- "MESHID:String," + // a number attribute
- "OWNER:String"
- );
- SimpleFeatureCollection collection = FeatureCollections.newCollection();
- GeometryFactory geometryFactory = new GeometryFactory();
- SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
- double latitude = Double.parseDouble("116.123456789");
- double longitude = Double.parseDouble("39.120001");
- String POIID = "2050003092";
- String MESHID = "0";
- String OWNER = "340881";
- /* Longitude (= x coord) first ! */
- Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
- Object[] obj = {point, POIID, MESHID, OWNER};
- SimpleFeature feature = featureBuilder.buildFeature(null, obj);
- collection.add(feature);
- feature = featureBuilder.buildFeature(null, obj);
- collection.add(feature);
- File newFile = new File("D:/newPoi.shp");
- 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);
- newDataStore.forceSchemaCRS(DefaultGeographicCRS.WGS84);
- 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();
- } catch (Exception problem) {
- problem.printStackTrace();
- transaction.rollback();
- } finally {
- transaction.close();
- }
- } else {
- System.out.println(typeName + " does not support read/write access");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
以下代码对应geotools10.0版本
一、读shp文件(图形信息+属性信息)的写法:
- import java.io.File;
- import java.nio.charset.Charset;
- import java.util.Iterator;
- import org.geotools.data.shapefile.ShapefileDataStore;
- import org.geotools.data.shapefile.ShapefileDataStoreFactory;
- import org.geotools.data.simple.SimpleFeatureIterator;
- import org.geotools.data.simple.SimpleFeatureSource;
- import org.opengis.feature.Property;
- import org.opengis.feature.simple.SimpleFeature;
- public class ShpNew {
- public static void main(String[] args) {
- ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
- try {
- ShapefileDataStore sds = (ShapefileDataStore)dataStoreFactory.createDataStore(new File("D:\\work\\shpdir\\Poi.shp").toURI().toURL());
- sds.setCharset(Charset.forName("GBK"));
- SimpleFeatureSource featureSource = sds.getFeatureSource();
- SimpleFeatureIterator itertor = featureSource.getFeatures().features();
- while(itertor.hasNext()) {
- SimpleFeature feature = itertor.next();
- Iterator<Property> it = feature.getProperties().iterator();
- while(it.hasNext()) {
- Property pro = it.next();
- System.out.println(pro);
- }
- }
- itertor.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
二、读图形信息
- try {
- ShpFiles sf = new ShpFiles("D:\\Poi.shp");
- ShapefileReader r = new ShapefileReader( sf, false, false, new GeometryFactory() );
- while (r.hasNext()) {
- Geometry shape = (Geometry) r.nextRecord().shape(); //com.vividsolutions.jts.geom.Geometry;
- System.out.println(shape.toString());
- }
- r.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
三、读dbf文件
- public void readDBF() {
- try {
- FileChannel in = new FileInputStream("D:\\Poi.dbf").getChannel();
- DbaseFileReader dbfReader = new DbaseFileReader(in, false, Charset.forName("GBK"));
- DbaseFileHeader header = dbfReader.getHeader();
- int fields = header.getNumFields();
- while ( dbfReader.hasNext() ){
- DbaseFileReader.Row row = dbfReader.readRow();
- // System.out.println(row.toString());
- for (int i=0; i<fields; i++) {
- System.out.println(header.getFieldName(i) + " : " + row.read(i));
- }
- }
- dbfReader.close();
- in.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
四、写shape文件
- public void write(String filepath) {
- try {
- //创建shape文件对象
- File file = new File(filepath);
- Map<String, Serializable> params = new HashMap<String, Serializable>();
- params.put( ShapefileDataStoreFactory.URLP.key, file.toURI().toURL() );
- ShapefileDataStore ds = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params);
- //定义图形信息和属性信息
- SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
- tb.setCRS(DefaultGeographicCRS.WGS84);
- tb.setName("shapefile");
- tb.add("the_geom", Point.class);
- tb.add("POIID", Long.class);
- tb.add("NAMEC", String.class);
- ds.createSchema(tb.buildFeatureType());
- ds.setCharset(Charset.forName("GBK"));
- //设置Writer
- FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
- //写下一条
- SimpleFeature feature = writer.next();
- feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.123, 39.345)));
- feature.setAttribute("POIID", 1234567890l);
- feature.setAttribute("NAMEC", "某兴趣点1");
- feature = writer.next();
- feature.setAttribute("the_geom", new GeometryFactory().createPoint(new Coordinate(116.456, 39.678)));
- feature.setAttribute("POIID", 1234567891l);
- feature.setAttribute("NAMEC", "某兴趣点2");
- writer.write();
- writer.close();
- ds.dispose();
- //读取刚写完shape文件的图形信息
- ShpFiles shpFiles = new ShpFiles(filepath);
- ShapefileReader reader = new ShapefileReader(shpFiles, false, true, new GeometryFactory(), false);
- try {
- while (reader.hasNext()) {
- System.out.println(reader.nextRecord().shape());
- }
- } finally {
- reader.close();
- }
- } catch (Exception e) { }
- }
五、由源shape文件创建新的shape文件
- public void transShape(String srcfilepath, String destfilepath) {
- try {
- //源shape文件
- ShapefileDataStore shapeDS = (ShapefileDataStore) new ShapefileDataStoreFactory().createDataStore(new File(srcfilepath).toURI().toURL());
- //创建目标shape文件对象
- Map<String, Serializable> params = new HashMap<String, Serializable>();
- FileDataStoreFactorySpi factory = new ShapefileDataStoreFactory();
- params.put(ShapefileDataStoreFactory.URLP.key, new File(destfilepath).toURI().toURL());
- ShapefileDataStore ds = (ShapefileDataStore) factory.createNewDataStore(params);
- // 设置属性
- SimpleFeatureSource fs = shapeDS.getFeatureSource(shapeDS.getTypeNames()[0]);
- //下面这行还有其他写法,根据源shape文件的simpleFeatureType可以不用retype,而直接用fs.getSchema设置
- ds.createSchema(SimpleFeatureTypeBuilder.retype(fs.getSchema(), DefaultGeographicCRS.WGS84));
- //设置writer
- FeatureWriter<SimpleFeatureType, SimpleFeature> writer = ds.getFeatureWriter(ds.getTypeNames()[0], Transaction.AUTO_COMMIT);
- //写记录
- SimpleFeatureIterator it = fs.getFeatures().features();
- try {
- while (it.hasNext()) {
- SimpleFeature f = it.next();
- SimpleFeature fNew = writer.next();
- fNew.setAttributes(f.getAttributes());
- writer.write();
- }
- } finally {
- it.close();
- }
- writer.close();
- ds.dispose();
- shapeDS.dispose();
- } catch (Exception e) { e.printStackTrace(); }
- }
JAVA用geotools读写shape格式文件的更多相关文章
- JAVA用geotools读取shape格式文件
Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性.但这种格式没法存储地理数据的拓扑信息. 其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是". ...
- 使用Spark读写CSV格式文件(转)
原文链接:使用Spark读写CSV格式文件 CSV格式的文件也称为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号.在本文中的CSV格 ...
- Java使用Geotools读取shape矢量数据
作为GIS开发者而言,矢量数据是我们经常要用到的,而shape数据是矢量数据中最常用的格式,因此解析shape数据也是作为GIS软件开发人员必备的基础技能,而GeoTools无疑是Java最好用来处理 ...
- java 调用OpenOffice将word格式文件转换为pdf格式
一:环境搭建 OpenOffice 下载地址http://www.openoffice.org/ JodConverter 下载地址http://sourceforge.net/projects/jo ...
- 如何用python读写CSV 格式文件
工作中经常会碰到读写CSV文件的情况.记录下,方便自己以后查询并与大家一起分享: 写CSV文件方法一: import csv #导入CSV with open("D:\eg ...
- python利用lxml读写xml格式文件
之前在转换数据集格式的时候需要将json转换到xml文件,用lxml包进行操作非常方便. 1. 写xml文件 a) 用etree和objectify from lxml import etree, o ...
- java使用jdom生成xml格式文件
本文生成xml使用的工具是jdom.jar,下载地址如下: 链接:https://eyun.baidu.com/s/3slyHgnj 密码:0TXF 生成之后的文档格式类型,就如上面的图片一样,简单吧 ...
- 使用csv模块读写csv格式文件
import csv class HandleCsv: ''' csv文件处理类 ''' def __init__(self, filename): ''' 构造器 :param filename: ...
- 使用JAVA读写Properties属性文件
使用JAVA读写Properties属性文件 Properties属性文件在JAVA应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数 ...
随机推荐
- stm32中.bss和.data段是在哪里初始化的
https://segmentfault.com/q/1010000004829859/a-1020000004850311 Q: STM32的启动文件startup_stm32f10x_hd.s中的 ...
- html中可以使用在块级元素<body>中的元素
1.<p></p>当在html页面中需要显示大段文字的时候,可以使用p元素标记每一个段落的边界,需要注意的是,段落是块级元素,只允许包含文本和行内元素. 以下标注的是p中的标准 ...
- javascript dom编程艺术笔记第三章:DOM操作的5个基本方法
JavaScript的 DOM操作,主要是对DOM这三个字母中D.O.M的操作.D代表的是document(文档),即我们可以使用javascript对文档进行操作,O代表的是object(对象),对 ...
- OpenCV(4)-图像掩码操作(卷积)--平滑处理
卷积定义 矩阵的掩码操作即对图像进行卷积.对图像卷积操作的意义为:邻近像素对(包括该像素自身)对新像素的影响:影响大小取决于卷积核对应位置值得大小. 例如:图像增强可以使用 \[ I(i,j)=5*I ...
- 字节序转换与结构体位域(bit field)值的读取
最近又遇到了几年前遇到的问题,标记一下. 对于跨字节位域(bit field)而言,如果数据传输前后环境的字节序不同(LE->BE,BE->LE),简单地调用(ntohs/ntohl/ht ...
- Cocos2d-x 3.0坐标系详解(转载)
Cocos2d-x 3.0坐标系详解 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系 笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenG ...
- Gradle实战教程之依赖管理
这是从我个人网站中复制过来的,原文地址:http://coolshell.info/blog/2015/05/gradle-dependency-management.html,转载请注明出处. 简要 ...
- thinkphp 缓存写入失败,网站报错
周末,正在家里休息,同事突然call 我,说网站打不开了,网站一直很正常的,突然成这样,肯定某个地方出问题了, 原来是网站所在的硬盘分区,没空间了,被mysql的日志占满了!!! 哎,好好的周末,在公 ...
- dom例子
//凡是html标签中的属性和值是一样的,那么在js中用true或者false 1,阅读协议倒计时 <input type="button" name="name& ...
- c#面向对象小结
特点: 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想. 过程和对象在我们的程序中是如何体现的呢?过程其实就是函数: ...