Saya telah mencoba untuk mengimpor raster besar ke dalam database PostGIS 2.0 dan mendapatkan beberapa batu sandungan.
Awalnya ketika saya mencoba mengimpor raster menggunakan raster2pgsql, saya akan menerima kesalahan berikut: rt_band_set_pixel_line: Koordinat di luar jangkauan
Setelah menemukan halaman ini , dan menggunakan gdalinfo, saya menemukan bahwa raster melebihi ukuran maksimum yang diizinkan yaitu 65535 x 65535.
keluaran gdalinfo:
$ gdalinfo ari100.tif
Driver: GTiff / GeoTIFF
... Ukurannya adalah 42971, 77138
Sistem Koordinat adalah:
GEOGCS ["WGS 84",
...
AUTHORITY ["EPSG", "4326"]] Origin = (152.7416773737167842, -26.215302802012008 )
Ukuran Pixel = (,000009239757419, -,000009239757419)
Metadata:
AREA_OR_POINT = Lokasi
Gambar Struktur Metadata:
interleave = BAND
Pojok Koordinat:
Atas Kiri (152,7416766, -26,2153028) (152d44'30.04 "E, 26d12'55.09" S)
bawah Kiri (152,7416766 , -26.9280392) (152d44'30.04 "E, 26d55'40.94" S)
Kanan Atas (153.1387183, -26.2153028) (153d 8'19.39 "E, 26d12'55.09 "S)
Kanan Bawah (153.1387183, -26.9280392) (153d 8'19.39 "E, 26d55'40.94" S)
Center (152.9401974, -26.5716710) (152d56'24.71 "E, 26d34'18.02" S)
Band 1 Blok = 42971x1 Jenis = Float32 , ColorInterp = Abu-abu
...
Jadi saya memutuskan untuk menggunakan fungsionalitas out-db dengan menggunakan flag -R di raster2pgsql.
Dari dokumentasi: Daftarkan raster sebagai raster filesystem (out-db), Hanya metadata dari raster dan lokasi jalur ke raster yang disimpan dalam database (bukan piksel).
Saya mengimpor raster menggunakan perintah berikut:
raster2pgsql /gis/Flood/ari100.tif -R | psql -U username database
Tetapi ketika saya mencoba kueri:
SELECT ST_Value(rast, ST_PointFromText('POINT(152.9632 -26.4878)')) FROM ari100
Saya mendapatkan kesalahan berikut:
NOTICE: Attempting to get pixel value with out of range raster coordinates: (23975, 29491)
CONTEXT: PL/pgSQL function "st_value" line 13 at RETURN
Namun, jika saya menggunakan GDAL (melalui Python) untuk meminta raster secara langsung menggunakan skrip ini
python val_at_coord.py 152.9632 -26.4878
Saya dapat mengambil nilai dengan benar.
Saya memutuskan untuk menemukan luasan raster dalam database:
SELECT ST_Height(rast) As rastheight, ST_Width(rast) As rastwidth from ari100;
rastheight | rastwidth
11602 | 42971
Ketinggiannya benar-benar salah (harus 77138).
Jadi pertanyaan saya adalah: apakah saya melakukan sesuatu yang salah (menggunakan raster2pgsql) atau apakah ada batasan dalam menggunakan raster out-db dengan PostGIS?
Terima kasih
sumber
Jawaban:
Anda pasti ingin memasang raster Anda. Lebar x tinggi maksimum yang diijinkan untuk tipe raster PostGIS adalah 65535 x 65535, terlepas dari apakah rasternya adalah in-db atau out-db. Alasan lain untuk memasang raster Anda (meskipun ini mungkin tidak berlaku dalam kasus Anda) adalah bahwa ukuran bidang maksimum yang diizinkan oleh PostgreSQL adalah 1 GB [1].
Adapun ukuran ubin optimal, saya hanya bisa menyarankan dua hal.
Ukuran ubin <= 100 x 100 adalah yang terbaik. lebih kecil lebih cepat tetapi mengkonsumsi lebih banyak ruang penyimpanan.
Jika memungkinkan, cari ukuran ubin yang dapat dibagi bersih dari dimensi raster. Jadi untuk raster 42971 x 77138, tidak ada ukuran ubin <= 100 x 100 yang berfungsi dengan baik. Dalam situasi ini, saya biasanya hanya pergi 50 x 50 atau sesuatu di lingkungan itu.
-Bborie
[1] http://www.postgresql.org/about/
sumber