¿Publicar PostGIS Rasters en GeoServer?

21

¿Cómo publico los rasters de PostGIS usando GeoServer?

He pasado mucho tiempo intentando crear una fuente de datos ráster utilizando Image Mosaic JDBC pero sin suerte.

Pasos realizados:
1. Descargó e instaló la extensión de mosaico de imágenes JDBC (funcionó bien)
2. Creó los archivos de "Parámetro 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ítulos, minX, minY, maxX, maxY, resX, resY) que contiene una fila: "gfm, testrastertable,"

3. Guardó 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
    
pregunta asp 24.10.2012 - 12:54

2 respuestas

7

Resolví varios problemas al intentar usar un ráster postgis en geoserver similar al OP. La siguiente es cómo cargué con éxito mis datos rasterizados.

Preconfiguración: una capa 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 los rasters de Postgis, se requiere la extensión JDBC Image Mosaic, que se puede descargar desde enlace

La extensión .jar se extrajo luego en WEB-INF/lib . Esto permitirá a geoserver utilizar rásteres de Postgis. Sin embargo, para acceder a los datos es necesario configurar varias configuraciones.

Siguiendo las instrucciones en: enlace 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 la pirámide.

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 de acuerdo con los documentos, para controladores JDBC de Postgis < La versión 9 es necesaria para 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 de Geoserver cree un directorio /data/coverages , esto debe contener 3 archivos: connect.pgraster.xml.inc, mapping.pgraster.xml.inc, oek.pgraster.xml

Siga enlace 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 en connect.pgraster.xml.inc

mapping.pgraster.xml.inc es donde necesitamos 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>

Así que esto obtendrá los valores que agregamos a la tabla MOSAIC, los valores name son las columnas de MOSAIC , que se vinculan a nuestra tabla ráster y tablas piramidales. rast es el nombre de la columna ráster en las tablas ráster.

En oek.pgraster.xml , asegúrese de que su SRS esté correctamente configurado, 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.

Seleccionar ImageMosaicJDBC

Asígnele un nombre y establezca la URL en file:coverages/oek.pgraster.xml

Guarda esto, y los dedos cruzados no se devuelven errores. Si es así, verifique los registros de geoserver que, con suerte, indicarán cuál fue el problema, ojalá sea un error tipográfico o de nomenclatura.

Ir para agregar una nueva capa y seleccionar el nuevo almacén de datos ráster.

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

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

Para diseñar el ráster, siga los documentos aquí: enlace

He añadido 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 coloreaba mis rasters en azul donde tenían un valor.

Entonces deberías tener una capa utilizable.

Descargo de responsabilidad: no soy un experto en SIG, y gran parte de lo que trabajé fue por 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 raster en Postgis. Los detalles más finos, como los valores ráster y el estilo, son cosas que aún debo resolver. Si hago más progresos, actualizaré mi respuesta.

    
respondido por el Tedd 10.12.2015 - 12:23
2

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

<spatialExtension name="postgis"/>

con

<spatialExtension name="pgraster"/>

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

    
respondido por el xandriksson 17.06.2013 - 16:20

Lea otras preguntas en las etiquetas