管道基础大数据平台系统开发-【后端】-Server
1
sws
2022-11-26 ab849f796bdc17236a95ea5fe5c166fb8f24a75c
src/main/java/com/lf/server/helper/GdalHelper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,359 @@
package com.lf.server.helper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.gdal.gdal.Band;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdal.Dataset;
import org.gdal.gdalconst.gdalconstConstants;
import org.gdal.ogr.*;
import org.gdal.osr.SpatialReference;
import java.sql.Time;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * GDAL帮助类
 * @author WWW
 */
@SuppressWarnings("ALL")
public class GdalHelper {
    private final static Log log = LogFactory.getLog(GdalHelper.class);
    public static void init() {
        // æ³¨å†Œæ‰€æœ‰çš„驱动
        gdal.AllRegister();
        // ä¸ºäº†æ”¯æŒä¸­æ–‡è·¯å¾„,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        // é…ç½®GDAL_DATA路径(gdal根目录下的bin\gdal-data)
        // gdal.SetConfigOption("GDAL_DATA", "E:\\terrait\\TianJin\\Zip\\release-1928-x64-dev\\release-1928-x64\\bin\\gdal-data");
        // gdal.SetConfigOption("PROJ_LIB", "E:\\terrait\\TianJin\\Zip\\release-1928-x64-dev\\release-1928-x64\\bin\\proj7\\share");
        // ä¸ºäº†ä½¿å±žæ€§è¡¨å­—段支持中文,请添加下面这句:CP936
        gdal.SetConfigOption("SHAPE_ENCODING", "");
    }
    /**
     * è¯»å–tif文件
     *
     * @param fileName
     */
    public static void readTif(String fileName) {
        // è¯»å–影像数据
        Dataset dataset = gdal.Open(fileName, gdalconstConstants.GA_ReadOnly);
        if (dataset == null) {
            System.out.println("read fail!");
            return;
        }
        // providing various methods for a format specific driver.
        Driver driver = dataset.GetDriver();
        System.out.println("driver name: " + driver.getLongName());
        // è¯»å–影像信息
        int xSize = dataset.getRasterXSize();
        int ySzie = dataset.getRasterYSize();
        int rasterCount = dataset.getRasterCount();
        System.out.println("dataset xSize: " + xSize + ", ySzie = " + ySzie + ", rasterCount = " + rasterCount);
        Band band = dataset.GetRasterBand(1);
        // the data type of the band.
        int type = band.GetRasterDataType();
        System.out.println("data type = " + type + ", " + (type == gdalconstConstants.GDT_Byte));
        // Frees the native resource associated to a Dataset object and close the file.
        dataset.delete();
        gdal.GDALDestroyDriverManager();
    }
    /**
     * è¯»å–shp文件
     *
     * @param filePath
     */
    public static void readShp(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");
            }
            DataSource dataSource = driver.Open(filePath);
            Layer layer = dataSource.GetLayer(0);
            String layerName = layer.GetName();
            System.out.println("图层名称:" + layerName);
            SpatialReference spatialReference = layer.GetSpatialRef();
            // System.out.println(spatialReference)
            System.out.println("空间参考坐标系:" + spatialReference.GetAttrValue("AUTHORITY", 0) + spatialReference.GetAttrValue("AUTHORITY", 1));
            double[] layerExtent = layer.GetExtent();
            System.out.println("图层范围:minx:" + layerExtent[0] + ",maxx:" + layerExtent[1] + ",miny:" + layerExtent[2] + ",maxy:" + layerExtent[3]);
            FeatureDefn featureDefn = layer.GetLayerDefn();
            Map<String, Object> fieldMap = new HashMap(5);
            for (int i = 0, count = featureDefn.GetFieldCount(); i < count; i++) {
                FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
                //得到属性字段类型
                int fieldType = fieldDefn.GetFieldType();
                String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
                //得到属性字段名称
                String fieldName = fieldDefn.GetName();
                fieldMap.put(fieldTypeName, fieldName);
            }
            long featureCount = layer.GetFeatureCount();
            System.out.println("图层要素个数:" + featureCount);
            for (int i = 0; i < featureCount; i++) {
                Feature feature = layer.GetFeature(i);
                Object[] arr = fieldMap.values().toArray();
                for (int k = 0; k < arr.length; k++) {
                    String value = feature.GetFieldAsString(arr[k].toString());
                    System.out.print(" å±žæ€§åç§°:" + arr[k].toString() + ",属性值:" + value);
                }
                System.out.println();
                break;
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public static void getLayerDto(String filePath) {
        org.gdal.ogr.Driver driver = ogr.GetDriverByName("OpenFileGDB");
        if (driver == null) {
            return;
        }
        List<Map> list = new ArrayList<>();
        List<Map<String, String>> mapList = new ArrayList<>();
        DataSource dataSource = null;
        try {
            dataSource = driver.Open(filePath, 0);
            int num = dataSource.GetLayerCount();
            for (int i = 0; i < num; i++) {
                //  èŽ·å–å›¾å±‚
                Layer layer = dataSource.GetLayer(i);
                // è¡¨åç§°
                String strlayerName = layer.GetName();
                // èŽ·å–å›¾å±‚è¦æ•°ä¸ªæ•°
                long count = layer.GetFeatureCount();
                if (0 != count) {
                    do {
                        // èŽ·å–å›¾å±‚ä¸‹çš„è¦ç´ 
                        Feature feature = layer.GetNextFeature();
                        if (null == feature) {
                            break;
                        }
                        // èŽ·å–è¾¹ç•Œåæ ‡
                        Geometry geometry = feature.GetGeometryRef();
                        if (geometry != null) {
                            String geometryJson = geometry.ExportToJson();
                            String str = geometryJson.substring(geometryJson.lastIndexOf(":") + 1, geometryJson.length());
                            if (!" [ [ ] ] }".equals(str)) {
                                String s1 = str.substring(7, str.length() - 8);
                                String[] split = s1.replaceAll(" ", "").replaceAll("\\[", "").replaceAll("]", "").split(",");
                                List<String> xList = new ArrayList();
                                List<String> yList = new ArrayList();
                                Map<String, String> map1 = new HashMap(5);
                                for (int j = 0; j < split.length; j++) {
                                    if (j != (split.length - 1) && j % 2 == 0) {
                                        map1.put(split[j], split[j + 1]);
                                    }
                                }
                                mapList.add(map1);
                            }
                        }
                        Map map = new HashMap(5);
                        //获取属性
                        for (int p = 0; p < feature.GetFieldCount(); p++) {
                            map.put(feature.GetFieldDefnRef(p).GetName(), getProperty(feature, p));
                        }
                        list.add(map);
                        feature.delete();
                    } while (true);
                }
                //layerDto.setLayerName(strlayerName);
                //layerDto.setList(list);
                //layerDto.setCount(count);
                //layerDto.setMap(mapList);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (dataSource != null) {
                dataSource.delete();
            }
        }
    }
    /**
     * è¯»å–gdb文件
     *
     * @param filePath
     */
    public static void readGdb(String filePath) {
        try {
            org.gdal.ogr.Driver driver = ogr.GetDriverByName("OpenFileGDB");
            if (driver == null) {
                return;
            }
            DataSource dataSource = driver.Open(filePath, 0);
            for (int i = 0, count = dataSource.GetLayerCount(); i < count; i++) {
                // èŽ·å–å›¾å±‚
                Layer layer = dataSource.GetLayer(i);
                System.out.println(i + "\t" + layer.GetName());
                do {
                    // èŽ·å–å›¾å±‚ä¸‹çš„è¦ç´ 
                    Feature feature = layer.GetNextFeature();
                    if (null == feature) {
                        break;
                    }
                    // èŽ·å–æ ·å¼ï¼Œè¿™é‡Œæ˜¯ç©ºï¼Œå¾…ç¡®å®š
                    System.out.println(feature.GetStyleString());
                    // èŽ·å–geometry,也可以ExportToWkb() gml等等
                    System.out.println(feature.GetGeometryRef().ExportToWkt());
                    // èŽ·å–å±žæ€§
                    System.out.println("----------------------------------");
                    for (int p = 0; p < feature.GetFieldCount(); p++) {
                        System.out.println(feature.GetFieldDefnRef(p).GetName() + "\t" + getProperty(feature, p));
                    }
                    System.out.println("----------------------------------");
                    break;
                } while (true);
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    public static Object getProperty(Feature feature, int index) {
        int type = feature.GetFieldType(index);
        PropertyGetter propertyGetter;
        if (type < 0 || type >= PROPERTY_GETTERS.length) {
            propertyGetter = STRING_PROPERTY_GETTER;
        } else {
            propertyGetter = PROPERTY_GETTERS[type];
        }
        try {
            return propertyGetter.get(feature, index);
        } catch (Exception ex) {
            // ex.printStackTrace()
            log.error(ex.getMessage(), ex);
            return null;
        }
    }
    /**
     * å±žæ€§èŽ·å–å™¨
     */
    @FunctionalInterface
    private interface PropertyGetter {
        /**
         * èŽ·å–å±žæ€§
         *
         * @param feature
         * @param index
         * @return
         */
        Object get(Feature feature, int index);
    }
    private static final PropertyGetter STRING_PROPERTY_GETTER = (feature, index) -> feature.GetFieldAsString(index);
    /**
     * feature.GetFieldType(index)得到一个属性类型的int值,该值对应具体类型
     */
    private static final PropertyGetter[] PROPERTY_GETTERS = new PropertyGetter[]{
            // 0-Integer
            (feature, index) -> feature.GetFieldAsInteger(index),
            // 1-IntegerList
            (feature, index) -> feature.GetFieldAsIntegerList(index),
            // 2-Real
            (feature, index) -> feature.GetFieldAsDouble(index),
            // 3-RealList
            (feature, index) -> feature.GetFieldAsDoubleList(index),
            // 4-String
            STRING_PROPERTY_GETTER,
            // 5-StringList
            (feature, index) -> feature.GetFieldAsStringList(index),
            // 6-unknown
            STRING_PROPERTY_GETTER,
            // 7-unknown
            STRING_PROPERTY_GETTER,
            // 8-Binary
            (feature, index) -> feature.GetFieldAsBinary(index),
            // 9-Date
            (feature, index) -> {
                int[] pnYear = new int[1];
                int[] pnMonth = new int[1];
                int[] pnDay = new int[1];
                int[] pnHour = new int[1];
                int[] pnMinute = new int[1];
                float[] pfSecond = new float[1];
                int[] pnTZFlag = new int[1];
                feature.GetFieldAsDateTime(index, pnYear, pnMonth, pnDay, pnHour, pnMinute, pfSecond, pnTZFlag);
                java.sql.Date date = java.sql.Date.valueOf(LocalDate.of(pnYear[0], pnMonth[0], pnDay[0]));
                return date;
            },
            // 10-Time
            (feature, index) -> {
                int[] pnYear = new int[1];
                int[] pnMonth = new int[1];
                int[] pnDay = new int[1];
                int[] pnHour = new int[1];
                int[] pnMinute = new int[1];
                float[] pfSecond = new float[1];
                int[] pnTZFlag = new int[1];
                feature.GetFieldAsDateTime(index, pnYear, pnMonth, pnDay, pnHour, pnMinute, pfSecond, pnTZFlag);
                float fSecond = pfSecond[0];
                int s = (int) fSecond;
                int ns = (int) (1000000000 * fSecond - s);
                Time time = Time.valueOf(LocalTime.of(pnHour[0], pnMinute[0], s, ns));
                return time;
            },
            // 11-DateTime
            (feature, index) -> {
                int[] pnYear = new int[1];
                int[] pnMonth = new int[1];
                int[] pnDay = new int[1];
                int[] pnHour = new int[1];
                int[] pnMinute = new int[1];
                float[] pfSecond = new float[1];
                int[] pnTZFlag = new int[1];
                feature.GetFieldAsDateTime(index, pnYear, pnMonth, pnDay, pnHour, pnMinute, pfSecond, pnTZFlag);
                float fSecond = pfSecond[0];
                int s = (int) fSecond;
                int ns = (int) (1000000000 * fSecond - s);
                LocalDateTime localDateTime = LocalDateTime.of(
                        LocalDate.of(pnYear[0], pnMonth[0], pnDay[0]),
                        LocalTime.of(pnHour[0], pnMinute[0], s, ns)
                );
                Timestamp timestamp = Timestamp.valueOf(localDateTime);
                return timestamp;
            },
            // 12-Integer64
            (feature, index) -> feature.GetFieldAsInteger64(index),
            // 13 Integer64List
            (feature, index) -> feature.GetFieldAsIntegerList(index)
            // >=14   (unknown)
    };
}