GeoJson导出tif(java-gdal)

根据多地块geoJson导出tif文件,并设置每个地块颜色

   /**
     * 导出tiff数据
     * 可以添加颜色信息,写入RGB字段颜色字符串
     *
     * @param layer
     * @param tartFilePath
     */
    public static void exportTiff(Layer layer, String tartFilePath) {
        log.info("开始导出tiff数据");

        double[] extent = layer.GetExtent();
        double minX = extent[0];
        double maxX = extent[1];
        double minY = extent[2];
        double maxY = extent[3];

        int width = 512; // 输出栅格宽度
        int height = 512 * Convert.toInt(maxY - minY) / Convert.toInt(maxX - minX); // 输出栅格高度

        // 计算像素大小
        double pixelSizeX = (maxX - minX) / width;
        double pixelSizeY = (maxY - minY) / height;
        log.info("创建结果tiff");
        Driver driver = gdal.GetDriverByName("GTiff");
        Dataset dataset = driver.Create(tartFilePath, width, height, 4, gdalconst.GDT_Byte);
        // dataset.SetProjection(layer.GetSpatialRef().ExportToWkt());
        dataset.SetGeoTransform(new double[]{minX, pixelSizeX, 0, maxY, 0, -pixelSizeY});

        log.info("拆分输入图层");
        org.gdal.ogr.Driver memDriver = ogr.GetDriverByName("Memory");
        DataSource memDataSource = memDriver.CreateDataSource("");

        List<Layer> layerList = new ArrayList<>();
        List<String> colors = new ArrayList<>();
        Feature feature;
        while ((feature = layer.GetNextFeature()) != null) {
            Layer memLayer = memDataSource.CreateLayer("temp_layer" + feature.GetFID(), null);
            Feature memFeature = new Feature(memLayer.GetLayerDefn());
            String rgb = feature.GetFieldAsString("RGB");
            log.info("获取到颜色信息为{}", rgb);
            if (StrUtil.isNotEmpty(rgb)) {
                colors.add(rgb);
            }
            memFeature.SetGeometry(feature.GetGeometryRef());
            memLayer.CreateFeature(memFeature);
            layerList.add(memLayer);
            memDataSource.FlushCache();
        }






        log.info("将输入图层写入结果tiff中");
        byte[] data = new byte[1];
        Map map = new HashMap(layerList.size());

        for (int i = 0; i < layerList.size(); i++) {
            Layer inputLayer = layerList.get(i);
            // 将黑色像素(值为0透明)替换为背景值
            gdal.RasterizeLayer(dataset, new int[]{4}, inputLayer);

            Band band = dataset.GetRasterBand(4);
            Band band1 = dataset.GetRasterBand(1);
            Band band2 = dataset.GetRasterBand(2);
            Band band3 = dataset.GetRasterBand(3);

            List colorList = JSONUtil.toList(colors.get(i), List.class);
            if (colorList == null || colorList.size() == 0) {
                continue;
            }

            log.info("循环像素设置颜色");
            int numPoint = 0;
            for (int w = 0; w < width; w++) {
                for (int h = 0; h < height; h++) {
                    numPoint++;
                    //处理过的点则忽略
                    if (map.containsKey(numPoint)) {
                        continue;
                    }
                    band.ReadRaster(w, h, 1, 1, data);
                    //背景点忽略
                    if (data[0] == 0) {
                        continue;
                    }
                    map.put(numPoint, "");

                    //重新写入RGB颜色
                    byte[] byte1 = data.clone();
                    byte[] byte2 = data.clone();
                    byte[] byte3 = data.clone();
                    byte1[0] = Convert.toByte(((List) colorList.get(0)).get(0));
                    byte2[0] = Convert.toByte(((List) colorList.get(1)).get(0));
                    byte3[0] = Convert.toByte(((List) colorList.get(2)).get(0));
                    band1.WriteRaster(w, h, 1, 1, 1, byte1);
                    band2.WriteRaster(w, h, 1, 1, 1, byte2);
                    band3.WriteRaster(w, h, 1, 1, 1, byte3);

                }
            }
        }

        memDataSource.delete();
        dataset.FlushCache();
        dataset.delete();
    }

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值