首页 > 编程语言 >java裁切NC文件并转成Json

java裁切NC文件并转成Json

时间:2023-08-24 14:45:48浏览次数:38  
标签:findIndex java 裁切 int double NC import inputFile

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import ucar.ma2.Index;
import ucar.nc2.NetcdfFile;
import ucar.ma2.Array;

import java.io.FileWriter;
import java.io.IOException;

public class NetCDF2JSON {

    @Test
    public void test() {
        cut2Json("V-000.nc", 0, 70, 70, 150);
    }

    public void cut2Json(String ncPath, double minLat, double maxLat, double minLon, double maxLon) {
        try {
            // 打开 NetCDF 文件
            NetcdfFile inputFile = NetcdfFile.open(ncPath);

            // 获取经纬度变量
            Array latArray = inputFile.findVariable("lat").read();
            Array lonArray = inputFile.findVariable("lon").read();
            Array dataArray = inputFile.findVariable("V").read();

            // 获取经纬度索引范围
            int minLatIndex = findIndex(latArray, minLat);
            int maxLatIndex = findIndex(latArray, maxLat);
            int minLonIndex = findIndex(lonArray, minLon);
            int maxLonIndex = findIndex(lonArray, maxLon);

            // 计算 dx 和 dy
            double dx = (maxLat - minLat) / (minLatIndex - maxLatIndex);
            double dy = (maxLon - minLon) / (maxLonIndex - minLonIndex);

            // 创建 Index 对象
            Index index = dataArray.getIndex();
            JSONArray jsonArray = new JSONArray();
            for (int i = maxLatIndex; i <= minLatIndex; i++) {
                JSONArray rowArray = new JSONArray();
                for (int j = minLonIndex; j <= maxLonIndex; j++) {
                    rowArray.add(dataArray.getDouble(index.set(0, i, j)));
                }
                jsonArray.add(rowArray);
            }

            JSONObject jsonObject = new JSONObject(true);
            jsonObject.put("minLat", minLat);
            jsonObject.put("maxLat", maxLat);
            jsonObject.put("minLon", minLon);
            jsonObject.put("maxLon", maxLon);
            jsonObject.put("dx", dx);
            jsonObject.put("dy", dy);
            jsonObject.put("data", jsonArray);

            // 将 JSON 数组写入到文件
            try (FileWriter fileWriter = new FileWriter("aaa.json")) {
                fileWriter.write(jsonObject.toJSONString());
            } catch (IOException e) {
                e.printStackTrace();
            }

            // 关闭文件
            inputFile.close();

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


    // 查找最接近的索引
    public int findIndex(Array array, double target) {
        double[] values = (double[]) array.get1DJavaArray(double.class);
        int index = 0;
        double minDifference = Double.MAX_VALUE;

        for (int i = 0; i < values.length; i++) {
            double difference = Math.abs(values[i] - target);
            if (difference < minDifference) {
                minDifference = difference;
                index = i;
            }
        }
        return index;
    }
}

 

标签:findIndex,java,裁切,int,double,NC,import,inputFile
From: https://www.cnblogs.com/fangts/p/17654086.html

相关文章

  • java实现大文件上传下载
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • Java流程控制
         ......
  • 《asyncio 系列》1. 什么是 asyncio?如何基于单线程实现并发?事件循环又是怎么工作的?
    https://www.cnblogs.com/traditional/p/17357782.html楔子许多应用程序,尤其在当今的Web应用程序领域,严重依赖IO操作。这些类型的操作包括从Intermet下载网页的内容、通过网络与一组微服务进行通信,或者针对MySOL、Postgres等数据库同时运行多个查询。Web请求或与微服......
  • 快手Java一面11问(附参考答案)
    现在已经到了面试招聘比较火热的时候,后续会分享一些面试真题供大家复习参考。准备面试的过程中,一定要多看面经,多自测!今天分享的是一位贵州大学的同学分享的快手一面面经。快手一面主要会问一些基础问题,也就是比较简单且容易准备的常规八股,通常不会问项目。到了二面,会开始问项目,......
  • java bean赋值工具类
    javabean赋值工具类实现接收的bean赋值,判断有没有对应值的get、set方法,有就赋值。publicstatic<T>voidprint(Tbean){Class<?>fromClass=bean.getClass();Method[]toClassMethods=fromClass.getMethods();//遍历to含有的方法for(Methodmethod:toCla......
  • 学习JAVA的第一天:熟悉IDEA结构并新建工程、模块、包、类。
    新建工程、模块、包、类创建模块:新建package包:包的命名也有要求,一般使用公司域名的倒写,如果公司域名是:www.baidu.com,那么包的命名则是:com.baidu.XXXXXX新建类:IDEA快捷输入mainsout编译总结IDEA的结构分为:项目project-模块module-包package-类class。项目proj......
  • idea运行java项目提示异常: java.security.InvalidKeyException: Illegal key size
    idea运行java项目提示异常:java.security.InvalidKeyException:Illegalkeysizenews/2023/8/1715:55:43idea运行java项目提示异常:java.lang.IllegalArgumentException:java.security.InvalidKeyException:Illegalkeysize参考:java.security.InvalidKeyException:I......
  • java实现大文件上传功能
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • 【GiraKoo】Android Studio编译时,提示java.nio.file.AccessDeniedException
    【问题解决】AndroidStudio编译时,提示java.nio.file.AccessDeniedException在使用AndroidStudio进行编译时,提示编译错误java.nio.file.AccessDeniedException。原因时当前使用Debug模式,停在断点上。导致编译程序无法替换被占用目标文件,输出该异常。【环境】AndroidStudio【......
  • 腾讯云短信发送【java】
    先去官网申请secretId,secretKey,然后创建对应的模板maven引入包<dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><!--gotohttps://search.maven.org/search?q=tencentcloud-sdk-javaandgetthe......