@Data
public class ImageMetaInfo {
//影像对应的要素块
private Feature feature;
//原始影像
private GeoTiffReader reader;
//切割几何模型
private Geometry intersectionGeom;
//切割几何对应的覆盖格网
private SunWritableRaster splitGrid;
private int splitIdxX;
private int splitIdxY;
private double noData =-1;
private int dataType = -1;
private double scaleY;
private double scaleX;
//获取切割影像对应的宽
public int getWritableRasterWidth(){
return splitGrid.getWidth();
}
//获取切割影像对应的高
public int getWritableRasterHeight(){
return splitGrid.getHeight();
}
//获取最小X
public double getMinX(){
return intersectionGeom.getEnvelopeInternal().getMinX();
}
//获取最大Y
public double getMaxY(){
return intersectionGeom.getEnvelopeInternal().getMaxY();
}
}
public static boolean MergeImagersByGeometrys(List<ImageMetaInfo> metaImages,String dstFile) {
//获取几何包围盒
double minX = -1,minY= -1,maxX= -1,maxY= -1;
//获取最小像元单元
double maxScaleX = -1, maxScaleY = -1;
for(ImageMetaInfo metaInfo:metaImages){
if(minX == -1){
minX = metaInfo.getIntersectionGeom().getEnvelopeInternal().getMinX();
minY = metaInfo.getIntersectionGeom().getEnvelopeInternal().getMinY();
maxX = metaInfo.getIntersectionGeom().getEnvelopeInternal().getMaxX();
maxY = metaInfo.getIntersectionGeom().getEnvelopeInternal().getMaxY();
maxScaleX = metaInfo.getScaleX();
maxScaleY = Math.abs(metaInfo.getScaleY());
continue;
}
minX = Math.min(minX,metaInfo.getIntersectionGeom().getEnvelopeInternal().getMinX());
minY = Math.min(minY,metaInfo.getIntersectionGeom().getEnvelopeInternal().getMinY());
maxX = Math.max(maxX,metaInfo.getIntersectionGeom().getEnvelopeInternal().getMaxX());
maxY = Math.max(maxY,metaInfo.getIntersectionGeom().getEnvelopeInternal().getMaxY());
maxScaleX = Math.max(maxScaleX,metaInfo.getScaleX());
maxScaleY = Math.max(maxScaleY,Math.abs(metaInfo.getScaleY()));
}
try{
//计算出合并范围及
int width = (int)((maxX - minX)/maxScaleX + 0.5);
int height = (int)((maxY - minY)/maxScaleY + 0.5);
float newGrid[][] = new float[height][width];
for(int imageIdx =0; imageIdx<metaImages.size();imageIdx++){
ImageMetaInfo metaInfo = metaImages.get(imageIdx);
int startX = (int)((metaInfo.getMinX()-minX)/maxScaleX + 0.5);
int startY = (int)((maxY - metaInfo.getMaxY())/maxScaleY + 0.5);
//test
int calcWidth = (int)((metaInfo.getIntersectionGeom().getEnvelopeInternal().getMaxX()
-metaInfo.getIntersectionGeom().getEnvelopeInternal().getMinX())/maxScaleX + 0.5);
int calcHeight = (int)((metaInfo.getIntersectionGeom().getEnvelopeInternal().getMaxY()
-metaInfo.getIntersectionGeom().getEnvelopeInternal().getMinY())/maxScaleY + 0.5);
int widthX = metaInfo.getWritableRasterWidth();
int heightY = metaInfo.getWritableRasterHeight();
if(widthX > calcWidth || heightY > calcHeight){
widthX = calcWidth;
heightY = calcHeight;
}
float[] tmpDatas = new float[widthX*heightY];
metaInfo.getSplitGrid().getPixels(metaInfo.getSplitIdxX(),metaInfo.getSplitIdxY(),widthX,heightY,tmpDatas);
for(int row=0; row <heightY; row++){
for(int col= 0; col<widthX; col++){
if(tmpDatas[row*widthX+col] != metaInfo.getNoData()){
newGrid[row+startY][col+startX] = tmpDatas[row*widthX+col];
}
}
}
}
GridSampleDimension[] dimensions = metaImages.get(0).getReader().read(null).getSampleDimensions();
Envelope2D mergedEnvelope = new Envelope2D(metaImages.get(0).getReader().getCoordinateReferenceSystem(),minX,minY,maxX - minX,maxY - minY);
GridCoverage2D outputCoverage = ImageUtils.customCreate("merge",newGrid,mergedEnvelope,dimensions);
GeoTiffWriter writer = new GeoTiffWriter(new File(dstFile));
writer.write(outputCoverage, null);
writer.dispose();
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}