11
13693261870
2024-09-14 3cb59a73e67c684229294b8a93dc325933ddf218
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package com.se.simu.helper;
 
import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONArray;
import com.se.simu.domain.SeField;
import com.se.simu.domain.SeLayer;
import lombok.extern.slf4j.Slf4j;
import org.gdal.ogr.*;
 
import java.util.List;
 
/**
 * ShapeFile帮助类
 *
 * @author WWW
 * @date 2024-09-13
 */
@Slf4j
@SuppressWarnings("ALL")
public class ShpHelper {
    public static boolean createShp(String filePath, SeLayer seLayer) {
        Driver driver = null;
        DataSource dataSource = null;
        Layer layer = null;
        try {
            driver = ogr.GetDriverByName("ESRI shapefile");
            if (null == driver) return false;
 
            dataSource = driver.CreateDataSource(filePath, null);
            if (null == dataSource) return false;
 
            int geoType = getGeometryType(seLayer.getQueryType());
            layer = dataSource.CreateLayer(FileUtil.getName(filePath), seLayer.getDb().getSpatialReference(), geoType);
            if (null == layer) return false;
 
            createLayerFields(layer, seLayer.getFields());
 
            FeatureDefn featureDefn = layer.GetLayerDefn();
            for (int i = 0, c = seLayer.getData().size(); i < c; i++) {
                Feature f = new Feature(featureDefn);
                setFeatureData(f, seLayer.getFields(), seLayer.getData().getJSONArray(i));
                Geometry g = createGeometry();
 
                layer.CreateFeature(f);
            }
 
            return true;
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
            return false;
        } finally {
            GdalHelper.delete(layer, dataSource, driver);
        }
    }
 
    private static void setFeatureData(Feature f, List<SeField> fields, JSONArray arr) {
        for (int i = 0, c = fields.size(); i < c; i++) {
            SeField seField = fields.get(i);
            switch (seField.getType()) {
                case "int":
 
                    break;
                case "long":
 
                    break;
                case "double":
 
                    break;
                case "datetime":
 
                    break;
                default:
 
                    break;
            }
        }
 
    }
 
    private static Geometry createGeometry() {
        Geometry g = null;
        //
 
        return g;
    }
 
    private static int getGeometryType(String type) {
        switch (type) {
            case "point":
                return ogr.wkbPoint;
            case "polyline":
                return ogr.wkbMultiLineString;
            case "polygon":
                return ogr.wkbMultiPolygon;
            default:
                return ogr.wkbUnknown;
        }
    }
 
    private static void createLayerFields(Layer layer, List<SeField> fields) {
        for (int i = 0, c = fields.size(); i < c; i++) {
            SeField f = fields.get(i);
            FieldDefn fd = new FieldDefn(f.getName(), getFieldType(f));
 
            layer.CreateField(fd, i);
        }
    }
 
    private static Integer getFieldType(SeField f) {
        switch (f.getType()) {
            case "int":
                return ogr.OFTInteger;
            case "long":
                return ogr.OFTInteger64;
            case "double":
                return ogr.OFTReal;
            case "datetime":
                return ogr.OFTDateTime;
            default:
                return ogr.OFTString;
        }
    }
}