前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Geotools Image Tif 合并影像文件,并且保存

Geotools Image Tif 合并影像文件,并且保存

作者头像
Freedom123
发布2024-03-29 08:56:16
810
发布2024-03-29 08:56:16
举报
文章被收录于专栏:DevOpsDevOps
代码语言:javascript
复制
@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;
  }
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com