World Wind Java开发之六——解析shape文件(转)
http://blog.csdn.net/giser_whu/article/details/41647117
最近一直忙于导师项目的事情了,几天没更新了,昨天和今天研究了下WWJ解析shp文件的源代码,现在记录下,希望可以帮到更多的人!
上一篇博客:World Wind Java开发之五——读取本地shp文件只讲了如何加载shp文件,没有涉及到shp文件的解析,我们这篇博客紧接上一篇博客,利用WWJ来解析shp文件。首先来看用到的源码包和相关类,如下图所示。解析shp文件主要用到Shapefile(shapefile文件类)、ShapefileRecord(shape文件记录类)、DBaseRecord类以及DBaseField(字段类)
1、读取shapefile文件
- /**
- * Opens a Shapefile from an InputStream, and InputStreams to its optional
- * resources.
- * <p/>
- * The source Shapefile may be accompanied optional streams to an index
- * resource stream, an attribute resource stream, and a projection resource
- * stream. If any of these streams are null or cannot be read for any
- * reason, the Shapefile opens without that information.
- * <p/>
- * This throws an exception if the shapefile's coordinate system is
- * unsupported.
- *
- * @param shpStream
- * the shapefile geometry file stream.
- * @param shxStream
- * the index file stream, can be null.
- * @param dbfStream
- * the attribute file stream, can be null.
- * @param prjStream
- * the projection file stream, can be null.
- * @throws IllegalArgumentException
- * if the shapefile geometry stream <code>shpStream</code> is
- * null.
- * @throws WWRuntimeException
- * if the shapefile cannot be opened for any reason, or if the
- * shapefile's coordinate system is unsupported.
- */
- public Shapefile(InputStream shpStream, InputStream shxStream,
- InputStream dbfStream, InputStream prjStream)
- {
- this(shpStream, shxStream, dbfStream, prjStream, null);
- }
输入文件流分别对应着.shp .shx .dbf .prj文件
- /**
- * Opens an Shapefile from a general source. The source type may be one of
- * the following:
- * <ul>
- * <li>{@link java.io.InputStream}</li>
- * <li>{@link java.net.URL}</li>
- * <li>{@link File}</li>
- * <li>{@link String} containing a valid URL description or a file or
- * resource name available on the classpath.</li>
- * </ul>
- * <p/>
- * The source Shapefile may be accompanied by an optional index file,
- * attribute file, and projection file. To be recognized by this Shapefile,
- * accompanying files must be in the same logical folder as the Shapefile,
- * have the same filename as the Shapefile, and have suffixes ".shx",
- * ".dbf", and ".prj" respectively. If any of these files do not exist, or
- * cannot be read for any reason, the Shapefile opens without that
- * information.
- * <p/>
- * This throws an exception if the shapefile's coordinate system is
- * unsupported, or if the shapefile's coordinate system is unsupported.
- *
- * @param source
- * the source of the shapefile.
- * @throws IllegalArgumentException
- * if the source is null or an empty string.
- * @throws WWRuntimeException
- * if the shapefile cannot be opened for any reason.
- */
- public Shapefile(Object source)
- {
- this(source, null);
- }
这种方法秩序给出shp文件的路径即可,但是若只有shp文件,缺少shx等文件则无法解析shape文件。
- String shpFilePath = "D:\\Users\\wwj_data\\states.shp";
- String shxFilePath = "D:\\Users\\wwj_data\\states.shx";
- String dbfFilePath = "D:\\Users\\wwj_data\\states.dbf";
- String prjFilePath = "D:\\Users\\wwj_data\\states.prj";
- Shapefile shapefile = new Shapefile(shpFilePath);
- System.out.println(shapefile.getShapeType());
或者:---------------------------------------------------------------------------------------
- String shpFilePath = "D:\\Users\\wwj_data\\states.shp";
- String shxFilePath = "D:\\Users\\wwj_data\\states.shx";
- String dbfFilePath = "D:\\Users\\wwj_data\\states.dbf";
- String prjFilePath = "D:\\Users\\wwj_data\\states.prj";
- InputStream shpInputStream = new FileInputStream(shpFilePath);
- InputStream shxInputStream = new FileInputStream(shxFilePath);
- InputStream dbfInputStream = new FileInputStream(dbfFilePath);
- InputStream prjInputStream = new FileInputStream(prjFilePath);
- // 实例化一个shapefile类
- Shapefile shapefile = new Shapefile(shpInputStream, shxInputStream,
- dbfInputStream, prjInputStream);
- System.out.println(shapefile.getShapeType()); // shape类型
2、获取shapefile文件的属性表信息
- protected DBaseFile attributeFile;
- /**
- *
- * @方法名称: getAttributesTable ;
- * @方法描述: 获取属性表 ;
- * @参数 :@return
- * @返回类型: DBaseFile ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-1 下午12:55:33;
- * @throws
- */
- public DBaseFile getAttributesTable()
- {
- return this.attributeFile;
- }
获取属性表后,首先要获取属性表的基本信息,如:shape文件的类型、字段个数以及记录个数。另外输出所有字段名
- // 获取shp属性表
- DBaseFile dBaseFile = shapefile.getAttributesTable();
- int fieldCount = dBaseFile.getNumberOfFields(); // 字段数
- int recordsCount = dBaseFile.getNumberOfRecords(); // 记录数
- System.out.println("字段数为:" + fieldCount);
- System.out.println("记录数为:" + recordsCount);
- System.out.println(shapefile.getShapeType()); // shape类型
- //获取字段集合
- DBaseField [] dBaseFields=dBaseFile.getFields();
- for (int i = 0; i < fieldCount; i++)
- {
- System.out.println(dBaseFields[i].getName());
- }
运行结果如下:
3、获取字段值
- // 解析shape文件
- try
- {
- while (shapefile.hasNext())
- {
- ShapefileRecord record = shapefile.nextRecord(); // 获取一条记录
- DBaseRecord dBaseRecord = record.getAttributes(); // 获取该记录的属性信息
- Object[] values = dBaseRecord.getValues().toArray();//获取字段值集合
- for (int i = 0; i < values.length; i++)
- {
- System.out.println(values[i].toString());
- }
- System.out.println("------------------");
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- System.out.println("解析shapefile文件出错!");
- }
- finally
- {
- WWIO.closeStream(shapefile, shpFilePath);
- WWIO.closeStream(shapefile, shxFilePath);
- WWIO.closeStream(shapefile, dbfFilePath);
- WWIO.closeStream(shapefile, prjFilePath);
- }
思路很简单:shapefile文件—>获取一条记录—>获取记录的属性信息-->获取字段值集合。但是有一个问题:不支持中文字段值
- /**
- * @方法名称: shapeFileReader ;
- * @方法描述: 读取sh文件 ;
- * @参数 :@throws FileNotFoundException
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-1 下午12:50:11;
- * @throws
- */
- private void shapeFileReader() throws FileNotFoundException
- {
- String shpFilePath = "D:\\Users\\wwj_data\\states.shp";
- String shxFilePath = "D:\\Users\\wwj_data\\states.shx";
- String dbfFilePath = "D:\\Users\\wwj_data\\states.dbf";
- String prjFilePath = "D:\\Users\\wwj_data\\states.prj";
- InputStream shpInputStream = new FileInputStream(shpFilePath);
- InputStream shxInputStream = new FileInputStream(shxFilePath);
- InputStream dbfInputStream = new FileInputStream(dbfFilePath);
- InputStream prjInputStream = new FileInputStream(prjFilePath);
- // 实例化一个shapefile类
- Shapefile shapefile = new Shapefile(shpInputStream, shxInputStream,
- dbfInputStream, prjInputStream);
- // 获取shp属性表
- DBaseFile dBaseFile = shapefile.getAttributesTable();
- int fieldCount = dBaseFile.getNumberOfFields(); // 字段数
- int recordsCount = dBaseFile.getNumberOfRecords(); // 记录数
- System.out.println("字段数为:" + fieldCount);
- System.out.println("记录数为:" + recordsCount);
- System.out.println(shapefile.getShapeType()); // shape类型
- //获取字段集合
- DBaseField [] dBaseFields=dBaseFile.getFields();
- for (int i = 0; i < fieldCount; i++)
- {
- System.out.print(dBaseFields[i].getName()+" ");
- }
- System.out.println();
- // 解析shape文件
- try
- {
- while (shapefile.hasNext())
- {
- ShapefileRecord record = shapefile.nextRecord(); // 获取一条记录
- DBaseRecord dBaseRecord = record.getAttributes(); // 获取该记录的属性信息
- Object[] values = dBaseRecord.getValues().toArray();//获取字段值集合
- for (int i = 0; i < values.length; i++)
- {
- System.out.print(values[i].toString()+" ");
- }
- System.out.println("------------------");
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- System.out.println("解析shapefile文件出错!");
- }
- finally
- {
- WWIO.closeStream(shapefile, shpFilePath);
- WWIO.closeStream(shapefile, shxFilePath);
- WWIO.closeStream(shapefile, dbfFilePath);
- WWIO.closeStream(shapefile, prjFilePath);
- }
- }
-----------------------------------------------华丽的分割线----------------------------------------------
- while (shapefile.hasNext())
- {
- ShapefileRecord record = shapefile.nextRecord(); // 获取一条记录
- DBaseRecord dBaseRecord = record.getAttributes(); // 获取该记录的属性信息
- ArrayList<String> fieldArrayList = new ArrayList<String>();
- for (int i = 0; i < fieldCount; i++)
- {
- /**
- * 根据字段名称来获取字段值
- */
- String fieldValue = dBaseRecord.getValue(
- dBaseFields[i].getName()).toString(); //
- fieldArrayList.add(fieldValue);
- System.out.print(fieldValue + " ");
- }
- System.out.println("------------------");
- }
执行结果如下图所示。
修改 gov.nasa.worldwind.formats.shapefile.DBaseFile;下的
decodeString 方法中的UTF-8 类型改为 GBK类型,希望对您有用
World Wind Java开发之六——解析shape文件(转)的更多相关文章
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- java jar包解析:打包文件,引入文件
java jar包解析:打包文件,引入文件 cmd下: jar命令:package包打包 javac命令:普通类文件打包 Hello.java: package org.lxh.demo; publi ...
- World Wind Java开发之一(转)
http://blog.csdn.net/giser_whu/article/details/40477235 参照<World wind Java三维地理信息系统开发指南随书光盘>以及官 ...
- [转]World Wind Java开发之五——读取本地shp文件
World Wind Java 使用IconLayer图层类表现点和多点数据,使用RenderableLayer图层表现线和面数据,一个图层只能对应一组shape文件.World Wind Java首 ...
- World Wind Java开发之五——读取本地shp文件(转)
http://blog.csdn.net/giser_whu/article/details/41484433 World Wind Java 使用IconLayer图层类表现点和多点数据,使用Ren ...
- JAVA使用SAX解析XML文件
在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...
- Java 创建过滤器 解析xml文件
今天写了一个过滤器demo,现在是解析actions.xml文件,得到action中的业务规则:不需要导入任何jar包 ActionFilter过滤器类: package accp.com.xh.ut ...
- java使用dom4j解析xml文件
关于xml的知识,及作用什么的就不说了,直接解释如何使用dom4j解析.假如有如下xml: dom4j解析xml其实很简单,只要你有点java基础,知道xml文件.结合下面的xml文件和java代码, ...
- Java:JXL解析Excel文件
项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...
随机推荐
- 前端编码规范 -- html篇
文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html> (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及它的属性,比如 a ...
- loj#6433. 「PKUSC2018」最大前缀和(状压dp)
传送门 今天\(PKUWC\)试机的题 看着边上的大佬们一个个\(A\)穿咱还是不会-- 我们考虑枚举最大前缀和,如果一个前缀\(1\)到\(p\)是最大前缀和,那么\(p\)后面的所有前缀和都要小于 ...
- 关于写PPT
如果你要给别人讲东西,要记得你的受众的不同,你的讲法也应该有不同,侧重点应该有所区别. 如果作为一个老师,你的PPT应该是让人看懂,把人讲懂,这是你的最终目的所在.如果你是一个毕业生,你要围绕你要解决 ...
- POST和 GET
http GET 和 POST 请求的优缺点.区别以及误区 Get和Post在面试中一般都会问到,一般的区别: (1)post更安全(不会作为url的一部分,不会被缓存.保存在服务器日志.以及 ...
- 设计模式——抽象工厂(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...
- MySQL存储过程的动态行转列
MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...
- linux下WPS的使用
WPS退出了wps for linux ,高版本的一直安装不上,低版本的原来在桌面都有图标,重装后安装位置不是很明显打开关闭不是很方便.并且也不利于在终端模式下使用.现简单总结一下wps的表格 文字 ...
- Java集合——集合框架Iterator接口
1.集合输出 很多情况下我们需要把集合的内容进行输出,也就是遍历集合. 遍历集合的方式有以下几种: 1.Iterator 2.ListIterator 3.Enumeration(枚举方式,比较老一般 ...
- RN 从上手到“放弃”
RN 从上手到"放弃" 前言: react-native,相对于最近
- Zookeeper问题汇总
1. 遗留问题 a). zookeeper集群如何保证请求的均匀分布? 2. ZK概念澄清 2.1 ZK节点类型 CreateMode.PERSISTENT //持久节点,该节点客户端断开后不会删除 ...