¿Publicar rasters PostGIS en GeoServer?

23

¿Cómo publico rásteres PostGIS usando GeoServer?

He pasado mucho tiempo intentando crear una fuente de datos Raster usando Image Mosaic JDBC pero sin suerte.

Pasos realizados:
1. Descargué e instalé la extensión JDBC Image Mosaic (funcionó bien)
2. Creé los archivos "Parámetros de conexión":

connect.postgis.xml.inc:

<connect>
  <dstype value="DBCP"/>
  <username value="postgres" />
  <password value="password" />
  <jdbcUrl value="jdbc:postgresql://localhost:5432/db1" />
  <driverClassName value="org.postgresql.Driver"/>
  <maxActive value="10"/>
  <maxIdle value="0"/>
</connect>


mapping.postgis.xml.inc:

<spatialExtension name="postgis"/>
<mapping>
    <masterTable name="mosaic" >
        <coverageNameAttribute name="name"/>
        <maxXAttribute name="maxX"/>
        <maxYAttribute name="maxY"/>
        <minXAttribute name="minX"/>
        <minYAttribute name="minY"/>
        <resXAttribute name="resX"/>
        <resYAttribute name="resY"/>
        <tileTableNameAtribute name="tiletable" />
    </masterTable>
    <tileTable>
        <blobAttributeName name="rast" />
    </tileTable>
</mapping>


osm.postgis.xml:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ImageMosaicJDBCConfig [
  <!ENTITY mapping PUBLIC "mapping"  "mapping.postgis.xml.inc">
  <!ENTITY connect PUBLIC "connect"  "connect.postgis.xml.inc">]>
<config version="1.0">
  <coverageName name="gfm"/>
  <coordsys name="EPSG:25832"/>
  <!-- interpolation 1 = nearest neighbour, 2 = bilinear, 3 = bicubic -->
  <scaleop  interpolation="1"/>
  <verify cardinality="false"/>
  &mapping;
  &connect;
</config>

donde "mosaico" es una tabla (columnas: nombre, tabla de título, minX, minY, maxX, maxY, resX, resY) que contiene una fila: "gfm, testrastertable,,,,,,," 3. Guarde

los archivos de configuración en. ./geoserver/data_dir/coverages/
4. Al intentar agregar un almacén de datos JDBC de Image Mosaic, recibo el siguiente error:

Error: Could not list layers for this store, an error occurred retrieving them: Unable to acquire a reader for this coverage with format: ImageMosaicJDBC



Actualización: registro de Geoserver

2012-10-24 14:09:11,404 DEBUG [org.geoserver] - Thread 14 locking in mode WRITE
2012-10-24 14:09:11,404 DEBUG [org.geoserver] - Thread 14 got the lock in mode WRITE
2012-10-24 14:09:11,406 DEBUG [geoserver.config] - Persisting coverage store raster_store
2012-10-24 14:09:11,408 DEBUG [geoserver.config] - Persisted org.geoserver.catalog.impl.CoverageStoreInfoImpl to /opt/geoserver/data_dir/workspaces/raster/raster_store/coveragestore.xml
2012-10-24 14:09:11,416 DEBUG [geoserver.config] - Persisted $Proxy15 to /opt/geoserver/data_dir/global.xml
2012-10-24 14:09:11,438 ERROR [imagemosaic.jdbc] - 
2012-10-24 14:09:11,438 WARN [imagemosaic.jdbc] - 
java.io.IOException
    at org.geotools.gce.imagemosaic.jdbc.ImageMosaicJDBCReader.<init>(ImageMosaicJDBCReader.java:163)
    at org.geotools.gce.imagemosaic.jdbc.ImageMosaicJDBCFormat.getReader(ImageMosaicJDBCFormat.java:209)
....
2012-10-24 14:09:11,439 INFO [geoserver.web] - Getting list of coverages for saved store file:coverages/osm.postgis.xml
java.lang.RuntimeException: Could not list layers for this store, an error occurred retrieving them: Unable to acquire a reader for this coverage with format: ImageMosaicJDBC
    at org.geoserver.web.data.layer.NewLayerPageProvider.getItems(NewLayerPageProvider.java:115)
