Menerbitkan PostGIS Raster di GeoServer?

23

Bagaimana cara saya mempublikasikan raster PostGIS menggunakan GeoServer?

Saya telah menghabiskan banyak waktu untuk mencoba membuat sumber data Raster menggunakan Image Mosaic JDBC tetapi tidak berhasil.

Langkah-langkah yang dilakukan:
1. Mengunduh dan Menginstal ekstensi JDBC Image Mosaic (berfungsi ok)
2. Membuat file "Parameter Koneksi":

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>

di mana "mosaic" adalah tabel (kolom: nama, titletable, minX, minY, maxX, maxY, resX, resY) yang berisi satu baris: "gfm, testrastertable,,,,,,,,"

3. Menyimpan file konfigurasi di. ./geoserver/data_dir/coverages/
4. Saat mencoba menambahkan penyimpanan data JDBC Image Mosaic, saya menerima galat berikut:

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



Pembaruan: Log 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
asp
sumber
aktifkan log untuk verbose dan periksa file log
Ian Turton
baru saja diperbarui dengan log ... tidak memberi tahu saya terlalu banyak
asp
Karena tidak ada seorang pun di sini yang dapat membantu, Anda dapat mencoba milis GeoServer: geoserver.org/display/GEOS/Mailing+Lists
GIS-Jonathan
Adakah pembaruan untuk pertanyaan ini?
Pablo
1
Tidak ada pembaruan ... Saya harus membuang ide untuk membuat JDBC Image Mosaic karena saya tidak bisa membuatnya di Geoserver. Saya menggunakan sekarang penyimpanan ImagePyramid dan file disimpan di disk.
asp

Jawaban:

7

Saya bekerja melalui beberapa masalah mencoba menggunakan raster postgis di geoserver mirip dengan OP. Di bawah ini adalah bagaimana saya berhasil memuat data raster saya.

Pra-konfigurasi: Lapisan geotiff BNG, yang dihasilkan dari FME, telah diimpor ke postgis menggunakan raster2pgsql . Perintah yang digunakan adalah:

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

Ini menciptakan tabel raster beserta tabel piramidnya.

Saat ini server saya memiliki instance dari Geoserver 2.6.2. Untuk menggunakan raster Postgis diperlukan ekstensi JDBC Image Mosaic yang dapat diunduh dari http://geoserver.org/release/2.6.2/

Ekstensi .jar kemudian diekstraksi menjadi WEB-INF/lib . Ini kemudian akan memungkinkan geoserver untuk menggunakan raster dari postgis. Namun untuk mengakses data, beberapa pengaturan perlu dikonfigurasi.

Ikuti instruksi di: http://docs.geotools.org/latest/userguide/library/coverage/pgraster.html tetapi sedikit diubah:

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

Sekarang masukkan catatan untuk "cakupan", bernama oek ​​dalam contoh, ini adalah tabel raster Anda: master dan piramida.

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

Juga menurut dokumen, untuk driver Postgis JDBC <versi 9 perlu untuk mengatur properti dalam database:

ALTER DATABASE dbname SET bytea_output TO 'escape'

Sekarang konfigurasi Geoserver:

Dalam direktori data Geoserver Anda membuat direktori /data/coverages, ini perlu berisi 3 file:connect.pgraster.xml.inc, mapping.pgraster.xml.inc, oek.pgraster.xml

Ikuti http://docs.geotools.org/latest/userguide/library/coverage/pgraster.html untuk penamaan dan isinya. Jelas menyesuaikan string koneksi database dan pengaturan nama pengguna / kata sandi diconnect.pgraster.xml.inc

mapping.pgraster.xml.inc Di sinilah kita perlu mereferensikan tabel raster dengan benar.

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

Jadi ini akan mendapatkan nilai yang kita tambahkan ke tabel MOSAIC, namenilainya adalah kolom MOSAIC, yang menautkan ke tabel raster dan tabel piramida kami. rastadalah nama kolom raster di tabel raster.

Dalam oek.pgraster.xmlmemastikan SRS Anda diatur dengan benar, 27700 BNG dalam hal ini.

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

Di Geoserver kita sekarang dapat menambahkan datastore baru.

Buka baru Tambahkan toko baru.

Pilih ImageMosaicJDBC

Beri nama dan atur URL ke file:coverages/oek.pgraster.xml

Simpan ini, dan semoga tidak ada kesalahan yang terjadi. Jika ya, periksa log geoserver yang mudah-mudahan akan menunjukkan apa masalahnya, semoga hanya masalah kesalahan ketik atau penamaan.

Pergi untuk menambahkan layer baru dan pilih penyimpanan data raster baru.

Pilih layer / cakupan baru Anda bernama oek ​​dan publikasikan.

Kemudian dalam pengaturan lapisan, sesuaikan sistem koordinat Anda dan kotak terikat dengan tepat.

Untuk menata raster, ikuti dokumen di sini: http://docs.geoserver.org/latest/en/user/styling/sld-reference/rastersymbolizer.html

Saya menambahkan gaya:

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

Ini mewarnai raster saya biru di mana mereka memiliki nilai.

Anda kemudian harus memiliki layer yang dapat digunakan.

Penafian: Saya bukan ahli GIS, dan banyak dari apa yang saya kerjakan adalah trial and error. Saya tidak ragu bahwa ada cara yang lebih baik untuk melakukannya, tetapi untuk saat ini saya hanya bekerja pada bukti konsep untuk mengkonfirmasi jika kami memiliki kemampuan untuk menggunakan data raster di postgis. Detail yang lebih halus seperti nilai raster dan gaya adalah hal yang masih harus saya selesaikan. Jika saya membuat kemajuan lebih lanjut, saya akan memperbarui jawaban saya.

Tedd
sumber
2

Mengikuti instruksi konfigurasi untuk plugin raster PostGIS, Anda harus mencoba untuk mengganti

<spatialExtension name="postgis"/>

dengan

<spatialExtension name="pgraster"/>

dalam file konfigurasi mapping.postgis.xml.inc.

xandriksson
sumber