Java Geotools:GridCoverage值为x的总面积
我在使用Java的Geotools中工作。 到目前为止,我有一个GridCoverage 2D和一个几何体列表。 GridCoverage 2D是一个数字高程模型,源自geotiff。 在这之前一切都很顺利 现在我想得到每个多边形的面积,其中高程有一定的值。 例如,对于该几何体,我想知道高程为27 m的总面积。 我怎样才能做到这一点 我不知道如何开始:( 我有两个选择:Java Geotools:GridCoverage值为x的总面积,java,geotools,Java,Geotools,我在使用Java的Geotools中工作。 到目前为止,我有一个GridCoverage 2D和一个几何体列表。 GridCoverage 2D是一个数字高程模型,源自geotiff。 在这之前一切都很顺利 现在我想得到每个多边形的面积,其中高程有一定的值。 例如,对于该几何体,我想知道高程为27 m的总面积。 我怎样才能做到这一点 我不知道如何开始:( 我有两个选择: 将几何图形拆分为小部分(我如何做到这一点),为每个点获取中心点(我可以做到这一点)然后评估这个GridCoverage 2D
- 将几何图形拆分为小部分(我如何做到这一点),为每个点获取中心点(我可以做到这一点)然后评估这个GridCoverage 2D。这样我就有了一个包含非常小的几何体的列表,以及每个几何体对应的高程。进一步需要一些数组魔法。这是一个好的计划吗?我如何快速地将几何体拆分成小部分
- 使用过滤器/查询。但我不知道它是如何工作的,教程也没有帮助。甚至可以用过滤器实现我想要的吗
private double selectCells(GridCoverage2D cov, int value) {
GridGeometry2D geom = cov.getGridGeometry();
// cov.show();
final OperationJAI op = new OperationJAI("Histogram");
ParameterValueGroup params = op.getParameters();
GridCoverage2D coverage;
params.parameter("Source").setValue(cov);
coverage = (GridCoverage2D) op.doOperation(params, null);
javax.media.jai.Histogram hist = (Histogram) coverage
.getProperty("histogram");
int total = hist.getSubTotal(0, value, value);
double area = calcAreaOfCell(geom);
Unit<?> unit = cov.getCoordinateReferenceSystem().getCoordinateSystem()
.getAxis(0).getUnit();
System.out.println("which gives " + (area * total) + " " + unit
+ "^2 area with value " + value);
return area * total;
}
private double calcAreaOfCell(GridGeometry2D geom) {
GridEnvelope gridRange = geom.getGridRange();
int width = gridRange.getHigh(0) - gridRange.getLow(0) + 1; // allow for the
int height = gridRange.getHigh(1) - gridRange.getLow(1) + 1;// 0th row/col
Envelope envelope = geom.getEnvelope();
double dWidth = envelope.getMaximum(0) - envelope.getMinimum(0);
double dHeight = envelope.getMaximum(1) - envelope.getMinimum(1);
double cellWidth = dWidth / width;
double cellHeight = dHeight / height;
return cellWidth * cellHeight;
}
private double selectCells(gridcoverage二维cov,int值){
GridGeometry2D geom=cov.getGridGeometry();
//cov.show();
最终操作JAI op=新操作JAI(“直方图”);
ParameterValueGroup params=op.getParameters();
网格覆盖2D覆盖;
参数参数(“源”).setValue(cov);
覆盖率=(GridCoverage2D)op.doOperation(参数,null);
javax.media.jai.hist=(直方图)覆盖率
.getProperty(“直方图”);
int total=hist.getSubTotal(0,value,value);
双面积=钙质电池(geom);
单位单位=cov.getCoordinateReferenceSystem().getCoordinateSystem()
.getAxis(0.getUnit();
System.out.println(“它给出了”+(面积*总面积)+“”+单位
+“^2有值的区域”+值);
返回区*总面积;
}
专用双计算单元(GridGeometry2D geom){
GridEnvelope gridRange=geom.getGridRange();
int width=gridRange.getHigh(0)-gridRange.getLow(0)+1;//允许
int height=gridRange.getHigh(1)-gridRange.getLow(1)+1;//0行/col
信封信封=geom.getEnvelope();
double dWidth=信封.getMaximum(0)-信封.getMinimum(0);
double dHeight=信封.getMaximum(1)-信封.getMinimum(1);
双单元格宽度=宽度/宽度;
双格高度=dHeight/高度;
返回单元格宽度*单元格高度;
}
显然,如果你打算多次调用它,你可以缓存直方图和单元格大小。再见,
另一个选择是使用分区统计操作,或者更好地使用该过程
该操作是覆盖模块的一部分:
该进程位于不受支持的进程中:
我希望这能有所帮助。先生,您是一位真正的英雄!