Jelajahi Sumber

shapefile导出改为按图层名称,5个字符截断。使用GB18030字符编码,兼容GBK和GB23

欧阳劲驰 1 bulan lalu
induk
melakukan
0a54617dce

+ 1 - 2
src/main/java/com/shkpr/service/alambizplugin/commtools/ShapeUtils.java

@@ -11,7 +11,6 @@ import org.opengis.feature.simple.SimpleFeatureType;
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.HashMap;
@@ -71,9 +70,9 @@ public class ShapeUtils {
         Map<String, Serializable> params = new HashMap<>();
         params.put(ShapefileDataStoreFactory.URLP.key, filePath.toUri().toURL());
         params.put(ShapefileDataStoreFactory.CREATE_SPATIAL_INDEX.key, Boolean.TRUE);
+        params.put(ShapefileDataStoreFactory.DBFCHARSET.key, "GB18030");
 
         ShapefileDataStore dataStore = (ShapefileDataStore) dataStoreFactory.createDataStore(params);
-        dataStore.setCharset(StandardCharsets.UTF_8);
         dataStore.createSchema(TYPE);
 
         //启动事务

+ 60 - 29
src/main/java/com/shkpr/service/alambizplugin/commtools/ThirdImportTemplateUtils.java

@@ -4,6 +4,7 @@ import com.shkpr.service.alambizplugin.constants.GisMetadataDefine;
 import com.shkpr.service.alambizplugin.constants.GisSurveyExcelDefine;
 import com.shkpr.service.alambizplugin.dto.GisMetadataLayerTemplate;
 import com.shkpr.service.alambizplugin.dto.GisMetadataPropertyTemplate;
+import com.shkpr.service.alambizplugin.dto.GisSurveyLayerApply;
 import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
@@ -17,9 +18,54 @@ import java.util.Objects;
  * @since 1.0.0
  */
 public class ThirdImportTemplateUtils {
+    /**
+     * 获取图层模版
+     *
+     * @param data           数据
+     * @param layerTemplates 图层模版
+     * @param kind           数据类型
+     * @return 图层模版
+     */
+    public static GisMetadataLayerTemplate getLayerTemplate(Map<String, String> data
+            , List<GisMetadataLayerTemplate> layerTemplates, String kind) {
+        //图层文件key
+        String layKey = null;
+        if (Objects.equals(kind, GisMetadataDefine.TYPE_KINE.POINT))
+            layKey = GisSurveyExcelDefine.FILE.POINT_LAYER;
+        if (Objects.equals(kind, GisMetadataDefine.TYPE_KINE.LINE))
+            layKey = GisSurveyExcelDefine.FILE.LINE_LAYER;
+        if (layKey == null) return null;
+
+        //过滤对应模版
+        String finalLayKey = layKey;
+        return layerTemplates.stream()
+                .filter(template -> StringUtils.isNotBlank(template.getName())
+                        && Objects.equals(template.getName(), data.get(finalLayKey))
+                        && Objects.equals(template.getKind(), kind)
+                )
+                .findFirst().orElse(null);
+    }
+
+    /**
+     * 获取图层模版
+     *
+     * @param data           数据
+     * @param layerTemplates 图层模版
+     * @return 图层模版
+     */
+    public static GisMetadataLayerTemplate getLayerTemplate(GisSurveyLayerApply data, List<GisMetadataLayerTemplate> layerTemplates) {
+        if (StringUtils.isBlank(data.getLayer()) || StringUtils.isBlank(data.getKind())) return null;
+        //过滤对应模版
+        return layerTemplates.stream()
+                .filter(template -> StringUtils.isNotBlank(template.getName())
+                        && Objects.equals(template.getKey(), data.getLayer())
+                        && Objects.equals(template.getKind(), data.getKind())
+                )
+                .findFirst().orElse(null);
+    }
 
     /**
-     * 获取模版
+     * 获取属性模版
      *
      * @param data           数据
      * @param layerTemplates 图层模版集合
@@ -37,7 +83,20 @@ public class ThirdImportTemplateUtils {
         return layerTemplate.getPropertyTemplates().stream()
                 .filter(template -> Objects.equals(propertyKey, template.getKey()))
                 .findFirst().orElse(null);
+    }
 
+    /**
+     * 获取属性模版
+     *
+     * @param layerTemplate 图层模版
+     * @param propertyKey   属性模版key
+     * @return 点号
+     */
+    public static GisMetadataPropertyTemplate getPropertyTemplate(GisMetadataLayerTemplate layerTemplate, String propertyKey) {
+        //提取点号模版
+        return layerTemplate.getPropertyTemplates().stream()
+                .filter(template -> Objects.equals(propertyKey, template.getKey()))
+                .findFirst().orElse(null);
     }
 
     /**
@@ -90,32 +149,4 @@ public class ThirdImportTemplateUtils {
         GisMetadataLayerTemplate layerTemplate = getLayerTemplate(data, layerTemplates, kind);
         return getValue(data, layerTemplate, propertyKey);
     }
-
-    /**
-     * 获取图层模版
-     *
-     * @param data           数据
-     * @param layerTemplates 图层模版
-     * @param kind           数据类型
-     * @return 图层模版
-     */
-    public static GisMetadataLayerTemplate getLayerTemplate(Map<String, String> data
-            , List<GisMetadataLayerTemplate> layerTemplates, String kind) {
-        //图层文件key
-        String layKey = null;
-        if (Objects.equals(kind, GisMetadataDefine.TYPE_KINE.POINT))
-            layKey = GisSurveyExcelDefine.FILE.POINT_LAYER;
-        if (Objects.equals(kind, GisMetadataDefine.TYPE_KINE.LINE))
-            layKey = GisSurveyExcelDefine.FILE.LINE_LAYER;
-        if (layKey == null) return null;
-
-        //过滤对应模版
-        String finalLayKey = layKey;
-        return layerTemplates.stream()
-                .filter(template -> StringUtils.isNotBlank(template.getName())
-                        && Objects.equals(template.getName(), data.get(finalLayKey))
-                        && Objects.equals(template.getKind(), kind)
-                )
-                .findFirst().orElse(null);
-    }
 }

+ 23 - 19
src/main/java/com/shkpr/service/alambizplugin/components/GisSurveyThirdExporter.java

@@ -6,6 +6,7 @@ import com.shkpr.service.alambizplugin.commproperties.TempFileProperties;
 import com.shkpr.service.alambizplugin.commtools.CompressorUtils;
 import com.shkpr.service.alambizplugin.commtools.ExcelUtils;
 import com.shkpr.service.alambizplugin.commtools.ShapeUtils;
+import com.shkpr.service.alambizplugin.commtools.ThirdImportTemplateUtils;
 import com.shkpr.service.alambizplugin.constants.CommAsyncStatusEnum;
 import com.shkpr.service.alambizplugin.constants.ExcelEnum;
 import com.shkpr.service.alambizplugin.constants.FileTypeEnum;
@@ -321,7 +322,7 @@ public class GisSurveyThirdExporter {
                 .flatMap(it -> it.getPropertyTemplates().stream())
                 .sorted(Comparator.comparing(GisMetadataPropertyTemplate::getOrdering))
                 .map(it ->
-                        StringUtils.substring(it.getKey(), 0, 10) + ":"
+                        StringUtils.substring(it.getName(), 0, 5) + ":"
                                 + (StringUtils.isBlank(it.getType()) ? "string" : it.getType())
                 )
                 .distinct()
@@ -331,7 +332,7 @@ public class GisSurveyThirdExporter {
                 .flatMap(it -> it.getPropertyTemplates().stream())
                 .sorted(Comparator.comparing(GisMetadataPropertyTemplate::getOrdering))
                 .map(it ->
-                        StringUtils.substring(it.getKey(), 0, 10) + ":"
+                        StringUtils.substring(it.getName(), 0, 5) + ":"
                                 + (StringUtils.isBlank(it.getType()) ? "string" : it.getType())
                 )
                 .distinct()
@@ -374,26 +375,29 @@ public class GisSurveyThirdExporter {
     private List<Map<String, Object>> buildShapeItemData(List<GisSurveyLayerApply> layerApplies, List<GisMetadataLayerTemplate> layerTemplates) {
         return layerApplies.parallelStream()
                 .map(it -> {
-                    //处理模版数据
-                    Map<String, Object> rowData = it.getPropertyValues().stream()
-                            .filter(it1 -> !StringUtils.isAnyBlank(it1.getProperty(), it1.getValue()))
-                            .collect(Collectors.toMap(gisSurveyPropertyValue ->
-                                            StringUtils.substring(gisSurveyPropertyValue.getProperty(), 0, 10)
-                                    , GisSurveyPropertyValue::getValue
-                                    , (i1, i2) -> i1)
-                            );
+                    Map<String, Object> rowData = new HashMap<>();
+                    //获取图层模版
+                    GisMetadataLayerTemplate layerTemplate = ThirdImportTemplateUtils.getLayerTemplate(it, layerTemplates);
                     //处理图层数据
-                    if (StringUtils.isNotBlank(it.getLayer())) {
-                        //获取模版
-                        GisMetadataLayerTemplate gisMetadataLayerTemplate = layerTemplates.stream()
-                                .filter(it1 -> Objects.equals(it1.getKey(), it.getLayer()))
-                                .findFirst().orElse(null);
+                    if (layerTemplate != null) {
                         //存入图层
-                        if (gisMetadataLayerTemplate != null)
-                            rowData.put(GisSurveyExcelDefine.FILE.LAYER, gisMetadataLayerTemplate.getName());
-                        //存入geom
-                        rowData.put(GisSurveyExcelDefine.FILE.THE_GEOM, it.getGis());
+                        if (GisMetadataDefine.TYPE_KINE.POINT.equals(it.getKind()))
+                            rowData.put(GisSurveyExcelDefine.FILE.POINT_LAYER, layerTemplate.getName());
+                        if (GisMetadataDefine.TYPE_KINE.LINE.equals(it.getKind()))
+                            rowData.put(GisSurveyExcelDefine.FILE.LINE_LAYER, layerTemplate.getName());
+                        //遍历属性
+                        it.getPropertyValues().forEach(propertyValue -> {
+                            //获取属性模版
+                            GisMetadataPropertyTemplate propertyTemplate = ThirdImportTemplateUtils
+                                    .getPropertyTemplate(layerTemplate, propertyValue.getProperty());
+                            //填入属性数据
+                            if (propertyTemplate != null)
+                                rowData.put(StringUtils.substring(propertyTemplate.getName(), 0, 5)
+                                        , propertyValue.getValue());
+                        });
                     }
+                    //存入geom
+                    rowData.put(GisSurveyExcelDefine.FILE.THE_GEOM, it.getGis());
                     return rowData;
                 }).collect(Collectors.toList());
     }

+ 2 - 3
src/main/java/com/shkpr/service/alambizplugin/constants/GisSurveyExcelDefine.java

@@ -13,8 +13,8 @@ public interface GisSurveyExcelDefine {
     interface FILE_HANDLE {
         Integer HEADER_ROW_NUM = 1;
         Integer DATA_ROW_NUM = 2;
-        String POINT_SPEC = "the_geom:Point:srid=4490,layer:String,";
-        String LINE_SPEC = "the_geom:LineString:srid=4490,layer:String,";
+        String POINT_SPEC = "the_geom:Point:srid=4490,点类型:String,";
+        String LINE_SPEC = "the_geom:LineString:srid=4490,线类型:String,";
     }
 
     /**
@@ -22,7 +22,6 @@ public interface GisSurveyExcelDefine {
      */
     interface FILE {
         String THE_GEOM = "the_geom";
-        String LAYER = "layer";
         String POINT_LAYER = "点类型";
         String LINE_LAYER = "线类型";
     }