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虚拟器内存不够 抛出内存溢出 ...
随机推荐
- 开发php接口注意点
1.制定规范 开发前一定要定好一个规范,比如要定好数据返回的通用参数和格式.关于数据格式,用的比较多的有xml和json,我建议用json,因为json比xml的好处更多. 2.精简的返回数据 接口数 ...
- Spark SQL 读到的记录数与 hive 读到的不一致
问题:我用 sqoop 把 Mysql 中的数据导入到 hive,使用了--delete-target-dir --hive-import --hive-overwrite 等参数,执行了两次. my ...
- 在 .NET Framework 中使用 StringBuilder 类
在 .NET Framework 中使用 StringBuilder 类 String 对象是不可变的.每次使用 System.String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就 ...
- 事务隔离实现并发控制:MySQL系列之十
一.并发访问控制 实现的并发访问的控制技术是基于锁: 锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁:InnoDB支持表级锁和行级锁: 锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其 ...
- swarm
https://blog.51cto.com/lookingdream/2060292 一.规划 1.swarm01作为manager节点,swarm02和swarm03作为worker节点. # c ...
- ng2学习--pipe使用
We use our custom pipe the same way we use built-in pipes.(自定义Pipe和API里自带的Pipe使用方式一致) We must includ ...
- SpringMVC(一) 基础知识+入门案例
SpringMVC基础知识 1.什么是Springmvc 2.springmvc 框架的原理(必须掌握) 前端控制器.处理器映射器.处理器适配器.视图解析器 3.SpringMVC 入门程序 目的:对 ...
- Java集合——List集合
1.集合框架的作用 在实际开发中,我们经常会对一组相同类型的数据进行统一管理操作.到目前为止,我们可以使用数组结构,链表结构,二叉树结构来实现. 数组的最大问题在于数组中的元素个数是固定的,要实现动态 ...
- docker exit status 255解决
一 windows开发整docker就是痛苦,在公司win7电脑想拿起几年没再用的docker 结果直接报错 Error getting IP address: ssh command error: ...
- win8.1x64下完美运行IE6
IE6我相信是所有前端人员永远都绕不过去的坎,操作的版本越来越高,离xp越来越远,难道你还在win8下安装个虚拟机来运行IE6吗?这样即消耗系统资源,来回的切换也麻烦,关键是只为了一个测试哦,没必要这 ...