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 extends Property> colls = feature.getValue();
Iterator extends Property> 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);