GeoTools操作Shape格式文件
2019独角兽企业重金招聘Python工程师标准>>>
需要从Web系统中导出Shape格式数据文件,并使用AicMap打开。
中间件在系统中扮演连接数据和服务的角色。GeoTools承担了从各种数据源(如PostGIS,GML,Shapefile,WFS)读取数据并将数据标准化的工作。Feature接口就定义在GeoTools中,不同数据源的数据读出后被统一成包含一个Geometry成员(定义在JTS中)的Feature接口的实现。这样,进一步的操作只需面向Feature即可,省去了高层软件对于不同数据源的解读过程。另外,GeoTools还是OpenGIS标准的全面实现,其中包括Filter、坐标转换、GML。
GeoTools官网
- http://geotools.org
GeoTools API
- http://docs.geotools.org/latest/javadocs/
GeoTools 中央仓库地址
<repository><id>geotools-repos</id><name>GeoTools Repository</name><url>http://download.osgeo.org/webdav/geotools/</url></repository><repository><id>geotools2-repos</id><name>GeoTools2 Repository</name><url>http://repo1.maven.org/maven2/</url></repository>
GeoTools Jar
- gt-referencing-2.7.2
- gt-shapefile-2.7.2
- gt-api-2.7.2
- gt-main-2.7.2
- gt-opengis-2.7.2
- gt-metadata-2.7.2
- gt-data-2.7.2
- jts-1.11
- jsr-275-1.0-beta-2
- jai_core-1.1.3
Maven(gt-referencing-2.7.2从中央仓库获取有问题,故改成本地Jar,具体视自己机器排查)
<dependency><groupId>org.geotools</groupId><artifactId>gt-api</artifactId><version>2.7.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-main</artifactId><version>2.7.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-opengis</artifactId><version>2.7.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-shapefile</artifactId><version>2.7.2</version></dependency><dependency><groupId>com.vividsolutions</groupId><artifactId>jts</artifactId><version>1.11</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-metadata</artifactId><version>2.7.2</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-data</artifactId><version>2.7.2</version></dependency><dependency><groupId>javax.measure</groupId><artifactId>jsr-275</artifactId><version>1.0.0</version></dependency><dependency><groupId>org.geotools</groupId><artifactId>gt-referencing</artifactId><version>2.7.2</version><scope>system</scope><systemPath>${project.basedir}/lib/gt-referencing-2.7.2.jar</systemPath></dependency>
<!-- https://mvnrepository.com/artifact/javax.media/jai_core --><dependency><groupId>javax.media</groupId><artifactId>jai_core</artifactId><version>1.1.3</version></dependency>
GeoTools简单说明
- 下面将分为2.7.2和10.0两种版本的写法演示,不同版本之间的写法略有不同。
- shape格式文件最少包含3个文件,他们的后缀是:.shp, .dbf, .shx。
- .shp存储地理形状和位置信息,.dbf存储属性信息,.shx是索引文件。
- 在读取文件和输出文件的时候千万要注意到中文字符乱码问题,测试发现读取和输出的时候使用GBK或UTF-8,不对字符串进行转码,因为没有用,在对应方法中设置数据格式才对。(ShapefileDataStore的setStringCharset(Charset.forName("GBK"));等方法)
GeoTools-2.7.2-单独读取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) {} } }
}
GeoTools-2.7.2-读取3个文件,以point和polygon为例,WjPoint和WjPolygon为自定义实体对象,返回全部点和面的数据(已测试可用)
public Map readSHP(String path) {Map map = new HashMap();List<WjPoint> wjPointList = new ArrayList<WjPoint>();List<WjPolygon> wjPolygonList = new ArrayList<WjPolygon>();ShapefileDataStore shpDataStore = null; try{
File shpfile = new File(path);shpDataStore = new ShapefileDataStore(shpfile.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()); WjPoint wjPoint = new WjPoint();wjPoint.setShp(((Point)pro.getValue()).toString());wjPointList.add(wjPoint);} else if (pro.getValue() instanceof MultiPolygon) {WjPolygon wjPolygon = new WjPolygon();wjPolygon.setShp(((Polygon)((MultiPolygon)pro.getValue()).getGeometryN(0)).toString());wjPolygonList.add(wjPolygon);} else { System.out.println(pro.getName() + " = " + pro.getValue()); } } } itertor.close(); shpDataStore.dispose();shpfile.exists();} catch (MalformedURLException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } map.put("wjPointList", wjPointList);map.put("wjPolygonList", wjPolygonList);return map;
}
GeoTools-2.7.2-写shape文件,以point为例(已测试可用)
package com.shp.mapsay;import java.io.File;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultTransaction;
import org.geotools.data.Transaction;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.feature.FeatureCollections;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;public class test1 {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("19.968"); double longitude = Double.parseDouble("110.402"); String POIID = "2050003092"; String MESHID = "0"; String OWNER = "不睡觉假装王祖贤"; /* Longitude (= x coord) first ! */ Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude)); Object[] obj = {point, POIID, MESHID, OWNER}; // SimpleFeature只能创建一次SimpleFeature feature = featureBuilder.buildFeature(null, obj); collection.add(feature); feature = featureBuilder.buildFeature(null, obj); collection.add(feature); File newFile = new File("D:/newPoi1.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); newDataStore.setStringCharset(Charset.forName("UTF-8"));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(); } }
}
GeoTools-10.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(); } }
}
GeoTools-10.0-读图形信息
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();
}
GeoTools-10.0-读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(); } }
GeoTools-10.0-写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) { }
}
GeoTools-10.0-由源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(); }
}
转载于:https://my.oschina.net/discussjava/blog/902122
GeoTools操作Shape格式文件相关推荐
- java shapefile 中文乱码_GeoTools操作Shape格式文件
需要从Web系统中导出Shape格式数据文件,并使用AicMap打开. 中间件在系统中扮演连接数据和服务的角色.GeoTools承担了从各种数据源(如PostGIS,GML,Shapefile,WFS ...
- ArcPy操作shp格式文件
目录 ArcPy操作shp格式文件 shp文件介绍 创建shp 编辑shp 编辑列/字段 插入列 编辑行/记录 主要涉及的对象 arcpy.Cursor(游标)对象 arcpy.Row对象 arcpy ...
- python使用 docx 库操作 docx 格式文件
docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...
- python操作xlsx格式文件
python操作xlsx格式文件 一.准备工作 二 .xlrd库读取 三.pandas库读取 1.安装pandas: pip install pandas 2.代码如下 3.操作行列 一.准备工作 二 ...
- 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件
docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...
- python-docx库_用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件...
docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...
- python操作excel格式文件
python操作excel格式文件 1. 读数据 2. 写excel 3.操作整合 1. 读数据 安装包 pip install openpyxl 导包 from openpyxl import lo ...
- python操作XML格式文件
python操作XML格式文件 python操作XML格式文件 1. 读取文件和内容 2.读取节点数据 3.修改和删除节点 4.构建文档 python操作XML格式文件 可扩展标记语言,是一种简单的数 ...
- python存储数据的操作(csv格式文件,Excel表格文件)!!!
python存储数据 存储数据的方式 两种存储数据方式的区别 csv格式文件 Excel格式文件 csv文件的写入 csv文件的读取 Excel基本概念 Excel文件的写入 Excel文件的读取 存 ...
- Node.js操作Json格式文件
json格式文件也是很常用的数据存储传输格式.本篇将介绍Node.js如何添加.修改和解析Json格式数据. /*** Json文件操作:添加.修改.删除以及读取*/ const fs = requi ...
最新文章
- 【敏捷开发】Node.js(nodejs)实现一个接口完成增删改查聚合接口4个功能,最大限度节省接口数量,正所谓“一口多用”(基础版、免登陆、无鉴权)
- 分享一波 RabbitMQ 面试题有答案
- 关于VMware Linux 虚拟机忘记root 密码找回
- iOS之UIview动画
- 【新星计划】MATLAB-多项式计算
- python学习笔记一 一变量与运算符
- 如何从服务器导出文件,如何从云服务器导出文件
- 上午写了一段代码,下午就被开除了,奇怪的知识又增加了
- 搭载华为HiCar 新宝骏跨界融合打造智能出行生态圈
- Tomcat设置普通用户启动
- 机械硬盘的SMR与PMR 的概念
- jieba基本使用过程
- Tomcat热部署问题
- 哪些人需要在三九天调理体质?什么情况需要泡三九药浴?
- C#压缩图片文件大小
- 送给你的一份英语学习资料,请查收!
- Linux 常用系统故障(修复MBR扇区故障、修复GRUB引导故障、遗忘root用户密码、修复文件系统、磁盘配额等)
- Java用户账号密码创建登录
- osgEarth的Rex引擎原理分析(七十三)从高程文件读取的高程信息如何填充rex的高程瓦片
- 计算机excel 的分栏在哪,excel分栏在哪里
热门文章
- python对文件的操作
- javascript 异步队列
- js与设计模式----简单工厂
- 111 进程的创建和结束
- Python-sorted函数
- 2018.09.18 循环终止
- c#使用 Newtonsoft.Json 将entity转json时,忽略为null的属性
- tf.contrib.rnn.core_rnn_cell.BasicLSTMCell should be replaced by tf.contrib.rnn.BasicLSTMCell.
- oracle、mysql、sql server等;流行数据库的链接驱动配置
- zeal刷新不出来_Zeal——好用的离线 API 文档大全!