Итак, у меня была игра, и я могу подтвердить, что код @IanTurton работает как брелок. Вот мой окончательный код, основанный на его основных отличиях, заключающихся в том, что я использую систему координат широты / долготы, и я включил некоторый код для записи растра в виде GeoTIFF ...
import java.awt.image.WritableRaster;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import java.io.File;
import java.io.IOException;
import javax.media.jai.RasterFactory;
import org.geotools.coverage.grid.GridCoverage2D;
import org.geotools.coverage.grid.GridCoverageFactory;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.gce.geotiff.GeoTiffFormat;
import org.geotools.gce.geotiff.GeoTiffWriter;
import org.opengis.parameter.ParameterValue;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
public class GridToGeoTiff {
public static void main(String[] args) throws NoSuchAuthorityCodeException, FactoryException, IllegalArgumentException, IndexOutOfBoundsException, IOException {
// Define the data grid
double[][] myGrid = {
{ 0.0, 0.2, 0.6, 0.3 },
{ 0.1, 1.1, 0.8, 0.7 },
{ 1.1, 2.6, 3.4, 0.3 },
{ 0.3, 0.9, 0.6, 0.1 }
};
int w = myGrid.length;
int h = myGrid[0].length;
// Position of Lower Left Corner of grid
double southBound = 51.5074; // degrees latitude
double westBound = 0.1278; // degrees latitude
double resolution = 0.001; // degrees lat/long
// Convert to a Raster
WritableRaster raster2 = RasterFactory.createBandedRaster(java.awt.image.DataBuffer.TYPE_INT, w, h, h, null);
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
raster2.setSample(i, j, 0, myGrid[j][i]);
}
}
// Create a GeoTools 2D grid referenced in lat/long
GridCoverageFactory gcf = new GridCoverageFactory();
CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84;
ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope(
westBound, westBound + (w * resolution), southBound, southBound + (h * resolution), crs
);
GridCoverage2D gc = gcf.create("my-grid", raster2, referencedEnvelope);
// Write out to a GeoTIFF file
final File geotiff = new File("my-grid.tif");
final ImageOutputStream imageOutStream = ImageIO.createImageOutputStream(geotiff);
GeoTiffWriter writer = new GeoTiffWriter(imageOutStream);
final ParameterValue<Boolean> tfw = GeoTiffFormat.WRITE_TFW.createValue();
tfw.setValue(true);
writer.write(gc, null);
writer.dispose();
}
}
Я использую следующие зависимости Maven ...
- org.geotools 22.2: gt-main, gt-lighting, gt-referenceing, gt-geometry, gt-geotiff
- org.opengis 2.2.0: geoapi
- org.locationtech.jts 1.16.1: jts-core
- javax.media.jai 1.1.3: com.springsource.javax.media.jai.core
... из репозиториев Boundless и OSGeo.
Используя этот код для создания файла GeoTIFF, я мог бы затем использовать его для настройки хранилища в GeoServer и затем опубликовать sh. Я адаптировал SLD в примере контурной обработки GeoServer (буквально просто изменил имена и пороги контурной обработки), чтобы создать стиль, который затем применил к опубликованным данным GeoTIFF и т. Д. Контурам вуаля на карте!
Но ... мои данные не устарели c, и я буду производить много разных сеток, поэтому этот файловый подход будет немного неуклюжим. Поэтому я собираюсь взглянуть на ImageMosai c плагин GeoServer как способ получения контуров прямо из базы данных. Однако, похоже, что это не популярный вариант, и, возможно, он не готов к работе (согласно этой публикации ), поэтому я могу закончить контурирование данных самостоятельно и в конце концов сохранить их как векторы. Если у кого-то есть еще мысли по этому поводу, я хотел бы услышать их.
Спасибо за вашу помощь всем!