根据多地块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();
}