004——JAVA 通过wContour和geotools实现等值面分析、裁切、生成geosjon

本文介绍了如何使用JAVA结合wContour和GeoTools库,处理降雨量数据生成geojson。重点包括:1) 生成正确的雨量数据;2) 准备SHP边界文件;3) 设置数据分层间隔;4) 解决wContour包引用及插值方法。在实践中遇到的自相交问题,通过引用其他博客解决,生成的等值面效果满足需求。
摘要由CSDN通过智能技术生成

项目上需要根据降雨量数据,生成geojson数据返回给前端,之前也没有做过类似的需求,故百度一番,发现资料不少,有些基本上是源码都贡献出来了,简直是手把手教你生成geojson,遂copy到本地验证,结果发现出来的效果不尽人意,试了几个不同案例,效果都差强人意,苦思了多日还是不行,遂作罢,暂且放下吧,后面通过查看源码,调整参数,修改shp文件的方式最终生成了效果还过得去的geojson数据,

下面贴上核心代码,方便自己查看,也方便有相关需求的开发者参考

ps:插值部分主要是利用wContour包里面的IDW插值方法,算是一种比较经典的插值方法,简单高效,效果可能没克里金法好,不过也够用了

    @Override
    public String calculateIsoSurface(String start, String end) throws Exception {
        String geojsonpogylon = "";
        try {
            double _undefData = -9999.0;
            int[] size = new int[]{200,200};
            double[] dataInterval = new double[]{0, 1, 10.0, 25.0, 50.0, 100.0, 250.0};
            List<PolyLine> cPolylineList;
            List<Polygon> cPolygonList;
            int width = size[0], height = size[1];
            double[] _X = new double[width];
            double[] _Y = new double[height];

            List<Map<String, Object>> rains = stpptnrMapper.getRainI(start, end);
            //如果查询到降雨为空,
            if (rains.size() <= 0) {
                return null;
            }

            File file = new File(shpPath+ File.separator+"XXXX.shp");
            ShapefileDataStore shpDataStore = null;

            shpDataStore = new ShapefileDataStore(file.toURI().toURL());
            //设置编码
            Charset charset = Charset.forName("GBK");
            shpDataStore.setCharset(charset);
            String typeName = shpDataStore.getTypeNames()[0];
            SimpleFeatureSource featureSource = null;
            featureSource = shpDataStore.getFeatureSource(typeName);
            SimpleFeatureCollection fc = featureSource.getFeatures();
            //获取shp边界,生成格网点,注意网格范围
            double minX = fc.getBounds().getMinX();
            double minY = fc.getBounds().getMinY();
            double maxX = fc.getBounds().getMaxX();
            double maxY = fc.getBounds().getMaxY();

            Interpolate.createGridXY_Num(minX, minY, maxX, maxY, _X, _Y);

            double[][] _gridData = new double[width][height];

            int nc = dataInterval.length;

            double[][] trainData = new double[rains.size()][3];
            for (int i = 0; i < rains.size(); i++) {
                Map<String, Object> rain = rains.get(i);
                trainData[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值