1
13693261870
2024-09-14 c07a4aa6ecabddb15e0e4ca2a8c3524bf05d3e7a
src/main/java/com/se/simu/helper/ShpHelper.java
@@ -1,16 +1,13 @@
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 org.gdal.osr.SpatialReference;
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * ShapeFile帮助类
@@ -21,43 +18,31 @@
@Slf4j
@SuppressWarnings("ALL")
public class ShpHelper {
    public static boolean createShp(String path, SeLayer seLayer) {
    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 null;
//            }
//
//            String filePath = path + File.separator + type.toLowerCase() + ".shp";
//            // DataSource ds = driver.Open(filePath, 0)
//            dataSource = driver.CreateDataSource(filePath, null);
//            if (null == dataSource) {
//                return null;
//            }
//
//            int geoType = getGeometryType(type);
//            layer = dataSource.CreateLayer(type.toLowerCase(), GeoHelper.sr104903, geoType);
//            if (null == layer) {
//                return null;
//            }
//
//            List<Field> fields = new ArrayList<>();
//            GdbHelper.getFields(MarkJsonEntity.class, fields, StaticData.MARK_EXCLUDE_FIELDS);
//            GdbHelper.addLayerField(layer, fields);
            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 (MarkJsonEntity t : list) {
            //    Feature f = new Feature(featureDefn);
            //    GdbHelper.setFeatureData(f, fields, t);
            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();
            //    Geometry geo = Geometry.CreateFromWkt(t.getWkt());
            //    f.SetGeometry(geo);
            //
            //    layer.CreateFeature(f);
            //}
                layer.CreateFeature(f);
            }
            return true;
        } catch (Exception ex) {
@@ -68,19 +53,52 @@
        }
    }
    /**
     * 获取图形类型
     */
    private static void setFeatureData(Feature f, List<SeField> fields, JSONArray arr) {
        //
    }
    private static Geometry createGeometry() {
        Geometry g = null;
        //
        return g;
    }
    private static int getGeometryType(String type) {
        switch (type) {
            case "POINT":
            case "point":
                return ogr.wkbPoint;
            case "LINESTRING":
                return ogr.wkbLineString;
            case "POLYGON":
                return ogr.wkbPolygon;
            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;
        }
    }
}