张洋洋
2025-02-24 9804628abf554c3658345fc8fc9472cfb179fd5f
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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);
            }
        }
    }
 
 
}