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格式文件相关推荐

  1. java shapefile 中文乱码_GeoTools操作Shape格式文件

    需要从Web系统中导出Shape格式数据文件,并使用AicMap打开. 中间件在系统中扮演连接数据和服务的角色.GeoTools承担了从各种数据源(如PostGIS,GML,Shapefile,WFS ...

  2. ArcPy操作shp格式文件

    目录 ArcPy操作shp格式文件 shp文件介绍 创建shp 编辑shp 编辑列/字段 插入列 编辑行/记录 主要涉及的对象 arcpy.Cursor(游标)对象 arcpy.Row对象 arcpy ...

  3. python使用 docx 库操作 docx 格式文件

    docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...

  4. python操作xlsx格式文件

    python操作xlsx格式文件 一.准备工作 二 .xlrd库读取 三.pandas库读取 1.安装pandas: pip install pandas 2.代码如下 3.操作行列 一.准备工作 二 ...

  5. 用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件

    docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...

  6. python-docx库_用 python 来操作 docx, xlsx 格式文件(二)(使用 docx 库操作 docx 格式文件...

    docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...

  7. python操作excel格式文件

    python操作excel格式文件 1. 读数据 2. 写excel 3.操作整合 1. 读数据 安装包 pip install openpyxl 导包 from openpyxl import lo ...

  8. python操作XML格式文件

    python操作XML格式文件 python操作XML格式文件 1. 读取文件和内容 2.读取节点数据 3.修改和删除节点 4.构建文档 python操作XML格式文件 可扩展标记语言,是一种简单的数 ...

  9. python存储数据的操作(csv格式文件,Excel表格文件)!!!

    python存储数据 存储数据的方式 两种存储数据方式的区别 csv格式文件 Excel格式文件 csv文件的写入 csv文件的读取 Excel基本概念 Excel文件的写入 Excel文件的读取 存 ...

  10. Node.js操作Json格式文件

    json格式文件也是很常用的数据存储传输格式.本篇将介绍Node.js如何添加.修改和解析Json格式数据. /*** Json文件操作:添加.修改.删除以及读取*/ const fs = requi ...

最新文章

  1. 【敏捷开发】Node.js(nodejs)实现一个接口完成增删改查聚合接口4个功能,最大限度节省接口数量,正所谓“一口多用”(基础版、免登陆、无鉴权)
  2. 分享一波 RabbitMQ 面试题有答案
  3. 关于VMware Linux 虚拟机忘记root 密码找回
  4. iOS之UIview动画
  5. 【新星计划】MATLAB-多项式计算
  6. python学习笔记一 一变量与运算符
  7. 如何从服务器导出文件,如何从云服务器导出文件
  8. 上午写了一段代码,下午就被开除了,奇怪的知识又增加了
  9. 搭载华为HiCar 新宝骏跨界融合打造智能出行生态圈
  10. Tomcat设置普通用户启动
  11. 机械硬盘的SMR与PMR 的概念
  12. jieba基本使用过程
  13. Tomcat热部署问题
  14. 哪些人需要在三九天调理体质?什么情况需要泡三九药浴?
  15. C#压缩图片文件大小
  16. 送给你的一份英语学习资料,请查收!
  17. Linux 常用系统故障(修复MBR扇区故障、修复GRUB引导故障、遗忘root用户密码、修复文件系统、磁盘配额等)
  18. Java用户账号密码创建登录
  19. osgEarth的Rex引擎原理分析(七十三)从高程文件读取的高程信息如何填充rex的高程瓦片
  20. 计算机excel 的分栏在哪,excel分栏在哪里

热门文章

  1. python对文件的操作
  2. javascript 异步队列
  3. js与设计模式----简单工厂
  4. 111 进程的创建和结束
  5. Python-sorted函数
  6. 2018.09.18 循环终止
  7. c#使用 Newtonsoft.Json 将entity转json时,忽略为null的属性
  8. tf.contrib.rnn.core_rnn_cell.BasicLSTMCell should be replaced by tf.contrib.rnn.BasicLSTMCell.
  9. oracle、mysql、sql server等;流行数据库的链接驱动配置
  10. zeal刷新不出来_Zeal——好用的离线 API 文档大全!