From ae3ca6829a5bae6088b6f6a005377f11fee03df8 Mon Sep 17 00:00:00 2001
From: 13693261870 <252740454@qq.com>
Date: 星期一, 31 十月 2022 17:17:37 +0800
Subject: [PATCH] 1

---
 src/main/java/com/lf/server/entity/ctrl/MarkJsonEntity.java     |   54 ++++++++++
 src/main/java/com/lf/server/controller/show/MarkController.java |   41 ++++++++
 src/main/java/com/lf/server/helper/WebHelper.java               |   18 +++
 src/main/java/com/lf/server/service/show/MarkService.java       |   61 ++++++++++++
 src/main/java/com/lf/server/entity/ctrl/IdNameEntity.java       |    6 +
 src/main/java/com/lf/server/helper/GdalHelper.java              |  100 +++++++++++++++----
 data/db_fn.sql                                                  |   13 -
 src/main/java/com/lf/server/entity/ctrl/FileInfoEntity.java     |    6 +
 8 files changed, 266 insertions(+), 33 deletions(-)

diff --git a/data/db_fn.sql b/data/db_fn.sql
index 985f573..9857e0a 100644
--- a/data/db_fn.sql
+++ b/data/db_fn.sql
@@ -236,12 +236,9 @@
 and optime group by to_char(optime, 'yyyy-mm-dd') order by to_char(optime, 'yyyy-mm-dd') asc;
 ----------------------------------------------------------------------------------------------------- 
 select a.*,coalesce(a.native,'') from lf.sys_user a;
-select * from lf.sys_menu order by id;
-
-select * from lf.sys_blacklist where type = 1;
-select * from lf.sys_operate where modular1 is null or modular2 is null;
-select count(*) from bd.dlg_agnp;
-select count(*) from bd.dlg_25w_aanp;
+select ST_PointFromText('POINT(95.80461853400004 34.13862467200005)');
+select ST_LineFromText('LINESTRING(04.98985101830993 37.43840773692756,104.99318913447104 37.43883729720358)', 4326);
+select ST_PolygonFromText('POLYGON((104.9907822932683 37.43532941961706,104.99088987736599 37.43532941961706,104.9908670336867 37.4349030213574,104.99078327712658 37.4349030213574,104.9907822932683 37.43532941961706))',4326);
 
 -- 114ms锛�180/3248
 select count(1) from bd.dlg_agnp a where ST_Intersects(geom, 
@@ -252,9 +249,7 @@
 and ST_Intersects(geom, 
 ST_PolygonFromText('POLYGON ((115.94927385452 32.3754479115071 0,121.989371092554 32.2766788010181 0,121.850621222894 29.6874200067864 0,115.9727267226 29.7835368627922 0,115.94927385452 32.3754479115071 0))', 4326))
 
-select id,uname "name" from lf.sys_user where uname like '%瀹�%' order by uname limit 10;
-select id,name from lf.sys_dep where name like '%鍙�%' order by order_num limit 10;
-
+select st_astext(geom) from bd.dlg_25w_hfcl limit 10;
 
 
 
diff --git a/src/main/java/com/lf/server/controller/show/MarkController.java b/src/main/java/com/lf/server/controller/show/MarkController.java
index f9ec04b..2ff0d1f 100644
--- a/src/main/java/com/lf/server/controller/show/MarkController.java
+++ b/src/main/java/com/lf/server/controller/show/MarkController.java
@@ -2,9 +2,12 @@
 
 import com.lf.server.aspect.SysLog;
 import com.lf.server.controller.all.BaseController;
+import com.lf.server.entity.all.HttpStatus;
 import com.lf.server.entity.all.ResponseMsg;
+import com.lf.server.entity.ctrl.MarkJsonEntity;
 import com.lf.server.entity.show.MarkEntity;
 import com.lf.server.entity.sys.UserEntity;
+import com.lf.server.helper.WebHelper;
 import com.lf.server.service.show.MarkService;
 import com.lf.server.service.sys.TokenService;
 import io.swagger.annotations.Api;
@@ -15,6 +18,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -202,4 +206,41 @@
             return fail(ex.getMessage(), -1);
         }
     }
