Shape文件的解析

   这几天一直搞shp文件的解析,首先是解析成json串,后来直接解析入数据库,今天把东西整合一下,记下笔记.

Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性。我的理解就是:shape文件首先它不仅仅只是一个文件,它可以是一个文件夹.里面包含很多文件,其中有三个文件是必不可少的,分别是".shp", ".shx"与 ".dbf" 文件.

必须的文件:

.shp — 图形格式,用于保存元素的几何实体。

.shx — 图形索引格式。几何体位置索引,记录每一个几何体在shp文件之中的位置,能够加快向前或向后搜索一个几何体的效率。

.dbf — 属性数据格式,以dBase IV的数据表格式存储每个几何形状的属性数据。

其他可选的文件:

.ixs — 可读写Shapefile文件的地理编码索引

.mxs — 可读写Shapefile文件的地理编码索引(ODB格式)

.atx — .dbf文件的属性索引,其文件名格式为shapefile.columnname.atx (ArcGIS 8及之后的版本)

.shp.xml — 以XML格式保存元数据。

.cpg — 用于描述.dbf文件的代码页,指明其使用的字符编码

.prj — 投影格式,用于保存地理坐标系统与投影信息,是一个存储well-known text投影描述符的文本文件

 

       这些都是用来了解,真正解析shp的时候,就是解析.shp文件,解析shape文件的不同,就是因为shape文件中包含空间字段,就是点,线,面之类的坐标,如果解析成json串的话,是没有问题的,但是没有解析入库的话,就要注意空间字段的类型.下面提供核心代码.

 

//看传入的数据类型,有可能传入的是File 有可能是MultiFile,也有可能是对象,但是有需要获取path,小白的理解
//解析json的就不多说  我这里介绍解析直接入库的,解析直接入库时,需要先行解析获取shape里面的字段值,然后写一个实体类 ,把获取到的字段值作为属性写入实体类
//这下面是我用文本写的一个伪代码
//实体类
public class Model{
    private String id;
    private String name;
    private String theGeom....
    geter/seter方法;
}
String shpPath = "D:\\CN_4";
		// 判断该路径下时候存在shape文件
		File shpDirFile = new File(shpPath);
		File[] listFiles = shpDirFile.listFiles();
		for (File file : listFiles) {
			// 是否是shp文件
			if (file.toString().endsWith(".shp")) {
				ShapefileDataStore shpDataStore = null;
				try {
					shpDataStore = new ShapefileDataStore(file.toURI().toURL());
					shpDataStore.setCharset(Charset.forName("UTF-8"));
					Map column = FileUtil.assembleDynamicColumn(shpDataStore);
					logger.info("Danymic column: {}", JSON.toJSONString(column));
					String typeName = shpDataStore.getTypeNames()[0];
					SimpleFeatureSource featureSource = null;
					featureSource = shpDataStore.getFeatureSource(typeName);
					SimpleFeatureCollection collection = featureSource.getFeatures();
					SimpleFeatureIterator iterator = collection.features();
					while (iterator.hasNext()) {
						SimpleFeature feature = iterator.next();
						Object object = feature.getDefaultGeometry();
						Collection colls = feature.getValue();
						Iterator ite = colls.iterator();
						ShapeInfo shapeInfo = new ShapeInfo();
						while (ite.hasNext()) {
							Property featurePro = ite.next();
							// feature数据与实体类对应
							if (featurePro.getName().toString().equalsIgnoreCase("OBJECTID"))
								shapeInfo.setId(featurePro.getValue().toString());

							if (featurePro.getName().toString().equalsIgnoreCase("ID"))
								shapeInfo.setAreaId(featurePro.getValue().toString());

							if (featurePro.getName().toString().equalsIgnoreCase("Name"))
								shapeInfo.setName(featurePro.getValue().toString());

							if (featurePro.getName().toString().equalsIgnoreCase("Shape_Leng"))
								shapeInfo.setShapeLeng(featurePro.getValue().toString());

							if (featurePro.getName().toString().equalsIgnoreCase("Shape_Area"))
								shapeInfo.setShapeArea(featurePro.getValue().toString());

							if (featurePro.getName().toString().equalsIgnoreCase("Name_ASCII"))
								shapeInfo.setNameEn(featurePro.getValue().toString());

							if (featurePro.getName().toString().equalsIgnoreCase("the_geom"))
								shapeInfo.setTheGeom(featurePro.getValue().toString());
						}
						lists.add(shapeInfo);

 

你可能感兴趣的:(Shape文件的解析)