...
Caused by: java.lang.Exception: Unable to acquire a reader for this coverage with format: ImageMosaicJDBC
    at org.geoserver.catalog.CatalogBuilder.buildCoverage(CatalogBuilder.java:812)
    at org.geoserver.web.data.layer.NewLayerPageProvider.getItems(NewLayerPageProvider.java:82)
    ... 95 more
2012-10-24 14:09:11,441 DEBUG [geoserver.config] - Removing coverage store raster_store
2012-10-24 14:09:11,446 DEBUG [geoserver.config] - Persisted $Proxy15 to /opt/geoserver/data_dir/global.xml
2012-10-24 14:09:11,459 DEBUG [org.geoserver] - Thread 14 releasing the lock in mode WRITE
áspid
fuente
gire el inicio de sesión a detallado y verifique el archivo de registro
Ian Turton
recién actualizado con el registro ... no me dice mucho
asp
Como nadie aquí parece capaz de ayudar, puede probar la lista de correo de GeoServer: geoserver.org/display/GEOS/Mailing+Lists
GIS-Jonathan
¿Alguna actualización sobre esta pregunta?
Pablo
1
Sin actualizaciones ... Tuve que abandonar la idea de crear un mosaico de imágenes JDBC porque simplemente no podía crearlo en Geoserver. Estoy usando ahora la tienda ImagePyramid y los archivos se guardan en el disco.
asp

Respuestas:

7

Trabajé en varios problemas tratando de usar un ráster postgis en geoserver similar al OP. A continuación se muestra cómo cargué correctamente mis datos ráster.

Preconfiguración: una capa de geotiff BNG, generada a partir de FME, se ha importado a postgis usando raster2pgsql. El comando utilizado fue:

raster2pgsql -s 27700 -I -M -C {geotiffName}.tif -t 100x100 -l 2,4,6 {schema}.{tableName} | psql -U {user} -d {database}

Esto creó la tabla ráster junto con sus tablas piramidales.

Actualmente mi servidor tiene una instancia de Geoserver 2.6.2. Para usar rásteres Postgis, se requiere la extensión JDBC Image Mosaic, que se puede descargar desde http://geoserver.org/release/2.6.2/

La extensión .jar fue luego extraída en WEB-INF/lib. Esto permitirá que geoserver use rásteres de postgis. Sin embargo, para acceder a los datos, es necesario configurar varios ajustes.

Siguiendo las instrucciones en: http://docs.geotools.org/latest/userguide/library/coverage/pgraster.html pero ligeramente modificado:

create table {schema}.MOSAIC (NAME varchar(254) not null,
     TileTable varchar(254)not null,
     minX FLOAT8,minY FLOAT8, maxX FLOAT8, maxY FLOAT8,resX FLOAT8, resY FLOAT8, primary key (NAME,TileTable))

Ahora inserte registros para una "cobertura", llamada oek ​​en el ejemplo, estas son sus tablas ráster: la maestra y las piramidales.

insert into {schema}.MOSAIC (name, tiletable) values ('oek', {Main raster table name});
insert into {schema}.MOSAIC (name, tiletable) values ('oek', {raster pyramid 2 table name});
insert into {schema}.MOSAIC (name, tiletable) values ('oek', {raster pyramid 4 table name});
insert into {schema}.MOSAIC (name, tiletable) values ('oek', {raster pyramid 6 table name});

También según los documentos, para los controladores JDBC de Postgis <versión 9 es necesario establecer una propiedad en la base de datos:

ALTER DATABASE dbname SET bytea_output TO 'escape'

Ahora configuración de Geoserver:

Dentro de su directorio de datos Geoserver, cree un directorio /data/coverages, este debe contener 3 archivos:connect.pgraster.xml.inc, mapping.pgraster.xml.inc, oek.pgraster.xml

