Java geotools 如何创建覆盖网格
Java geotools how to create coverage grid
每个单元格为5M时如何创建网格覆盖?
我发现了这个:
GridCoverage2D coverage = reader.read(null);
// direct access
DirectPosition position = new DirectPosition2D(crs, x, y);
double[] sample = (double[]) coverage.evaluate(position); // assume double
// resample with the same array
sample = coverage.evaluate(position, sample);
来源:https://docs.geotools.org/latest/userguide/library/coverage/grid.html
我没有找到很多关于如何在 geotools 上创建网格覆盖的教程...
要创建空覆盖,您需要使用 GridCoverageFactory
和 create
方法之一。由于您不是从现有图像构建,因此您需要为要存储的栅格提供一些内存(这也可以保存您想要的任何初始值)。为此,您的选择是 float[][]
或 WritableRaster
。最后,你需要一个 Envelope
来说明覆盖范围在哪里以及它的分辨率是多少(否则它只是一个数字数组),我喜欢使用 ReferencedEnvelope
这样我就知道单位是什么等等,所以在下面的示例中,我使用了 EPSG:27700
,这是 OSGB 国家网格,所以我知道它以米为单位,我可以在 South Downs 的某个地方定义原点。通过将左下角的 X 和 Y 坐标以及右上角的 X 和 Y 指定为 resolution
乘以宽度和高度(加上左下角),所有数学运算都可以确保我的像素大小为 resolution
.
因此,暂时保持简单,您可以执行以下操作:
float[][] data;
int width = 100;
int height = 200;
data = new float[width][height];
int resolution = 5;
for(int i=0;i<width;i++){
for(int j=0;j<height;j++ ){
data[i][j] = 0.0f;
}
}
GridCoverageFactory gcf = new GridCoverageFactory();
CoordinateReferenceSystem crs = CRS.decode("EPSG:27700");
int llx = 500000;
int lly = 105000;
ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope(llx, llx + (width * resolution), lly, lly + (height * resolution),
crs);
GridCoverage2D gc = gcf.create("name", data, referencedEnvelope);
如果您想要覆盖更多波段,则需要使用 WriteableRaster
作为覆盖范围的基础。
WritableRaster raster2 = RasterFactory.createBandedRaster(java.awt.image.DataBuffer.TYPE_INT, width,
height, 3, null);
for (int i = 0; i < width; i++) {//width...
for (int j = 0; j < height; j++) {
raster2.setSample(i, j, 0, rn.nextInt(200));
raster2.setSample(i, j, 1, rn.nextInt(200));
raster2.setSample(i, j, 2, rn.nextInt(200));
}
}
每个单元格为5M时如何创建网格覆盖? 我发现了这个:
GridCoverage2D coverage = reader.read(null);
// direct access
DirectPosition position = new DirectPosition2D(crs, x, y);
double[] sample = (double[]) coverage.evaluate(position); // assume double
// resample with the same array
sample = coverage.evaluate(position, sample);
来源:https://docs.geotools.org/latest/userguide/library/coverage/grid.html
我没有找到很多关于如何在 geotools 上创建网格覆盖的教程...
要创建空覆盖,您需要使用 GridCoverageFactory
和 create
方法之一。由于您不是从现有图像构建,因此您需要为要存储的栅格提供一些内存(这也可以保存您想要的任何初始值)。为此,您的选择是 float[][]
或 WritableRaster
。最后,你需要一个 Envelope
来说明覆盖范围在哪里以及它的分辨率是多少(否则它只是一个数字数组),我喜欢使用 ReferencedEnvelope
这样我就知道单位是什么等等,所以在下面的示例中,我使用了 EPSG:27700
,这是 OSGB 国家网格,所以我知道它以米为单位,我可以在 South Downs 的某个地方定义原点。通过将左下角的 X 和 Y 坐标以及右上角的 X 和 Y 指定为 resolution
乘以宽度和高度(加上左下角),所有数学运算都可以确保我的像素大小为 resolution
.
因此,暂时保持简单,您可以执行以下操作:
float[][] data;
int width = 100;
int height = 200;
data = new float[width][height];
int resolution = 5;
for(int i=0;i<width;i++){
for(int j=0;j<height;j++ ){
data[i][j] = 0.0f;
}
}
GridCoverageFactory gcf = new GridCoverageFactory();
CoordinateReferenceSystem crs = CRS.decode("EPSG:27700");
int llx = 500000;
int lly = 105000;
ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope(llx, llx + (width * resolution), lly, lly + (height * resolution),
crs);
GridCoverage2D gc = gcf.create("name", data, referencedEnvelope);
如果您想要覆盖更多波段,则需要使用 WriteableRaster
作为覆盖范围的基础。
WritableRaster raster2 = RasterFactory.createBandedRaster(java.awt.image.DataBuffer.TYPE_INT, width,
height, 3, null);
for (int i = 0; i < width; i++) {//width...
for (int j = 0; j < height; j++) {
raster2.setSample(i, j, 0, rn.nextInt(200));
raster2.setSample(i, j, 1, rn.nextInt(200));
raster2.setSample(i, j, 2, rn.nextInt(200));
}
}