+
+    @SysLog()
+    @ApiOperation(value = "涓婁紶ShapeFile鏂囦欢")
+    @ResponseBody
+    @PostMapping(value = "/uploadShp", produces = "application/json; charset=UTF-8")
+    public ResponseMsg<List<MarkJsonEntity>> uploadShp(HttpServletRequest req, HttpServletResponse res) {
+        try {
+            List<MarkJsonEntity> list = null;
+
+            return success(list);
+        } catch (Exception ex) {
+            return fail(ex.getMessage(), null);
+        }
+    }
+
+    @SysLog()
+    @ApiOperation(value = "涓嬭浇ShapeFile鏂囦欢")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "list", value = "鏍囩粯JSON瀹炰綋绫婚泦鍚�", dataType = "MarkJsonEntity", paramType = "body")
+    })
+    @ResponseBody
+    @PostMapping(value = "/downloadShp", produces = "application/json; charset=UTF-8")
+    public void downloadShp(@RequestBody List<MarkJsonEntity> list, HttpServletRequest req, HttpServletResponse res) {
+        try {
+            UserEntity ue = tokenService.getCurrentUser(req);
+            if (ue == null) {
+                WebHelper.write2Page(res, WebHelper.getErrJson(HttpStatus.UNAUTHORIZED, "鐢ㄦ埛鏈櫥褰�"));
+            }
+            if (list == null || list.isEmpty()) {
+                WebHelper.write2Page(res, WebHelper.getErrJson(HttpStatus.BAD_REQUEST, "鎵句笉鍒版爣缁樺疄浣�"));
+            }
+
+            markService.downloadShp(ue, list, req, res);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+        }
+    }
 }
diff --git a/src/main/java/com/lf/server/entity/ctrl/FileInfoEntity.java b/src/main/java/com/lf/server/entity/ctrl/FileInfoEntity.java
index c0bf1cb..99cd5c2 100644
--- a/src/main/java/com/lf/server/entity/ctrl/FileInfoEntity.java
+++ b/src/main/java/com/lf/server/entity/ctrl/FileInfoEntity.java
@@ -1,10 +1,14 @@
 package com.lf.server.entity.ctrl;
 
+import java.io.Serializable;
+
 /**
  * 鏂囦欢淇℃伅
  * @author WWW
  */
