张洋洋
2025-02-24 9804628abf554c3658345fc8fc9472cfb179fd5f
src/main/java/com/se/simu/config/InitConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,184 @@
package com.se.simu.config;
import com.se.simu.helper.CaffeineHelper;
import com.se.simu.helper.GdalHelper;
import com.se.simu.helper.WebHelper;
import lombok.extern.slf4j.Slf4j;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
import org.gdal.ogr.*;
import org.gdal.osr.SpatialReference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
@SuppressWarnings("ALL")
public class InitConfig implements ApplicationRunner {
    @Resource
    Environment env;
    @Value("${server.port}")
    String serverPort;
    @Value("${config.cacheTime}")
    Integer cacheTime;
    @Value("${server.servlet.context-path}")
    String contextPath;
    @Override
    public void run(ApplicationArguments args) {
        // noinspection AlibabaRemoveCommentedCode
        try {
            log.info("***************** åˆå§‹åŒ– GDAL *****************" + "\n");
            GdalHelper.init(env.getProperty("config.gdalPath"));
            CaffeineHelper.init(cacheTime);
            String path = null != contextPath && contextPath.length() > 1 ? contextPath : "";
            log.info("API文档:http://localhost:" + serverPort + path + "/doc.html");
            log.info("API文档:http://{}:{}{}/doc.html", WebHelper.getHostIp(), serverPort, path);
            log.info("***************** ç³»ç»Ÿå¯åŠ¨å®Œæ¯• *****************" + "\n");
            //log.info("***************** è¯»å–tif文件 *****************" + "\n");
            // è¯»å–tif文件
            //readTif("D:\\soft\\env\\tif\\srtm_12_03.tif");
            //log.info("***************** è¯»å–tif文件完毕 *****************" + "\n");
            //log.info("***************** è¯»å–shp文件 *****************" + "\n");
            // è¯»å–shp文件
            //readShp("D:\\soft\\env\\雨量站点数据\\雨量站点_84\\雨量站点_84.shp");
            //log.info("***************** è¯»å–shp文件完毕 *****************" + "\n");
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
    }
    /**
     * è¯»å–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();
    }
    /**
     * è¯»å– Shapefile æ–‡ä»¶å¹¶æ‰“印属性和几何数据
     *
     * @param shapefilePath SHP æ–‡ä»¶è·¯å¾„
     */
    public void readShp(String strVectorFile) {
        // æ³¨å†Œæ‰€æœ‰çš„驱动
        ogr.RegisterAll();
        // ä¸ºäº†æ”¯æŒä¸­æ–‡è·¯å¾„,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        // ä¸ºäº†ä½¿å±žæ€§è¡¨å­—段支持中文,请添加下面这句
        gdal.SetConfigOption("SHAPE_ENCODING", "CP936");
        // è¯»å–数据,这里以ESRI的shp文件为例
        String strDriverName = "ESRI Shapefile";
        // åˆ›å»ºä¸€ä¸ªæ–‡ä»¶ï¼Œæ ¹æ®strDriverName扩展名自动判断驱动类型
        org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);
        if (oDriver == null) {
            System.out.println(strDriverName + " é©±åŠ¨ä¸å¯ç”¨ï¼\n");
            return;
        }
        DataSource dataSource = oDriver.Open(strVectorFile);
        //Layer layer = dataSource.GetLayer("test");
        Layer layer = dataSource.GetLayer(0);
        for (int i = 0; i < dataSource.GetLayerCount(); i++) {
            Layer layerIdx = dataSource.GetLayer(i);
            System.out.println("图层名称:<==>" + layerIdx.GetName());
        }
        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();
        int fieldCount = featureDefn.GetFieldCount();
        Map<String, String> fieldMap = new HashMap<String, String>();
        for (int i = 0; i < fieldCount; i++) {
            FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);
            // å¾—到属性字段类型
            int fieldType = fieldDefn.GetFieldType();
            String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);
            // å¾—到属性字段名称
            String fieldName = fieldDefn.GetName();
            fieldMap.put(fieldTypeName, fieldName);
        }
        System.out.println();
        System.out.println("fileMap:");
        System.out.println(fieldMap);
        System.out.println(layer.GetFeature(1).GetGeometryRef().ExportToJson());
        System.out.println(layer.GetFeature(2).GetGeometryRef().ExportToJson());
        System.out.println(layer.GetFeature(3).GetGeometryRef().ExportToJson());
        for (int i = 0; i < 12; i++) {
            Feature feature = layer.GetFeature(i);
            Object[] arr = fieldMap.values().toArray();
            for (int k = 0; k < arr.length; k++) {
                String fvalue = feature.GetFieldAsString(arr[k].toString());
                System.out.println(" å±žæ€§åç§°:" + arr[k].toString() + ",属性值:" + fvalue);
            }
        }
    }
}