Как сохранить сетку значений в базе данных PostGIS, чтобы ее можно было создать с помощью GeoServer? - PullRequest
3 голосов
/ 07 января 2020

Я планирую использовать GeoServer с базой данных PostGIS для предоставления контуров через веб-картографическую службу.

У меня есть простая сетка значений в долготу, которую я хочу сохранить в базе данных, и я создал контур , Хотя руководство пользователя GeoServer подразумевает, что в этом примере это возможно ...

https://docs.geoserver.org/stable/en/user/styling/sld/extensions/rendering-transform.html#contour -экстракция

... в нем не говорится о том, какой формат данные должны быть в. Пожалуйста, кто-нибудь может предложить подходящую схему базы данных PostGIS, которую я могу использовать, что GeoServer поймет и сможет контур? Желательно тот, который будет работать с примером GeoServer по ссылке выше.

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 08 января 2020

Поскольку ваши данные уже находятся в программе Java, я бы погрузился в GeoTools , которая является базовой библиотекой, которую GeoServer использует для выполнения реальной работы.

Глядя на ContourProcess , что вам действительно нужно, это GridCoverage2D , который является основой c доступа к значениям данных сетки, поддерживаемым двухмерным визуализированным изображением. Каждая полоса в изображении представлена ​​как примерное измерение.

Итак, вы хотите взять свой массив данных и сделать что-то вроде этого:

WritableRaster raster2 = RasterFactory.createBandedRaster(java.awt.image.DataBuffer.TYPE_INT, w,
    h, 1, null);
for (int i = 0; i < w; i++) {//width...
     for (int j = 0; j < h; j++) {
         raster2.setSample(i, j, 0, myData[i*w+j]);
     }
}
GridCoverageFactory gcf = new GridCoverageFactory();
// Here I'm using OSGB as I live in the UK you would be using something else
CoordinateReferenceSystem crs = CRS.decode("EPSG:27700");
// Position of Lower Left Corner of grid
int llx = 500000;
int lly = 105000;
// Pixel size in projection units
int resolution = 10;
ReferencedEnvelope referencedEnvelope = new ReferencedEnvelope(llx, llx + (w * resolution), lly, lly + (h * resolution),
    crs);
GridCoverage2D gc = gcf.create("name", raster2, referencedEnvelope);

Затем вы можете записать его в виде GeoTiff или свернуть все вышеперечисленное в новый процесс , который возвращает контуры.

0 голосов
/ 15 января 2020

Итак, у меня была игра, и я могу подтвердить, что код @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 как способ получения контуров прямо из базы данных. Однако, похоже, что это не популярный вариант, и, возможно, он не готов к работе (согласно этой публикации ), поэтому я могу закончить контурирование данных самостоятельно и в конце концов сохранить их как векторы. Если у кого-то есть еще мысли по этому поводу, я хотел бы услышать их.

Спасибо за вашу помощь всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...