-public class FileInfoEntity {
+public class FileInfoEntity implements Serializable {
+    private static final long serialVersionUID = -674723262772248619L;
+
     private String fileName;
 
     private Long size;
diff --git a/src/main/java/com/lf/server/entity/ctrl/IdNameEntity.java b/src/main/java/com/lf/server/entity/ctrl/IdNameEntity.java
index 0ce7f11..1c1ac0e 100644
--- a/src/main/java/com/lf/server/entity/ctrl/IdNameEntity.java
+++ b/src/main/java/com/lf/server/entity/ctrl/IdNameEntity.java
@@ -1,10 +1,14 @@
 package com.lf.server.entity.ctrl;
 
+import java.io.Serializable;
+
 /**
  * ID-鍚嶇О瀹炰綋绫�
  * @author WWW
  */
-public class IdNameEntity {
+public class IdNameEntity implements Serializable {
+    private static final long serialVersionUID = -8485687857643406110L;
+
     private Integer id;
 
     private String name;
diff --git a/src/main/java/com/lf/server/entity/ctrl/MarkJsonEntity.java b/src/main/java/com/lf/server/entity/ctrl/MarkJsonEntity.java
new file mode 100644
index 0000000..1f65218
--- /dev/null
+++ b/src/main/java/com/lf/server/entity/ctrl/MarkJsonEntity.java
@@ -0,0 +1,54 @@
+package com.lf.server.entity.ctrl;
+
+import java.io.Serializable;
+
+/**
+ * 鏍囩粯JSON瀹炰綋绫�
+ * @author WWW
+ */
+public class MarkJsonEntity implements Serializable {
+    private static final long serialVersionUID = 7776629022021914001L;
+
+    private Integer id;
+
+    private String name;
+
+    private String wkt;
+
+    private String props;
+
+    public MarkJsonEntity() {
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getWkt() {
+        return wkt;
+    }
+
+    public void setWkt(String wkt) {
+        this.wkt = wkt;
+    }
+
+    public String getProps() {
+        return props;
+    }
+
+    public void setProps(String props) {
+        this.props = props;
+    }
+}
diff --git a/src/main/java/com/lf/server/helper/GdalHelper.java b/src/main/java/com/lf/server/helper/GdalHelper.java
index 1d0f0df..5d64ca8 100644
--- a/src/main/java/com/lf/server/helper/GdalHelper.java
+++ b/src/main/java/com/lf/server/helper/GdalHelper.java
@@ -1,5 +1,6 @@
 package com.lf.server.helper;
 
+import com.lf.server.entity.ctrl.MarkJsonEntity;
 import com.lf.server.entity.ctrl.ShpRecordEntity;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -11,6 +12,7 @@
 import org.gdal.ogr.*;
 import org.gdal.osr.SpatialReference;
 
+import java.io.File;
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.time.LocalDate;
@@ -72,8 +74,81 @@
 
             return new ShpRecordEntity(wkt, csid);
         } catch (Exception ex) {
-            ex.printStackTrace();
+            log.error(ex.getMessage(), ex);
             return null;
+        }
+    }
+
+    /**
+     * 鍒涘缓ShapeFile鏂囦欢
+     *
+     * @param list 鏍囩粯JSON瀹炰綋绫婚泦鍚�
+     * @param path 璺緞
+     * @param type 绫诲瀷锛歅OINT,LINESTRING,POLYGON
+     * @return ShapeFile鏂囦欢鍚�
+     */
+    public static String createShp(List<MarkJsonEntity> list, String path, String type) {
+        try {
+            org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile");
+            if (driver == null) {
+                return null;
+            }
+
+            String filePath = path + File.separator + type.toLowerCase() + ".shp";
+            //DataSource ds = driver.Open(filePath, 0);
+            DataSource ds = driver.CreateDataSource(filePath, null);
+
+            SpatialReference sr = new SpatialReference();
+            sr.ImportFromEPSG(4326);
+
+            int geoType = getGeometryType(type);
+            Layer layer = ds.CreateLayer(type.toLowerCase(), sr, geoType);
+
+            FieldDefn fdName = new FieldDefn("name", ogr.OFTString);
+            fdName.SetWidth(50);
+            layer.CreateField(fdName, 0);
+
+            FieldDefn fdProps = new FieldDefn("props", ogr.OFTString);
+            fdProps.SetWidth(1024);
+            // layer.DeleteField(layer.FindFieldIndex("name", 1));
+            layer.CreateField(fdProps, 1);
+
+            FeatureDefn featureDefn = layer.GetLayerDefn();
+            for (MarkJsonEntity mje : list) {
+                Geometry geo = Geometry.CreateFromWkt(mje.getWkt());
+
+                Feature f = new Feature(featureDefn);
+                f.SetField(0, mje.getName());
+                f.SetField(1, mje.getProps());
+                f.SetGeometry(geo);
+
+                layer.CreateFeature(f);
+            }
+
+            layer.delete();
+            ds.delete();
+            driver.delete();
+
+            return filePath;
+        } catch (Exception ex) {
+            log.error(ex.getMessage(), ex);
+            return null;
+        }
+    }
+
+    /**
+     * 鑾峰彇鍥惧舰绫诲瀷
+     */
+    private static int getGeometryType(String type) {
+        switch (type) {
+            case "POINT":
+                return 1;
+            case "LINESTRING":
+                return 2;
+            case "POLYGON":
+                return 3;
+            default:
+                return -1;
         }
     }
 
@@ -111,29 +186,9 @@
         gdal.GDALDestroyDriverManager();
     }
 
-    private static void writeShp(String filePath) {
-        try {
-            org.gdal.ogr.Driver driver = ogr.GetDriverByName("ESRI shapefile");
-            if (driver == null) {
-                System.out.println(" ESRI shapefile椹卞姩涓嶅彲鐢紒\n");
-                System.out.println("fail");
-            }
-
-            // Open()鐨勭浜屼釜鍙傛暟榛樿涓�0锛屾槸浠ュ彧璇绘柟寮忔墦寮�鏂囦欢锛�1鏄鍐欐柟寮忔墦寮�
-            DataSource dSource = driver.Open(filePath, 0);
-
-            Layer layer = dSource.GetLayerByIndex(0);
-            FieldDefn fieldDefn = new FieldDefn("name", ogr.OFTString);
-            fieldDefn.SetWidth(50);
-            layer.CreateField(fieldDefn, 1);
-            layer.DeleteField(layer.FindFieldIndex("name", 1));
-        } catch (Exception ex) {
-            ex.printStackTrace();
-        }
-    }
-
     /**
      * 璇诲彇shp鏂囦欢
+     *
      * @param filePath
      */
     public static void readShp(String filePath) {
@@ -257,6 +312,7 @@
 
     /**
      * 璇诲彇gdb鏂囦欢
+     *
      * @param filePath
      */
     public static void readGdb(String filePath) {
diff --git a/src/main/java/com/lf/server/helper/WebHelper.java b/src/main/java/com/lf/server/helper/WebHelper.java
index 3ab27d1..4014998 100644
--- a/src/main/java/com/lf/server/helper/WebHelper.java
+++ b/src/main/java/com/lf/server/helper/WebHelper.java
@@ -1,5 +1,8 @@
 package com.lf.server.helper;
 
+import com.alibaba.fastjson.JSON;
+import com.lf.server.entity.all.HttpStatus;
+import com.lf.server.entity.all.ResponseMsg;
 import com.lf.server.entity.all.SettingData;
 import com.lf.server.entity.all.StaticData;
 import org.springframework.web.context.request.RequestContextHolder;
@@ -14,6 +17,7 @@
 import java.io.PrintWriter;
 import java.sql.Timestamp;
 import java.util.Calendar;
+import java.util.Random;
 import java.util.UUID;
 
 /**
@@ -261,4 +265,18 @@
 
         return false;
     }
+
+    /**
+     * 鑾峰彇閿欒JSON
+     */
+    public static String getErrJson(HttpStatus status, String msg) {
+        return JSON.toJSONString(new ResponseMsg<String>(status, msg));
+    }
+
+    /**
+     * 鑾峰彇闅忔満鏁存暟
+     */
+    public static int getRandomInt(int min, int max) {
+        return new Random().nextInt(max) % (max - min + 1) + min;
+    }
 }
diff --git a/src/main/java/com/lf/server/service/show/MarkService.java b/src/main/java/com/lf/server/service/show/MarkService.java
index 59e2e77..d54f484 100644
--- a/src/main/java/com/lf/server/service/show/MarkService.java
+++ b/src/main/java/com/lf/server/service/show/MarkService.java
@@ -1,12 +1,26 @@
 package com.lf.server.service.show;
 
+import com.lf.server.entity.ctrl.MarkJsonEntity;
 import com.lf.server.entity.show.MarkEntity;
+import com.lf.server.entity.sys.UserEntity;
+import com.lf.server.helper.GdalHelper;
+import com.lf.server.helper.PathHelper;
 import com.lf.server.helper.StringHelper;
+import com.lf.server.helper.WebHelper;
 import com.lf.server.mapper.show.MarkMapper;
+import com.lf.server.service.data.UploaderService;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Random;
 
 /**
  * 鏍囩粯
@@ -16,6 +30,9 @@
 public class MarkService implements MarkMapper {
     @Autowired
     MarkMapper markMapper;
+
+    @Autowired
+    PathHelper pathHelper;
 
     @Override
     public Integer selectCount(Integer uid) {
@@ -66,4 +83,48 @@
     public Integer updates(List<MarkEntity> list) {
         return markMapper.updates(list);
     }
+
+    public void downloadShp(UserEntity ue, List<MarkJsonEntity> list, HttpServletRequest req, HttpServletResponse res) {
+        String path = getShpDir(ue);
+
+        List<MarkJsonEntity> points = getMarkByType(list, "POINT");
+        if (points.size() > 0) {
+            String pointFile = GdalHelper.createShp(points, path, "POINT");
+        }
+        List<MarkJsonEntity> lines = getMarkByType(list, "LINESTRING");
+        if (lines.size() > 0) {
+            String lineFile = GdalHelper.createShp(lines, path, "LINESTRING");
+        }
+        List<MarkJsonEntity> polygons = getMarkByType(list, "POLYGON");
+        if (polygons.size() > 0) {
+            String polygonFile = GdalHelper.createShp(polygons, path, "POLYGON");
+        }
+
+        //
+    }
+
+    private String getShpDir(UserEntity ue) {
+        String path = pathHelper.getTempPath(ue.getId()) + File.separator + WebHelper.getRandomInt(100000, 1000000);
+
+        File file = new File(path);
+        if (!file.exists() && !file.isDirectory()) {
+            file.mkdirs();
+        }
+
+        return path;
+    }
+
+    private List<MarkJsonEntity> getMarkByType(List<MarkJsonEntity> list, String type) {
+        List<MarkJsonEntity> rs = new ArrayList<MarkJsonEntity>();
+        for (MarkJsonEntity mark : list) {
+            if (StringHelper.isEmpty(mark.getWkt())) {
+                continue;
+            }
+            if (mark.getWkt().indexOf(type) > -1) {
+                rs.add(mark);
+            }
+        }
+
+        return rs;
+    }
 }

--
Gitblit v1.9.3