Geotools:GridCoverage 具有值 x 的总面积
Geotools: Total area where GridCoverage has value x
我正在与 Java 一起使用 Geotools。
到目前为止,我有一个 GridCoverage2D 和一个几何图形列表。
GridCoverage2D 是一个数字高程模型,源自 geotiff。
到这里为止一切正常。
现在我想获取具有特定高程值的每个多边形的面积。
例如,对于此几何图形,我想知道高程为 27 m 的总面积。
我怎样才能做到这一点?
我不知道如何开始:(
我有两个选择:
- 将几何图形分成小部分(我该怎么做),为每个点获取中心点(我可以这样做),然后计算这个 GridCoverage2D。这样我就有了一个包含非常小的几何图形的列表,以及对应于每个几何图形的高程。进一步需要一些数组魔法。这是一个好的计划吗?如何快速将几何体分成小部分?
- 使用filter/query。但是我不知道它是如何工作的,教程也没有帮助。有没有可能用滤镜达到我想要的效果?
事实证明这比我预期的要难,这可能意味着我错过了一些明显的东西。您可以通过创建覆盖率直方图然后选择包含您的值的 bin 来解决问题。您需要做的就是将单元格总数乘以单元格面积。
所以假设您已经阅读或创建了报道:
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;
}
显然,如果您计划多次调用它,您可以缓存直方图和像元大小。
再见,
另一种选择是使用区域统计操作或更好的过程。
操作是覆盖模块的一部分:
https://github.com/geotools/geotools/blob/12.x/modules/library/coverage/src/main/java/org/geotools/coverage/processing/operation/ZonalStats.java
https://github.com/geotools/geotools/blob/12.x/modules/library/coverage/src/test/java/org/geotools/coverage/processing/ZonalStasTest.java
进程在不受支持的进程光栅中:
https://github.com/geotools/geotools/blob/12.x/modules/unsupported/process-raster/src/main/java/org/geotools/process/raster/RasterZonalStatistics.java
https://github.com/geotools/geotools/blob/12.x/modules/unsupported/process-raster/src/test/java/org/geotools/process/raster/ZonalStatsProcessTest.java
希望对您有所帮助。
我正在与 Java 一起使用 Geotools。 到目前为止,我有一个 GridCoverage2D 和一个几何图形列表。 GridCoverage2D 是一个数字高程模型,源自 geotiff。 到这里为止一切正常。
现在我想获取具有特定高程值的每个多边形的面积。 例如,对于此几何图形,我想知道高程为 27 m 的总面积。 我怎样才能做到这一点?
我不知道如何开始:(
我有两个选择:
- 将几何图形分成小部分(我该怎么做),为每个点获取中心点(我可以这样做),然后计算这个 GridCoverage2D。这样我就有了一个包含非常小的几何图形的列表,以及对应于每个几何图形的高程。进一步需要一些数组魔法。这是一个好的计划吗?如何快速将几何体分成小部分?
- 使用filter/query。但是我不知道它是如何工作的,教程也没有帮助。有没有可能用滤镜达到我想要的效果?
事实证明这比我预期的要难,这可能意味着我错过了一些明显的东西。您可以通过创建覆盖率直方图然后选择包含您的值的 bin 来解决问题。您需要做的就是将单元格总数乘以单元格面积。
所以假设您已经阅读或创建了报道:
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;
}
显然,如果您计划多次调用它,您可以缓存直方图和像元大小。
再见, 另一种选择是使用区域统计操作或更好的过程。
操作是覆盖模块的一部分:
https://github.com/geotools/geotools/blob/12.x/modules/library/coverage/src/main/java/org/geotools/coverage/processing/operation/ZonalStats.java https://github.com/geotools/geotools/blob/12.x/modules/library/coverage/src/test/java/org/geotools/coverage/processing/ZonalStasTest.java
进程在不受支持的进程光栅中: https://github.com/geotools/geotools/blob/12.x/modules/unsupported/process-raster/src/main/java/org/geotools/process/raster/RasterZonalStatistics.java https://github.com/geotools/geotools/blob/12.x/modules/unsupported/process-raster/src/test/java/org/geotools/process/raster/ZonalStatsProcessTest.java
希望对您有所帮助。