/**
* 根据几何模型进行影像切割
* @param reader 原始印象
* @param geom 几何模型
*/
public static GridCoverage2D SplitImageByGeometry( GeoTiffReader reader, Geometry geom,ImageMetaInfo metaInfo) {
try{
//元数据类型
double noDataValue = reader.read(null).getSampleDimension(0).getNoDataValues()[0];
double iDataType = reader.read(null).getSampleDimension(0).getNoDataValues()[0];
//包围盒
double minX = geom.getEnvelopeInternal().getMinX();
double minY = geom.getEnvelopeInternal().getMinY();
double maxX = geom.getEnvelopeInternal().getMaxX();
double maxY = geom.getEnvelopeInternal().getMaxY();
//左上右下点
GeometryFactory geomFactory = new GeometryFactory();
Point rtPoint = geomFactory.createPoint( new Coordinate(minX,maxY));
Point lbPoint = geomFactory.createPoint(new Coordinate(maxX,minY));
//对应到行列的左上右下
DirectPosition2D dpRT = new DirectPosition2D(rtPoint.getX(),rtPoint.getY());
DirectPosition2D dpLB = new DirectPosition2D(lbPoint.getX(),lbPoint.getY());
GridCoordinates2D gcRT = reader.read(null).getGridGeometry().worldToGrid(dpRT);
GridCoordinates2D gcLB = reader.read(null).getGridGeometry().worldToGrid(dpLB);
//计算长宽
int width = gcLB.x - gcRT.x;
int height = gcLB.y - gcRT.y;
RenderedImage sourceImage = reader.read(null).getRenderedImage();
//获取内存块
PlanarImage planarImage = (PlanarImage)sourceImage;
SunWritableRaster newRaster = (SunWritableRaster)planarImage.getData(new Rectangle((int)gcRT.getX(),(int)gcRT.getY(),width+1,height+1));
metaInfo.setSplitGrid(newRaster);
metaInfo.setSplitIdxX( (int)gcRT.getX());
metaInfo.setSplitIdxY( (int)gcRT.getY());
//转换为数组块
float[][] arrBlock = new float[height][width];
float[] block = new float[width*height];
newRaster.getPixels((int)gcRT.getX(),(int)gcRT.getY(),width,height,block);
for(int row =0; row < height; row ++){
for(int col =0; col < width; col ++){
arrBlock[row][col] = block[row*width + col];
}
}
//保存输出
Envelope2D tmEnvelope = new Envelope2D(reader.getCoordinateReferenceSystem(),minX,minY,maxX - minX,maxY - minY);
GridCoverageFactory gridFactory = new GridCoverageFactory();
GridCoverage2D outputCoverage = gridFactory.create("subtractTiff", arrBlock,tmEnvelope);
//代码有问题,暂不处理
//GridSampleDimension[] sampleDimesion = new GridSampleDimension[1];
//sampleDimesion[0] = reader.read(null).getSampleDimension(0);
//GridCoverage2D outputCoverage = gridFactory.create("subtractTiff", newRaster,tmEnvelope,sampleDimesion);
return outputCoverage;
}catch (Exception e){
e.printStackTrace();
return null;
}
}