java解析nc气象数据

发布于:2025-07-25 ⋅ 阅读:(15) ⋅ 点赞:(0)
1.1pom.xml
        <dependency>
            <groupId>edu.ucar</groupId>
            <artifactId>netcdfAll</artifactId>
            <version>5.4.1</version>
        </dependency>
1.2 netcdf使用
    /*
     * @param  type 0 ,1, 2  wind 1 or 2  其他 0 .
     * @return Map
     * */
    public Map initJson(String ncFileFullPath, String name, long timeIndex, byte type) {

        // 打开 NetCDF 文件
        try (NetcdfFile ncFile = NetcdfFile.open(ncFileFullPath)) {
            //遍历nc文件中的每个变量,输出json数据

            // 读取其中的变量
            Variable uVar = ncFile.findVariable(name);
            Variable latVar = ncFile.findVariable("lat");
            Variable lonVar = ncFile.findVariable("lon");
            Variable timeVar = ncFile.findVariable("time");

            Array latdata = latVar.read();
            Double[] latList = Arrays.stream(latdata.toString().split(" ")).map(s -> Double.parseDouble(s)).toArray(Double[]::new);
            Array londata = lonVar.read();
            Double[] lonList = Arrays.stream(londata.toString().split(" ")).map(s -> Double.parseDouble(s)).toArray(Double[]::new);

            // 获取变量的维度
            int[] shape = uVar.getShape();
            int[] stepshape = {1, shape[1], shape[2]};
            int[] origin = {(int) timeIndex, 0, 0};
            Section section = new Section(origin, stepshape);

            Array data = uVar.read(section);
//            ArrayList<Number> list = new ArrayList<>();
//            for(String s : data.toString().split(" ")){
//                list.add(Double.parseDouble(s));
//            }
            Double[] list = Arrays.stream(data.toString().split(" ")).map(s -> new BigDecimal(s).setScale(2, RoundingMode.HALF_UP).doubleValue()).toArray(Double[]::new);


            Map hashMap = new HashMap();
            Map headerMap = new HashMap();
            List<Attribute> attributes = timeVar.attributes().getAttributes();
            for (Attribute stu : attributes) {
                headerMap.put(stu.getName(), Arrays.asList(stu.getValues().toString()));
            }

            Array tempTime = timeVar.read();
            headerMap.put("refTime", initrefTime(tempTime.getInt((int) timeIndex), headerMap.get("units").toString()));
            headerMap.put("ny", shape[1]);
            headerMap.put("nx", shape[2]);
            headerMap.put("lo1", lonList[0]);
            headerMap.put("lo2", lonList[lonList.length - 1]);
            headerMap.put("la1", latList[latList.length - 1]);
            headerMap.put("la2", latList[0]);

            headerMap.put("dx", new BigDecimal(Double.toString((lonList[lonList.length - 1] - lonList[0]) / shape[2])).setScale(3, RoundingMode.HALF_UP).doubleValue());
            headerMap.put("dy", new BigDecimal(Double.toString((latList[latList.length - 1] - latList[0]) / shape[1])).setScale(3, RoundingMode.HALF_UP).doubleValue());

            if (type == 1) {
                headerMap.put("COMMENT", "U");
                headerMap.put("parameterCategory", 2);
                headerMap.put("parameterNumber", 2);
            } else if (type == 2) {
                headerMap.put("COMMENT", "V");
                headerMap.put("parameterCategory", 2);
                headerMap.put("parameterNumber", 3);
            }

            hashMap.put("data", list);
            hashMap.put("header", headerMap);


            return hashMap;

//          // 使用 Gson 将数据转换为 JSON 格式
//            Gson gson = new GsonBuilder()
//                    .serializeSpecialFloatingPointValues() // 允许序列化NaN和Infinity
//                    .create();
//            String json = gson.toJson(arrayList);
//          //输出 JSON 数据到控制台
//            System.out.println(json.toString());
            //String jsonfile =it + "1.json";
//          // 将 JSON 数据写入到文件
//                try (FileWriter writer = new FileWriter(jsonfile)) {
//                    writer.write(json);
//                }


        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

重点讲解 timeIndex 参数  nc 文件中一个文件包含多个日期数据,获取变量的时间维度范围是整数,而 timeIndex是根据文件开始时间将时间转为时间维度index后的数值。

核心查询代码为         

            int[] stepshape = {1, shape[1], shape[2]};
            int[] origin = {(int) timeIndex, 0, 0};
            Section section = new Section(origin, stepshape);

表示时间维度开始 timeIndex  步长为1,经度纬度的维度开始0,步长为所有。


网站公告

今日签到

点亮在社区的每一天
去签到