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虚拟器内存不够 抛出内存溢出 ...
随机推荐
- JAVA对象创建的过程
Java中一个实例对象被创建的过程 一.类的加载过程 首先,Jvm在执行时,遇到一个新的类时,会到内存中的方法区去找class的信息,如果找到就直接拿来用,如果没有找到,就会去将类文件加载到方法区.在 ...
- 使用urllib获取一个网页内所有a标签的href属性
import re, urllib.request, urllib.parse, urllib.error page = input('Enter - ') fhand = urllib.reques ...
- 51nod1521(set.upper_bound())
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521 题意:中文题诶- 思路: 我们先看一下set容器的三个 ...
- 洛谷P1047 校门外的树
P1047 校门外的树 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...
- [Xcode 实际操作]三、视图控制器-(9)在Storyboard中使用标签和按钮控件
目录:[Swift]Xcode实际操作 本文将演示标签和按钮在故事板中的应用. 在欢迎串口中,点击创建一个新的项目[Create a new Xcode project] [Single View A ...
- final、权限、内部类
final.权限.内部类 final.权限.内部类 final.权限.内部类 final.权限.内部类 final.权限.内部类 final.权限.内部类
- dorado 常用
如果要设置模糊查询, 一般要在QueryCommand中这样写: var name = dsQuery.getValue("NAME"); var parameters = com ...
- Windows 在目录中搜索哪个文件中有指定字符串
findstr /s /i "string" *.* 表示,当前目录以及子目录下的所有文件中查找"string"这个字符串. *.*表示所有类型的文件. /s ...
- python基础 3.0 file 读取文件
一.python 文件访问 1.在python中要访问文件,首先要打开文件,也就是open r: 只读 w: 只写 ,文件已存在则清空,不存在则创建 a:追加 ,写到文件末尾.如果文件存在,则在 ...
- maven参数
mvn clean package -DskipTests mvn -T 2 clean install/mvn -T 2C clean install: maven支持并行构建,-T 2表示使用2个 ...