Publicando Rasters PostGIS no GeoServer?


23

Como publico rasters PostGIS usando o GeoServer?

Passei muito tempo tentando criar uma fonte de dados Raster usando o Image Mosaic JDBC, mas sem sorte.

Etapas executadas:
1. Baixou e instalou a extensão JDBC Image Mosaic (funcionou bem)
2. Criou os arquivos "Connection Parameter":

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>

onde "mosaic" é uma tabela (colunas: nome, titletable, minX, minY, maxX, maxY, resX, resY) contendo uma linha: "gfm, testrastertable,,,,,,,".

3. Salve os arquivos de configuração em. ./geoserver/data_dir/coverages/
4. Ao tentar adicionar um armazenamento de dados JDBC do Image Mosaic, recebo o seguinte erro:

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



Atualização: log do 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

vire o log para detalhado e verifique o arquivo de log
Ian Turton

apenas atualizado com o log ... não me diz muito
asp

Como ninguém aqui parece capaz de ajudar, você pode tentar a lista GeoServer discussão: geoserver.org/display/GEOS/Mailing+Lists
GIS-Jonathan

Alguma atualização sobre esta questão?
Pablo

1
Sem atualizações ... Eu tive que largar a ideia de criar um mosaico de imagens JDBC porque simplesmente não consegui criá-lo no Geoserver. Estou usando agora o armazenamento ImagePyramid e os arquivos são mantidos no disco.
asp

Respostas:


7

Eu trabalhei com vários problemas tentando usar uma varredura postgis no geoserver semelhante ao OP. A seguir, mostramos como carreguei com êxito meus dados rasterizados.

Pré-configuração: Uma camada de geotiff BNG, gerada a partir do FME, foi importada para o postgis usando raster2pgsql. O comando usado foi:

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

Isso criou a tabela raster junto com suas tabelas em pirâmide.

Atualmente, meu servidor possui uma instância de Geoserver 2.6.2. Para usar os rasters do Postgis, é necessária a extensão JDBC Image Mosaic, que pode ser baixada em http://geoserver.org/release/2.6.2/

A extensão .jar foi então extraída WEB-INF/lib. Isso permitirá que o geoserver use rasters do postgis. No entanto, para acessar os dados, várias configurações precisam ser configuradas.

Seguindo as instruções em: http://docs.geotools.org/latest/userguide/library/coverage/pgraster.html, mas ligeiramente aprimorado:

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))

Agora insira registros para uma "cobertura", chamada oek ​​no exemplo, estas são suas tabelas raster: a principal e a 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});

Ainda de acordo com a documentação, para os drivers Postgis JDBC <versão 9, é necessário definir uma propriedade no banco de dados:

ALTER DATABASE dbname SET bytea_output TO 'escape'

Agora configuração do Geoserver:

Dentro do diretório de dados do Geoserver, crie um diretório /data/coverages, ele precisa conter 3 arquivos:connect.pgraster.xml.inc, mapping.pgraster.xml.inc, oek.pgraster.xml

Siga http://docs.geotools.org/latest/userguide/library/coverage/pgraster.html para obter nomes e conteúdo. Obviamente, ajuste a cadeia de conexão do banco de dados e as configurações de nome de usuário / senha emconnect.pgraster.xml.inc

mapping.pgraster.xml.inc é onde precisamos fazer referência às tabelas raster corretamente.

<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>

Portanto, isso obterá os valores que adicionamos à tabela MOSAIC, os namevalores são as colunas de MOSAIC, que se vinculam às nossas tabelas raster e pirâmide. rasté o nome da coluna de varredura nas tabelas de varredura.

Em oek.pgraster.xmlVerifique se o seu SRS está configurado corretamente, 27700 BNG neste 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

No Geoserver, agora podemos adicionar um novo armazenamento de dados.

Vá para o novo Adicionar nova loja.

Selecione ImageMosaicJDBC

Dê um nome e defina o URL como file:coverages/oek.pgraster.xml

Salve isso e os dedos cruzados não retornam erros. Se estiverem, verifique os logs do servidor geográfico que, esperançosamente, indicarão qual foi o problema, espero que apenas um erro de digitação ou nomeação.

Vá para adicionar uma nova camada e selecione o novo armazenamento de dados raster.

Selecione sua nova camada / cobertura chamada oek ​​e publique-a.

Em seguida, nas configurações da camada, ajuste seu sistema de coordenadas e as caixas delimitadoras adequadamente.

Para estilizar a varredura, siga os documentos aqui: http://docs.geoserver.org/latest/en/user/styling/sld-reference/rastersymbolizer.html

Eu adicionei um 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>

Isso coloriu meus rasters de azul onde eles tinham um valor.

Você deve ter uma camada utilizável.

Isenção de responsabilidade: não sou especialista em GIS, e muito do que trabalhei foi tentativa e erro. Não tenho dúvidas de que existem maneiras melhores de fazê-lo, mas, por enquanto, só estou trabalhando em uma prova de conceito para confirmar se temos a capacidade de usar dados rasterizados no postgis. Detalhes mais refinados, como valores raster e estilo, são coisas que eu ainda preciso resolver. Se eu fizer algum progresso, atualizarei minha resposta.


2

Seguindo as instruções de configuração do plug-in de varredura PostGIS, você deve tentar substituir

<spatialExtension name="postgis"/>

com

<spatialExtension name="pgraster"/>

no arquivo de configração mapping.postgis.xml.inc.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.