Siga http://docs.geotools.org/latest/userguide/library/coverage/pgraster.html para sus nombres y contenidos. Obviamente, ajuste la cadena de conexión de la base de datos y la configuración de nombre de usuario / contraseña enconnect.pgraster.xml.inc

mapping.pgraster.xml.inc es donde debemos hacer referencia a las tablas ráster correctamente.

<spatialExtension name="pgraster"/>
 <mapping>
  <masterTable name="MOSAIC" >
          <coverageNameAttribute name="name"/>
          <maxXAttribute name="maxX"/>
          <maxYAttribute name="maxY"/>
          <minXAttribute name="minX"/>
          <minYAttribute name="minY"/>
          <resXAttribute name="resX"/>
          <resYAttribute name="resY"/>
          <tileTableNameAtribute  name="tiletable" />
  </masterTable>
  <tileTable>
          <blobAttributeName name="rast" />
  </tileTable>
</mapping>

Entonces esto obtendrá los valores que agregamos a la tabla MOSAIC, los namevalores son las columnas de MOSAIC, que enlazan con nuestra tabla ráster y tablas piramidales. rastes el nombre de la columna ráster en las tablas ráster.

En oek.pgraster.xmlAsegúrese de que sus SRS está definida correctamente, 27700 BNG en este caso.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ImageMosaicJDBCConfig [
  <!ENTITY mapping PUBLIC "mapping"  "mapping.pgraster.xml.inc">
  <!ENTITY connect PUBLIC "connect"  "connect.pgraster.xml.inc">
]>

<config version="1.0">
  <coverageName name="oek"/>
  <coordsys name="EPSG:27700"/>
  <!-- interpolation 1 = nearest neighbour, 2 = bipolar, 3 = bicubic -->
  <scaleop  interpolation="1"/>
<axisOrder ignore="false"/>
  &mapping;
  &connect;
</config

En Geoserver ahora podemos agregar un nuevo almacén de datos.

Ir a nuevo Agregar nueva tienda.

Seleccione ImageMosaicJDBC

Póngale un nombre y configure la URL en file:coverages/oek.pgraster.xml

Guarde esto, y los dedos cruzados no se devuelven errores. Si es así, verifique los registros del geoservidor que con suerte indicarán cuál fue el problema, con suerte solo un error tipográfico o de nombres.

Vaya a agregar una nueva capa y seleccione el nuevo almacén de datos ráster.

Seleccione su nueva capa / cobertura llamada oek ​​y publíquela.

Luego, en la configuración de capa, ajuste el sistema de coordenadas y los cuadros delimitadores de forma adecuada.

Para diseñar el ráster, siga los documentos aquí: http://docs.geoserver.org/latest/en/user/styling/sld-reference/rastersymbolizer.html

Agregué un estilo:

<RasterSymbolizer>
 <Opacity>1.0</Opacity>
  <ColorMap>
   <ColorMapEntry color="#ffffff" quantity="1" label="label1" opacity="1"/>
   <ColorMapEntry color="#0000ff" quantity="200" label="label2" opacity="1"/>
  </ColorMap>
</RasterSymbolizer>

Esto coloreó mis rásteres azules donde tenían un valor.

Entonces deberías tener una capa utilizable.

Descargo de responsabilidad: no soy un experto en SIG, y mucho de lo que trabajé fue prueba y error. No tengo dudas de que hay mejores maneras de hacerlo, pero por el momento solo estoy trabajando en una prueba de concepto para confirmar si tenemos la capacidad de usar datos ráster en postgis. Detalles más precisos, como los valores ráster y el estilo, son cosas que todavía necesito resolver. Si sigo avanzando, actualizaré mi respuesta.

Tedd
fuente
2

Siguiendo las instrucciones de configuración para el complemento ráster PostGIS, debe intentar reemplazar

<spatialExtension name="postgis"/>

con

<spatialExtension name="pgraster"/>

en el archivo de configuración mapping.postgis.xml.inc.

xandriksson
fuente