发布时间: 阅读量

Java 读写shp文件geotools

Java 读写shp文件geotools

前言,公司业务要求,需要读写shp文件,之前没接触过,记录一下,方便查找


首先是读取shp文件

//具体的方法,获取属性,封装实体集合
public ArrayList<DataRedlineRegister> readShapeFile(String filePath) {
        ArrayList<DataRedlineRegister> modelList = new ArrayList<>();
        File folder = new File(filePath);
        if (!folder.isDirectory()) {
            if (folder.toString().endsWith(".shp")) {
                try {
                    modelList = getShapeFile(folder);
                    return modelList;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println("选择的文件后缀名不是.shp");
            }
        }else{
            File[] files = folder.listFiles();
            if (!(files.length > 0)) {
                System.out.println("目录文件为空");
                return modelList;
            }

            for (File file : files) {
                if (!file.toString().endsWith(".shp")) {
                    continue;
                }
                try {
                    ArrayList<DataRedlineRegister> models = getShapeFile(file);
                    modelList.addAll(models);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return modelList;
    }

    private ArrayList<DataRedlineRegister> getShapeFile(File file) throws Exception {

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("url", file.toURI().toURL());
        ArrayList<DataRedlineRegister> models = new ArrayList<>();
        DataStore dataStore = DataStoreFinder.getDataStore(map);
        //字符转码,防止中文乱码

        ((ShapefileDataStore) dataStore).setCharset(Charset.forName("UTF-8"));
        String typeName = dataStore.getTypeNames()[0];
        FeatureSource<SimpleFeatureType, SimpleFeature> source = dataStore.getFeatureSource(typeName);
        FeatureCollection<SimpleFeatureType, SimpleFeature> collection = source.getFeatures();
        FeatureIterator<SimpleFeature> features = collection.features();
        while (features.hasNext()) {
            SimpleFeature feature = features.next();
            DataRedlineRegister model = new DataRedlineRegister();
            Iterator<? extends Property> iterator = feature.getValue().iterator();
            while (iterator.hasNext()) {
                Property property = iterator.next();
//                System.out.println(property);
                //property数据与实体类对应
//                double b= Double.parseDouble(property.getValue().toString());
//                int a = (int) b;
                if(property.getName().toString().equals("Id")){

                    model.setSrldId(Integer.parseInt(property.getValue().toString()));
                }
                if(property.getName().toString().equals("pac")){
                    model.setSrldCode(property.getValue().toString());
                }
                if(property.getName().toString().equals("hxcode")){
                    model.setSrldNumber(property.getValue().toString());
                }
                if(property.getName().toString().equals("area")){
                    model.setSrldArea(property.getValue().toString());
                }
                if(property.getName().toString().equals("attribute")){
                    model.setTarget(property.getValue().toString());
                }
                if(property.getName().toString().equals("type")){
                    model.setSrldType(property.getValue().toString());
                }

                if(property.getName().toString().equals("redline")){
                    model.setAreaRedline(property.getValue().toString());
                }

                if(property.getName().toString().equals("name")){
                    model.setSrldName(property.getValue().toString());
                }
                if(property.getName().toString().equals("plant")){
                    model.setSrldPlantType(property.getValue().toString());
                }


            }
            models.add(model);
        }
        return models;
    }

    public static void main(String[] args) {
        try {
            String path = "D:/Work/gistone/文档/祁连山生态红线/祁连山山水林田湖生态修复试点/Export_Output_2.shp";
            ImportRedlineData importRedlineData = new ImportRedlineData();
            ArrayList<DataRedlineRegister> lmMarkerMobiles = importRedlineData.readShapeFile(path);
//            boolean b = dataRedlineRegisterService.saveBatch(lmMarkerMobiles);
            lmMarkerMobiles.forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

用这些方法,还需要加入相关依赖,再pom文件中添加

 <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-swing</artifactId>
            <version>${gt-opengis}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>${gt-opengis}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-opengis</artifactId>
            <version>${gt-opengis}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-geojson</artifactId>
            <version>${gt-opengis}</version>
        </dependency>
        
        //相关版本
        <gt-swing>17.0</gt-swing>
        <gt-shapefile>17.0</gt-shapefile>
        <gt-opengis>10.0</gt-opengis>
       //geojson的版本17.0
        
        //还需要加仓库
        <repository>
            <id>osgeo</id>
            <name>Open Source Geospatial Foundation Repository</name>
            <url>http://download.osgeo.org/webdav/geotools/</url>
        </repository>

读取的shp文件格式如下图,文件必须完整
snipaste_2019-12-10_11-07-54

读的时候shp文件的绝对路径,其他文件必须都有

写入shp方法比较多,分点线面,封装的工具类,代码着实有点多


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.gistone.VO.ResultVO;
import com.vividsolutions.jts.geom.*;
import lombok.extern.slf4j.Slf4j;
import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultTransaction;
import org.geotools.data.Transaction;
import org.geotools.data.collection.ListFeatureCollection;
import org.geotools.data.shapefile.ShapefileDataStore;
import org.geotools.data.shapefile.ShapefileDataStoreFactory;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.geojson.feature.FeatureJSON;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.springframework.web.bind.annotation.RequestBody;

import java.io.File;
import java.io.Serializable;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.nio.charset.Charset;
import java.util.*;

    **
 * @author zf1017@foxmail.com
 * @date 2019/9/18 0018 10:36
 * @description 读取shp文件返回json数据
 */
@Slf4j
public class ShpUtil {



    public static void main(String[] args) {
        String shpStr1 = ShpUtil.readShapeFileToStr("E:\\epr\\image\\2019-11-10\\3\\5deda7e4ecfe4eb9ae2b62b5415ad884.shp", 1) + "";
        System.out.println(shpStr1);
    }

    /**
     * 117°17′3.12″ 转 117.28805555555556
     * @param dms
     * @return
     */
    public static Double DmsToDdd(String dms){
        String[] arr1 = dms.split("°");
        double num1 = Double.valueOf(arr1[0]);
        String[] arr2 = arr1[1].split("′");
        double num2 = Double.valueOf(arr2[0])/60;
        String[] arr3 = arr2[0].split("″");
        double num3 = Double.valueOf(arr3[0])/3600;
        return num1+num2+num3;
    }
    /**
     * 117.288  转  117°17′17″
     * @param ddd
     * @return
     */
    public static String DddToDms(Double ddd){
        String[] arr = ddd.toString().split("\\.");
        String str = Double.valueOf("0."+arr[1])*60+"";
        String[] arr2 = str.split("\\.");
        String str2 = Double.valueOf("0."+arr2[1])*60+"";
        String[] arr3 = str2.split("\\.");
        return arr[0]+"°"+arr2[0]+"′"+arr3[0]+"″";
    }


    /**
     * @param filePath
     * @return
     * @description 读取shp文件返回json数据, type 1面 2点
     */
    public static List<String> readShapeFileToStr(String filePath, Integer type) {
        List<String> list = new ArrayList<>();
        try {
            FeatureJSON fjson = new FeatureJSON();
            StringBuffer fsb = new StringBuffer();
            JSONArray array = new JSONArray();

            File file = new File(filePath);
            fsb.append("{\"type\": \"FeatureCollection\",\"features\": ");
            ShapefileDataStore shpDataStore = null;
            shpDataStore = new ShapefileDataStore(file.toURI().toURL());
            //设置字符编码
            Charset charset = Charset.forName("UTF-8");
            shpDataStore.setCharset(charset);
            //获取图层名称
            String typeName = shpDataStore.getTypeNames()[0];
            //数据读取
            SimpleFeatureSource featureSource;
            featureSource = shpDataStore.getFeatureSource(typeName);
            SimpleFeatureCollection sfc = featureSource.getFeatures();
            SimpleFeatureIterator itertor = sfc.features();
            while (itertor.hasNext()) {
                SimpleFeature feature = itertor.next();
                StringWriter writer = new StringWriter();
                fjson.writeFeature(feature, writer);
                JSONObject json = (JSONObject) JSONObject.parse(writer.toString());
                array.add(json);
            }
            for (int i = 0; i < array.size(); i++) {
                Map<String, String> map2 = new HashMap<>();
                //获取每一个JsonObject对象
                JSONObject myjObject = array.getJSONObject(i);
                //获取geometry属性
                JSONObject maps = (JSONObject) myjObject.get("geometry");
                //获取坐标点
                String arrayList = maps.get("coordinates").toString().substring(1, maps.get("coordinates").toString().length() - 1);

                //封装数据
                if (type.equals(1)) {
                    map2.put("type", "polygon");
                    JSONArray corarray = maps.getJSONArray("coordinates");
                    JSONArray json = new JSONArray();
                    if (corarray.size() > 1) {
                        for (int j = 0; j < corarray.size(); j++) {
                            json.add(corarray.getJSONArray(j).getJSONArray(0));
                        }
                        map2.put("rings", json.toJSONString());
                    } else {
                        map2.put("rings", arrayList);
                    }
                } else {
                    map2.put("type", "point");
                    map2.put("rings", arrayList);
                }
                //获取属性
                Object map1 = myjObject.getJSONObject("properties");
                Map<String, String> map11 = (Map) JSON.parse(((JSONObject) map1).toString());
                //构建返回
                Map<String, String> stringObjectMap = new HashMap<>();
                stringObjectMap.put("attributes", net.sf.json.JSONObject.fromObject(map11) + "");
                stringObjectMap.put("geometry", net.sf.json.JSONObject.fromObject(map2) + "");
                list.add(net.sf.json.JSONObject.fromObject(stringObjectMap) + "");
            }
            itertor.close();
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return list;
    }

    public static List<String> pointToStr(String filePath, Integer type) {
        List<String> list = new ArrayList<>();
        try {
            FeatureJSON fjson = new FeatureJSON();
            StringBuffer fsb = new StringBuffer();
            JSONArray array = new JSONArray();

            File file = new File(filePath);
            fsb.append("{\"type\": \"FeatureCollection\",\"features\": ");
            ShapefileDataStore shpDataStore = null;
            shpDataStore = new ShapefileDataStore(file.toURI().toURL());
            //设置字符编码
            Charset charset = Charset.forName("UTF-8");
            shpDataStore.setCharset(charset);
            //获取图层名称
            String typeName = shpDataStore.getTypeNames()[0];
            //数据读取
            SimpleFeatureSource featureSource;
            featureSource = shpDataStore.getFeatureSource(typeName);
            SimpleFeatureCollection sfc = featureSource.getFeatures();
            SimpleFeatureIterator itertor = sfc.features();
            while (itertor.hasNext()) {
                SimpleFeature feature = itertor.next();
                StringWriter writer = new StringWriter();
                fjson.writeFeature(feature, writer);
                JSONObject json = (JSONObject) JSONObject.parse(writer.toString());
                array.add(json);
            }
            for (int i = 0; i < array.size(); i++) {
                Map<String, String> map2 = new HashMap<>();
                //获取每一个JsonObject对象
                JSONObject myjObject = array.getJSONObject(i);
                //获取geometry属性
                JSONObject maps = (JSONObject) myjObject.get("geometry");
                //获取坐标点

                net.sf.json.JSONArray coordinates = net.sf.json.JSONArray.fromObject(maps.get("coordinates"));
                net.sf.json.JSONArray coordinates2 = net.sf.json.JSONArray.fromObject(coordinates.get(0));
                net.sf.json.JSONArray coordinates3 = net.sf.json.JSONArray.fromObject(coordinates2.get(0));
                net.sf.json.JSONArray coordinates4 = net.sf.json.JSONArray.fromObject(coordinates3.get(0));

                String arrayList = coordinates4.get(0)+","+coordinates4.get(1);

                //封装数据
                if (type.equals(1)) {
                    map2.put("type", "polygon");
                    JSONArray corarray = maps.getJSONArray("coordinates");
                    JSONArray json = new JSONArray();
                    if (corarray.size() > 1) {
                        for (int j = 0; j < corarray.size(); j++) {
                            json.add(corarray.getJSONArray(j).getJSONArray(0));
                        }
                        map2.put("rings", json.toJSONString());
                    } else {
                        map2.put("rings", arrayList);
                    }
                } else {
                    map2.put("type", "point");
                    map2.put("rings", arrayList);
                }
                //获取属性
                Object map1 = myjObject.getJSONObject("properties");
                Map<String, String> map11 = (Map) JSON.parse(((JSONObject) map1).toString());
                //构建返回
                Map<String, String> stringObjectMap = new HashMap<>();
                stringObjectMap.put("attributes", net.sf.json.JSONObject.fromObject(map11) + "");
                stringObjectMap.put("geometry", net.sf.json.JSONObject.fromObject(map2) + "");
                list.add(net.sf.json.JSONObject.fromObject(stringObjectMap) + "");
            }
            itertor.close();
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        return list;
    }

    public static void writePoint(List<Map<String, Object>> data, String filePath) {
        try {
            Map<String, Object> map1 = data.get(0);
            Map<String, Object> attributes = (Map<String, Object>) net.sf.json.JSONObject.fromObject(map1.get("attributes"));

            Set<Map.Entry<String, Object>> entries = attributes.entrySet();
            StringBuilder stringBuilder = new StringBuilder("");

            for (Map.Entry<String, Object> entry : entries) {
                stringBuilder.append(entry.getKey()).append(":String").append(",");
            }
            String properties = stringBuilder.toString().substring(0, stringBuilder.toString().length() - 1);
            SimpleFeatureType TYPE = DataUtilities.createType("Location",
                    "the_geom:Point:srid=3857," + // <- the geometry attribute: Point type
                            properties
            );

            List<SimpleFeature> features = new ArrayList<>();
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
            SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
            //构造feature
            for (Map<String, Object> datum : data) {
                Map<String, Object> geometry = (Map<String, Object>) datum.get("geometry");
                Double x = (Double) geometry.get("x");
                Double y = (Double) geometry.get("y");
                Point point = geometryFactory.createPoint(new Coordinate(x, y));
                featureBuilder.add(point);
                //构造属性
                Map<String, Object> attribute = (Map<String, Object>) datum.get("attributes");

                Set<Map.Entry<String, Object>> entrie = attribute.entrySet();

                for (Map.Entry<String, Object> entry : entrie) {
                    featureBuilder.add(entry.getValue());
                }

                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }

            File newFile = new File(filePath);

            ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

            Map<String, Serializable> params = new HashMap<>();
            params.put("url", newFile.toURI().toURL());
            params.put("create spatial index", Boolean.TRUE);

            ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
            newDataStore.setCharset(Charset.forName("UTF-8"));

            Transaction transaction;
            String typeName;
            SimpleFeatureSource featureSource;
            SimpleFeatureType SHAPE_TYPE;
            newDataStore.createSchema(TYPE);

            transaction = new DefaultTransaction("create");

            typeName = newDataStore.getTypeNames()[0];
            featureSource = newDataStore.getFeatureSource(typeName);
            SHAPE_TYPE = featureSource.getSchema();

            if (featureSource instanceof SimpleFeatureStore) {
                SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
                SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
                featureStore.setTransaction(transaction);
                try {
                    featureStore.addFeatures(collection);
                    System.out.println("finish");
                    transaction.commit();
                } catch (Exception problem) {

                    problem.printStackTrace();
                    transaction.rollback();
                } finally {
                    transaction.close();

                }
            } else {
                System.out.println(typeName + " does not support read/write access");
            }
        } catch (Exception problem) {
            log.error(problem.getMessage());
        }

    }

    public static void writeAfterRead(List<Map<String, Object>> data, String filePath) {
//        String filepath = "D:/DevelopTools/sheapf.shp";

        try {

          /*  SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
            builder.setName("Location");
            builder.setCRS(DefaultGeographicCRS.WGS84); // <- Coordinate reference system

            // add attributes in order
            builder.add("the_geom", Point.class);
            builder.length(15).add("Name", Map.class); // <- 15 chars width for name field
            builder.add("number",Integer.class);

            // build the type
            final SimpleFeatureType LOCATION = builder.buildFeatureType();*/
            //TODO 动态拼接字段

            SimpleFeatureType TYPE = null;
            List<SimpleFeature> features = new ArrayList<>();
            //构造feature
            for (Map<String, Object> datum : data) {
                // Map<String, Object> map1 = data.get(0);
                //获取属性,准备拼接要写入shp的属性
                Map<String, Object> attributes = (Map<String, Object>) datum.get("attributes");
                //遍历map,获取属性值
                Set<Map.Entry<String, Object>> entries = attributes.entrySet();
                StringBuilder stringBuilder = new StringBuilder("");
                for (Map.Entry<String, Object> entry : entries) {
                    stringBuilder.append(entry.getKey()).append(":String").append(",");
                }
                String properties = stringBuilder.toString().substring(0, stringBuilder.toString().length() - 1);
                TYPE = DataUtilities.createType("Location",
                        "the_geom:MultiPolygon:srid=3857," + properties
                );


                GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                //获取
                Map<String, Object> geometry = (Map<String, Object>) datum.get("geometry");
                List<List<List<BigDecimal>>> lists = (List<List<List<BigDecimal>>>) geometry.get("rings");
                List<Polygon> polygonList = new ArrayList<>();
                Polygon polygon = null;
                Coordinate[] coordinatesArray = null;
                for (int x = 0; x < lists.size(); x++) {
                    System.out.println("--坐标数组长度--" + lists.get(x).size());
                    coordinatesArray = new Coordinate[lists.get(x).size()];
                    for (int i = 0; i < lists.get(x).size(); i++) {
                        Double lon = 0.0;
                        Double y = 0.0;
                        for (int j = 0; j < lists.get(x).get(i).size(); j++) {
                            if (j == 0) {
                                System.out.println(lists.get(x).get(i).get(j));
                                lon = Double.parseDouble(lists.get(x).get(i).get(j).toPlainString());
                            } else {
                                y = Double.parseDouble(lists.get(x).get(i).get(j).toPlainString());
                            }
                        }
                        Coordinate coordinate = new Coordinate(lon, y);
                        coordinatesArray[i] = coordinate;
                    }

                }
                polygon = geometryFactory.createPolygon(coordinatesArray);

                Polygon[] polygons = {polygon};

                //构造坐标点
                LinearRing linearRing = geometryFactory.createLinearRing(coordinatesArray);

                MultiPolygon multiPolygon = geometryFactory.createMultiPolygon(polygons);
                featureBuilder.add(multiPolygon);

                //构造属性
                Map<String, Object> attribute = (Map<String, Object>) datum.get("attributes");

                Set<Map.Entry<String, Object>> entrie = attribute.entrySet();

                for (Map.Entry<String, Object> entry : entrie) {
                    featureBuilder.add(entry.getValue());
                }


                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }
            /*
             * GeometryFactory will be used to create the geometry attribute of each feature,
             * using a Point object for the location.
             */


//            Point point = geometryFactory.createPoint(new Coordinate(111.159, 23.5568));


            File newFile = new File(filePath);

            ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();

            Map<String, Serializable> params = new HashMap<>();
            params.put("url", newFile.toURI().toURL());
            params.put("create spatial index", Boolean.TRUE);

            ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
            newDataStore.setCharset(Charset.forName("UTF-8"));
            /*
             * TYPE is used as a template to describe the file contents
             */
            Transaction transaction;
            String typeName;
            SimpleFeatureSource featureSource;
            SimpleFeatureType SHAPE_TYPE;

            newDataStore.createSchema(TYPE);

            transaction = new DefaultTransaction("create");

            typeName = newDataStore.getTypeNames()[0];
            featureSource = newDataStore.getFeatureSource(typeName);
            SHAPE_TYPE = featureSource.getSchema();

            /*
             * The Shapefile format has a couple limitations:
             * - "the_geom" is always first, and used for the geometry attribute name
             * - "the_geom" must be of type Point, MultiPoint, MuiltiLineString, MultiPolygon
             * - Attribute names are limited in length
             * - Not all data types are supported (example Timestamp represented as Date)
             *
             * Each data store has different limitations so check the resulting SimpleFeatureType.
             */
            System.out.println("SHAPE:" + SHAPE_TYPE);

            if (featureSource instanceof SimpleFeatureStore) {
                SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
                /*
                 * SimpleFeatureStore has a method to add features from a
                 * SimpleFeatureCollection object, so we use the ListFeatureCollection
                 * class to wrap our list of features.
                 */
                SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
                featureStore.setTransaction(transaction);
                try {
                    featureStore.addFeatures(collection);
                    System.out.println("finish");
                    transaction.commit();
                } catch (Exception problem) {

                    problem.printStackTrace();
                    transaction.rollback();
                } finally {
                    transaction.close();

                }
            } else {
                System.out.println(typeName + " does not support read/write access");
            }
        } catch (Exception problem) {
            log.error(problem.getMessage());
        }

    }

    /**
     * 前端页面来源的json数据处理
     *
     * @param array :JSONArray格式数据
     * @return
     */
    public static String handleWebData(JSONArray array, String filePath) {
        try {
            final SimpleFeatureType TYPE = createFeatureType();
            //在我们创建功能时收集功能的列表
            List<SimpleFeature> features = new ArrayList<>();
            //geometryFactory将用于创建每个要素的几何体属性,使用多边形对象作为位置。
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

            for (int i = 0; i < array.size(); i++) {
                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                JSONObject jobj = (JSONObject) array.get(i);
                JSONArray zhj = jobj.getJSONObject("geometry").getJSONArray("rings");
                if (zhj.size() > 1) {
                    //大于1说明在一条记录中有两个面,需要进行判断
                    //根据面的数量先创建数组,用于最终比较
                    List<Coordinate[]> coords = new ArrayList<>();
                    for (int j = 0; j < zhj.size(); j++) {
                        Coordinate[] coor = new Coordinate[zhj.getJSONArray(j).size()];
                        for (int k = 0; k < zhj.getJSONArray(j).size(); k++) {
                            coor[k] = new Coordinate(zhj.getJSONArray(j).getJSONArray(k).getDouble(0), zhj.getJSONArray(j).getJSONArray(k).getDouble(1));
                        }
                        coords.add(coor);
                    }
                    Polygon[] polygon = new Polygon[coords.size()];
                    for (int j = 0; j < coords.size(); j++) {
                        polygon[j] = geometryFactory.createPolygon(coords.get(j));
                    }
                    MultiPolygon mp = geometryFactory.createMultiPolygon(polygon);
                    featureBuilder.add(mp);
                } else {
                    //根据实际坐标的多少创建数组
                    Coordinate[] coords = new Coordinate[zhj.getJSONArray(0).size()];
                    //跳一级循环,直接获取最终的坐标数组
                    for (int k = 0; k < zhj.getJSONArray(0).size(); k++) {
                        coords[k] = new Coordinate(zhj.getJSONArray(0).getJSONArray(k).getDouble(0), zhj.getJSONArray(0).getJSONArray(k).getDouble(1));
                    }
                    //构造具有给定外部边界的多边形
                    Polygon polygon = geometryFactory.createPolygon(coords);
                    featureBuilder.add(polygon);
                }


                //这里按顺序添加属性
                featureBuilder.add(jobj.getJSONObject("attributes").getString("area"));
                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("ObjectID"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("center"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("name"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("position"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("type"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("region"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("xzqh"));
                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }

            //创建shp文件并写入数据
            if (createSHP(TYPE, features, new File(filePath)).equals("0")) {
                System.out.println("文件保存成功");
            }

        } catch (Exception e) {
            System.out.println("web传入来源数据处理错误");
            System.out.println(e.getMessage());
            return "1";
        }
        return "0";
    }


    /**
     * @param array
     * @param filePath
     * @return java.lang.String
     * @description:写预设红线数据到shp
     * @author zf1017@foxmail.com
     * @motto: Talk is cheap,show me the code
     * @date 2019/10/30 0030 11:04
     */
    public static String importPreRedlinedata(JSONArray array, String filePath) {
        try {
            final SimpleFeatureType TYPE = createFeatureTypeForRedline();
            //在我们创建功能时收集功能的列表
            List<SimpleFeature> features = new ArrayList<>();
            //geometryFactory将用于创建每个要素的几何体属性,使用多边形对象作为位置。
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
            for (int i = 0; i < array.size(); i++) {
                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                JSONObject jobj = (JSONObject) array.get(i);
                JSONArray zhj = jobj.getJSONObject("geometry").getJSONArray("rings");
                if (zhj.size() > 1) {
                    //大于1说明在一条记录中有两个面,需要进行判断
                    //根据面的数量先创建数组,用于最终比较
                    List<Coordinate[]> coords = new ArrayList<>();
                    for (int j = 0; j < zhj.size(); j++) {
                        Coordinate[] coor = new Coordinate[zhj.getJSONArray(j).size()];
                        for (int k = 0; k < zhj.getJSONArray(j).size(); k++) {
                            coor[k] = new Coordinate(zhj.getJSONArray(j).getJSONArray(k).getDouble(0), zhj.getJSONArray(j).getJSONArray(k).getDouble(1));
                        }
                        coords.add(coor);
                    }
                    Polygon[] polygon = new Polygon[coords.size()];
                    for (int j = 0; j < coords.size(); j++) {
                        polygon[j] = geometryFactory.createPolygon(coords.get(j));
                    }
                    MultiPolygon mp = geometryFactory.createMultiPolygon(polygon);
                    featureBuilder.add(mp);
                } else {
                    //根据实际坐标的多少创建数组
                    Coordinate[] coords = new Coordinate[zhj.getJSONArray(0).size()];
                    //跳一级循环,直接获取最终的坐标数组
                    for (int k = 0; k < zhj.getJSONArray(0).size(); k++) {
                        coords[k] = new Coordinate(zhj.getJSONArray(0).getJSONArray(k).getDouble(0), zhj.getJSONArray(0).getJSONArray(k).getDouble(1));
                    }
                    //构造具有给定外部边界的多边形
                    Polygon polygon = geometryFactory.createPolygon(coords);
                    featureBuilder.add(polygon);
                }

                //这里按顺序添加属性

//                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("FID"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("行政区代码"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("面积"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("编号"));
                //featureBuilder.add(jobj.getJSONObject("attributes").getString("类型").substring(0,2));
                //featureBuilder.add(jobj.getJSONObject("attributes").getString("类型").substring(2));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("type"));
                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("OBJECTID"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("生态与植被"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("斑块名称"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("活动类型"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("环境问题"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("管控措施"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("区域性红线"));


                //featureBuilder.add(jobj.getJSONObject("attributes").getString("center"));
//                featureBuilder.set("center",jobj.getJSONObject("attributes").getString("center"));
//				featureBuilder.add(jobj.getJSONObject("attributes").getString("peopleNum"));
                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }


            //创建shp文件并写入数据
            if (createSHP(TYPE, features, new File(filePath)).equals("0")) {
//                System.out.println("文件保存成功");
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("写入shp异常,异常信息为:", e.getMessage());
            System.out.println("web传入来源数据处理错误");
            System.out.println(e.getMessage());
            return "1";
        }
        return "0";
    }

    /**
     * @param array
     * @param filePath
     * @return java.lang.String
     * @description:写预设界桩数据到shp
     * @author zf1017@foxmail.com
     * @motto: Talk is cheap,show me the code
     * @date 2019/10/30 0030 16:28
     */
    public static String importPreMarkerdata(JSONArray array, String filePath) {
        try {
            final SimpleFeatureType TYPE = createFeatureTypeForMarker();
            //在我们创建功能时收集功能的列表
            List<SimpleFeature> features = new ArrayList<>();
            //geometryFactory将用于创建每个要素的几何体属性,使用多边形对象作为位置。
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

            for (int i = 0; i < array.size(); i++) {
                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                JSONObject jobj = (JSONObject) array.get(i);
                JSONArray zhj = jobj.getJSONObject("geometry").getJSONArray("rings");
                if(zhj!=null){
                    if (zhj.size() > 1) {
                        //大于1说明在一条记录中有两个面,需要进行判断
                        //根据面的数量先创建数组,用于最终比较
                        List<Coordinate[]> coords = new ArrayList<>();
                        for (int j = 0; j < zhj.size(); j++) {
                            Coordinate[] coor = new Coordinate[zhj.getJSONArray(j).size()];
                            for (int k = 0; k < zhj.getJSONArray(j).size(); k++) {
                                coor[k] = new Coordinate(zhj.getJSONArray(j).getJSONArray(k).getDouble(0), zhj.getJSONArray(j).getJSONArray(k).getDouble(1));
                            }
                            coords.add(coor);
                        }
                        Polygon[] polygon = new Polygon[coords.size()];
                        for (int j = 0; j < coords.size(); j++) {
                            polygon[j] = geometryFactory.createPolygon(coords.get(j));
                        }
                            MultiPolygon mp = geometryFactory.createMultiPolygon(polygon);
                            featureBuilder.add(mp);
                        } else {
                            //根据实际坐标的多少创建数组
                            Coordinate[] coords = new Coordinate[zhj.getJSONArray(0).size()];
                            //跳一级循环,直接获取最终的坐标数组
                            for (int k = 0; k < zhj.getJSONArray(0).size(); k++) {
                                coords[k] = new Coordinate(zhj.getJSONArray(0).getJSONArray(k).getDouble(0), zhj.getJSONArray(0).getJSONArray(k).getDouble(1));
                            }
                            //构造具有给定外部边界的多边形
                            Polygon polygon = geometryFactory.createPolygon(coords);
                            featureBuilder.add(polygon);
                        }
                }else{
                    Coordinate coordinate = new Coordinate(jobj.getJSONObject("geometry").getDoubleValue("X"),jobj.getJSONObject("geometry").getDoubleValue("Y"));
                    Point point = geometryFactory.createPoint(coordinate);
                    featureBuilder.add(point);
                }
                //这里按顺序添加属性

                featureBuilder.add(jobj.getJSONObject("attributes").getString("编号"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("pac"));
                featureBuilder.add(jobj.getJSONObject("attributes").getDoubleValue("X坐标"));
                featureBuilder.add(jobj.getJSONObject("attributes").getDoubleValue("Y坐标"));
                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("redline_id"));
                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("OBJECTID_1"));

//                featureBuilder.add(jobj.getJSONObject("attributes").getString("attribute"));
                //featureBuilder.add(jobj.getJSONObject("attributes").getString("center"));
//                featureBuilder.set("center",jobj.getJSONObject("attributes").getString("center"));
//				featureBuilder.add(jobj.getJSONObject("attributes").getString("peopleNum"));
                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }


            //创建shp文件并写入数据
            if (createSHP(TYPE, features, new File(filePath)).equals("0")) {
//                System.out.println("文件保存成功");
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("写入shp异常,异常信息为:", e.getMessage());
            System.out.println("web传入来源数据处理错误");
            System.out.println(e.getMessage());
            return "1";
        }
        return "0";
    }

    public static String importPoint(JSONArray array, String filePath) {
        try {
            final SimpleFeatureType TYPE = createFeatureTypeForMarker2();
            //在我们创建功能时收集功能的列表
            List<SimpleFeature> features = new ArrayList<>();
            //geometryFactory将用于创建每个要素的几何体属性,使用多边形对象作为位置。
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();


            for (int i = 0; i < array.size(); i++) {
                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                JSONObject jobj = (JSONObject) array.get(i);

                String string = jobj.getJSONObject("geometry").getString("rings");
                String[] split = string.split(",");
                Coordinate coordinate = new Coordinate(Double.valueOf(split[0]),Double.valueOf(split[1]));
                Point point = geometryFactory.createPoint(coordinate);
                featureBuilder.add(point);

                //这里按顺序添加属性
                featureBuilder.add(jobj.getJSONObject("attributes").getString("area"));
                featureBuilder.add(jobj.getJSONObject("attributes").getInteger("ORIG_FID"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("active"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("type"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("control"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("pac"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("problem"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("redline"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("plant"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("name"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("attribute"));
                featureBuilder.add(jobj.getJSONObject("attributes").getInteger("Id"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("hxcode"));

                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }


            //创建shp文件并写入数据
            if (createSHP(TYPE, features, new File(filePath)).equals("0")) {
                System.out.println("文件保存成功");
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("写入shp异常,异常信息为:", e);
            return "1";
        }
        return "0";
    }


    public static String importPreBoarddata(JSONArray array, String filePath) {
        try {
            final SimpleFeatureType TYPE = createFeatureTypeForBoard();
            //在我们创建功能时收集功能的列表
            List<SimpleFeature> features = new ArrayList<>();
            //geometryFactory将用于创建每个要素的几何体属性,使用多边形对象作为位置。
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();

            for (int i = 0; i < array.size(); i++) {
                SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);
                JSONObject jobj = (JSONObject) array.get(i);
                JSONArray zhj = jobj.getJSONObject("geometry").getJSONArray("rings");
                if(zhj!=null){


                if (zhj.size() > 1) {
                    //大于1说明在一条记录中有两个面,需要进行判断
                    //根据面的数量先创建数组,用于最终比较
                    List<Coordinate[]> coords = new ArrayList<>();
                    for (int j = 0; j < zhj.size(); j++) {
                        Coordinate[] coor = new Coordinate[zhj.getJSONArray(j).size()];
                        for (int k = 0; k < zhj.getJSONArray(j).size(); k++) {
                            coor[k] = new Coordinate(zhj.getJSONArray(j).getJSONArray(k).getDouble(0), zhj.getJSONArray(j).getJSONArray(k).getDouble(1));
                        }
                        coords.add(coor);
                    }
                    Polygon[] polygon = new Polygon[coords.size()];
                    for (int j = 0; j < coords.size(); j++) {
                        polygon[j] = geometryFactory.createPolygon(coords.get(j));
                    }
                    MultiPolygon mp = geometryFactory.createMultiPolygon(polygon);
                    featureBuilder.add(mp);
                } else {
                        //根据实际坐标的多少创建数组
                        Coordinate[] coords = new Coordinate[zhj.getJSONArray(0).size()];
                        //跳一级循环,直接获取最终的坐标数组
                        for (int k = 0; k < zhj.getJSONArray(0).size(); k++) {
                            coords[k] = new Coordinate(zhj.getJSONArray(0).getJSONArray(k).getDouble(0), zhj.getJSONArray(0).getJSONArray(k).getDouble(1));
                        }
                        //构造具有给定外部边界的多边形
                        Polygon polygon = geometryFactory.createPolygon(coords);
                        featureBuilder.add(polygon);
                    }
                }else{
                    Coordinate coordinate = new Coordinate(jobj.getJSONObject("geometry").getDoubleValue("X"),jobj.getJSONObject("geometry").getDoubleValue("Y"));
                    Point point = geometryFactory.createPoint(coordinate);
                    featureBuilder.add(point);
                }

                //这里按顺序添加属性


                featureBuilder.add(jobj.getJSONObject("attributes").getDoubleValue("X坐标"));
                featureBuilder.add(jobj.getJSONObject("attributes").getDoubleValue("Y坐标"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("hxcode"));
                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("redline_id"));
                featureBuilder.add(jobj.getJSONObject("attributes").getString("编号"));
                featureBuilder.add(jobj.getJSONObject("attributes").getIntValue("OBJECTID_1"));
//                featureBuilder.add(jobj.getJSONObject("attributes").getString("attribute"));
                //featureBuilder.add(jobj.getJSONObject("attributes").getString("center"));
//                featureBuilder.set("center",jobj.getJSONObject("attributes").getString("center"));
//				featureBuilder.add(jobj.getJSONObject("attributes").getString("peopleNum"));
                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }


            //创建shp文件并写入数据
            if (createSHP(TYPE, features, new File(filePath)).equals("0")) {
//                System.out.println("文件保存成功");
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("写入shp异常,异常信息为:", e.getMessage());
            System.out.println("web传入来源数据处理错误");
            System.out.println(e.getMessage());
            return "1";
        }
        return "0";
    }


    /**
     * 创建shp文件并写入数据
     *
     * @param TYPE:         空间数据模板
     * @param features:数据内容
     * @return
     */
    private static String createSHP(SimpleFeatureType TYPE, List<SimpleFeature> features, File newFile) {
        try {
            //从FeatureCollection创建shapefile
            //DataStoreFactory与参数一起使用表示我们想要空间索引
            //使用createSchema(SimpleFeatureType)方法来设置shapefile
            ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
            Map<String, Serializable> params = new HashMap<>();
            params.put("url", newFile.toURI().toURL());
            params.put("create spatial index", Boolean.TRUE);

            ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
            //设置字符编码
            Charset charset = Charset.forName("UTF-8");
            newDataStore.setCharset(charset);

            //TYPE被用作描述文件内容的模板
            newDataStore.createSchema(TYPE);

            //将特征数据写入shapefile
            //在SimpleFeatureStore我们使用要做到这一点需要一个FeatureCollection对象,所以我们总结我们的一个功能列表ListFeatureCollection。
            //使用transaction.commit()安全地一次性写出功能
            Transaction transaction = new DefaultTransaction("create");

            String typeName = newDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
            SimpleFeatureType SHAPE_TYPE = featureSource.getSchema();

            System.out.println("SHAPE:" + SHAPE_TYPE);

            if (featureSource instanceof SimpleFeatureStore) {
                SimpleFeatureStore featureStore = (SimpleFeatureStore) featureSource;
                SimpleFeatureCollection collection = new ListFeatureCollection(TYPE, features);
                featureStore.setTransaction(transaction);
                try {
                    featureStore.addFeatures(collection);
                    transaction.commit();
                } catch (Exception problem) {
                    problem.printStackTrace();
                    transaction.rollback();
                } finally {
                    transaction.close();
                }
                //System.exit(0); // success!
            } else {
                System.out.println(typeName + " 不支持读/写访问");
                // System.exit(1);
            }

        } catch (Exception e) {
            System.out.println(e.toString());
            return "1";
        }
        return "0";
    }




    /**
     * 定义空间数据模板
     *
     * @return
     */
    private static SimpleFeatureType createFeatureType() {
        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
        builder.setName("Location");
        builder.setCRS(DefaultGeographicCRS.WGS84); // 坐标参考系


        // 按顺序添加属性
        builder.add("the_geom", MultiPolygon.class);//必须放最上面

        builder.length(100).add("area", String.class);
        builder.add("ObjectID", Integer.class);
        builder.length(100).add("center", String.class);
        builder.length(100).add("name", String.class);// 字段的宽度为100个字符
        builder.length(100).add("position", String.class);
        builder.length(100).add("type", String.class);
        builder.length(100).add("region", String.class);
        builder.length(100).add("xzqh", String.class);




        // 生成类型
        final SimpleFeatureType LOCATION = builder.buildFeatureType();
        return LOCATION;
    }

    /**
     * @param
     * @return org.opengis.feature.simple.SimpleFeatureType
     * @description:导入预设红线数据模板
     * @author zf1017@foxmail.com
     * @motto: Talk is cheap,show me the code
     * @date 2019/10/29 0029 17:03
     */
    private static SimpleFeatureType createFeatureTypeForRedline() {
        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();

        builder.setName("Location");
        builder.setCRS(DefaultGeographicCRS.WGS84); // 坐标参考系
        // 按顺序添加属性
        builder.add("the_geom", MultiPolygon.class);
//        builder.add("FID", Integer.class);
        //  builder.length(100).add("puct", String.class);// 字段的宽度为100个字符
        // builder.length(100).add("type", String.class);
        // builder.length(100).add("region", String.class);
        // builder.length(100).add("position", String.class);

//        String area = new String("面积".getBytes("ISO-8859-1"), "UTF-8");
        builder.length(100).add("pac", String.class);
        builder.length(100).add("area", String.class);

        builder.length(100).add("hxcode", String.class);
        builder.length(100).add("type", String.class);
        builder.length(100).add("attribute", String.class);
        builder.length(100).add("Id", Integer.class);
        builder.length(100).add("plant", String.class);
        builder.length(100).add("name", String.class);
        builder.length(100).add("active", String.class);
        builder.length(100).add("problem", String.class);
        builder.length(100).add("control", String.class);
        builder.length(100).add("redline", String.class);



        // 生成类型
        final SimpleFeatureType LOCATION = builder.buildFeatureType();
        return LOCATION;
    }

    /**
     * @param
     * @return org.opengis.feature.simple.SimpleFeatureType
     * @description:导入预设界桩数据模板
     * @author zf1017@foxmail.com
     * @motto: Talk is cheap,show me the code
     * @date 2019/10/30 0030 14:31
     */
    private static SimpleFeatureType createFeatureTypeForMarker() {
        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
        builder.setName("Location");
        builder.setCRS(DefaultGeographicCRS.WGS84); // 坐标参考系
        // 按顺序添加属性
        builder.add("the_geom", MultiPolygon.class);
        builder.add("jzcode", String.class);
        builder.length(100).add("pac", String.class);
        builder.length(100).add("longitude", Double.class);
        builder.length(100).add("latitude", Double.class);
        builder.length(100).add("redline_id", Integer.class);
        builder.length(100).add("objectid", Integer.class);


        // 生成类型
        final SimpleFeatureType LOCATION = builder.buildFeatureType();
        return LOCATION;
    }

    private static SimpleFeatureType createFeatureTypeForMarker2() {
        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
        builder.setName("Location");
        builder.setCRS(DefaultGeographicCRS.WGS84); // 坐标参考系
        // 按顺序添加属性
        builder.add("the_geom", MultiPolygon.class);

        builder.length(100).add("area", String.class);
        builder.length(100).add("ORIG_FID", Integer.class);
        builder.length(100).add("active", String.class);
        builder.length(100).add("type", String.class);
        builder.length(100).add("control", String.class);
        builder.length(100).add("pac", String.class);
        builder.length(100).add("problem", String.class);
        builder.length(100).add("redline", String.class);
        builder.length(100).add("plant", String.class);
        builder.length(100).add("name", String.class);
        builder.length(100).add("attribute", String.class);
        builder.length(100).add("Id", Integer.class);
        builder.length(100).add("hxcode", String.class);

        // 生成类型
        final SimpleFeatureType LOCATION = builder.buildFeatureType();
        return LOCATION;
    }

    private static SimpleFeatureType createFeatureTypeForBoard() {
        SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();
        builder.setName("Location");
        builder.setCRS(DefaultGeographicCRS.WGS84); // 坐标参考系
        //builder.setSRS("EPSG:3857");
        // 按顺序添加属性
        builder.add("the_geom", MultiPolygon.class);
        builder.length(100).add("longitude", Double.class);
        builder.length(100).add("latitude", Double.class);
        builder.length(100).add("hxcode", String.class);
        builder.length(100).add("redline_id", Integer.class);
        builder.length(100).add("number",String.class);
        builder.length(100).add("objectid", Integer.class);



        // 生成类型
        final SimpleFeatureType LOCATION = builder.buildFeatureType();
        return LOCATION;
    }

    /**
     * 对从shp文件读取到的数据进行处理
     *
     * @param array:空间几何图形
     * @return
     */
    public static String handleSHPData(JSONArray array) {
        try {
            System.out.println(array.toString());

            final SimpleFeatureType TYPE = createFeatureType();
            //在我们创建功能时收集功能的列表
            List<SimpleFeature> features = new ArrayList<>();
            //geometryFactory将用于创建每个要素的几何体属性,使用多边形对象作为位置。
            GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
            SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(TYPE);

            for (int i = 1; i < array.size(); i++) {
                JSONObject jobj = (JSONObject) array.get(i);
                JSONArray zhj = jobj.getJSONObject("geometry").getJSONArray("coordinates");
                JSONArray lin = new JSONArray();
                for (int j = 0; j < zhj.size(); j++) {
                    for (int k = 0; k < zhj.getJSONArray(j).size(); k++) {
                        for (int l = 0; l < zhj.getJSONArray(j).getJSONArray(k).size(); l++) {
                            lin.add(zhj.getJSONArray(j).getJSONArray(k).getJSONArray(l));
                        }
                    }
                }

                Coordinate[] coords = new Coordinate[lin.size()];
                for (int j = 0; j < lin.size(); j++) {
                    coords[j] = new Coordinate(lin.getJSONArray(j).getDouble(0), lin.getJSONArray(j).getDouble(1));
                }

                Polygon polygon = geometryFactory.createPolygon(coords);
                featureBuilder.add(polygon);
                SimpleFeature feature = featureBuilder.buildFeature(null);
                features.add(feature);
            }

            //创建shp文件并写入数据
            if (createSHP(TYPE, features, new File("E:\\3857\\111111.shp")).equals("0")) {
//                System.out.println("文件保存成功");
            }

        } catch (Exception e) {
            System.out.println("文件来源数据处理错误");
            System.out.println(e.getMessage());
            return "1";
        }
        return "0";
    }

    public static Object getSHP(@RequestBody String shpPath) {
        ResultVO result = new ResultVO();

        //存储坐标数组
        JSONArray array = new JSONArray();

        try {
            //定义shp文件的绝对路径
            File file = new File(shpPath);

            FeatureJSON fjson = new FeatureJSON();
            StringBuffer fsb = new StringBuffer();
            fsb.append("{\"type\": \"FeatureCollection\",\"features\": ");

            //读取shp文件内容
            Map<String, Serializable> params = new HashMap<>();
            params.put("url", file.toURI().toURL());
            ShapefileDataStoreFactory dataStoreFactory = new ShapefileDataStoreFactory();
            ShapefileDataStore newDataStore = (ShapefileDataStore) dataStoreFactory.createNewDataStore(params);
            Charset charset = Charset.forName("UTF-8");
            newDataStore.setCharset(charset);
            String typeName = newDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = newDataStore.getFeatureSource(typeName);
            SimpleFeatureCollection collection = featureSource.getFeatures();
            SimpleFeatureIterator features = collection.features();

            while (features.hasNext()) {
                SimpleFeature feature = features.next();
                StringWriter writer = new StringWriter();
                fjson.writeFeature(feature, writer);
                JSONObject json = (JSONObject) JSONObject.parse(writer.toString());
                array.add(json);
            }
            features.close();
            fsb.append(array.toString());
            fsb.append("}");
            System.out.println(array.toString());

            result.setMsg("ok");
            result.setData(fsb);
            //result.setStatus(Status.SUCCESS);
        } catch (Exception e) {
            System.out.println("读取SHP文件异常");
            System.out.println(e.getMessage());
            //result.setStatus(Status.SYSTEM_EXCEPTION);
            result.setMsg("系统异常");
        }

        //对文件来源的空间数据进行处理
//		if(handleSHPData(array).equals("0")){
//			System.out.println("数据处理成功");
//		}
        //对前端返回的的空间数据进行处理
     /*   if(handleWebData(array,shpPath).equals("0")){
            System.out.println("数据处理成功");
        }*/
        return result;
    }






}