From ab849f796bdc17236a95ea5fe5c166fb8f24a75c Mon Sep 17 00:00:00 2001
From: sws <15810472099@163.com>
Date: 星期六, 26 十一月 2022 16:12:02 +0800
Subject: [PATCH] 1

---
 src/main/java/com/lf/server/helper/GdalHelper.java |  359 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 359 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/lf/server/helper/GdalHelper.java b/src/main/java/com/lf/server/helper/GdalHelper.java
new file mode 100644
index 0000000..4add775
--- /dev/null
+++ b/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();
+
+        // 涓轰簡鏀寔涓枃璺緞锛岃娣诲姞涓嬮潰杩欏彞浠g爜
+        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
+
+        // 閰嶇疆GDAL_DATA璺緞锛坓dal鏍圭洰褰曚笅鐨刡in\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");
+
+        // 涓轰簡浣垮睘鎬ц〃瀛楁鏀寔涓枃锛岃娣诲姞涓嬮潰杩欏彞锛欳P936
+        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("鍥惧眰鑼冨洿锛歮inx:" + 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)
+    };
+}

--
Gitblit v1.9.3