Ich habe versucht, ein großes Raster in eine PostGIS 2.0-Datenbank zu importieren und bin auf einige Stolpersteine gestoßen.
Beim Versuch, das Raster mit raster2pgsql zu importieren, wurde zunächst der folgende Fehler angezeigt: rt_band_set_pixel_line: Koordinaten außerhalb des Bereichs
Nachdem ich diese Seite gefunden und gdalinfo verwendet hatte, stellte ich fest, dass das Raster die maximal zulässige Größe von 65535 x 65535 überschritten hatte.
gdalinfo Ausgabe:
$ gdalinfo ari100.tif
Treiber: GTiff / GeoTIFF
... Größe ist 42971, 77138
Koordinatensystem ist:
GEOGCS ["WGS 84",
...
AUTHORITY ["EPSG", "4326"]] Origin = (152.741676637167842, -26.215302802012008 )
Pixelgröße = (,000009239757419, -,000009239757419)
Metadaten:
AREA_OR_POINT = Bereich
Bildaufbau - Metadaten:
INTERLEAVE = BAND
Corner Koordinaten:
Oben links (152,7416766, -26,2153028) (152d44'30.04 "E, 26d12'55.09" S)
unten links (152,7416766 , -26,9280392) (152d44'30,04 "E, 26d55'40,94" S) oben
rechts (153,1387183, -26,2153028) (153d 8'19,39 "E, 26d12'55.09 "S)
Unten rechts (153.1387183, -26.9280392) (153d 8'19.39 "E, 26d55'40.94" S)
Mitte (152.9401974, -26.5716710) (152d56'24.71 "E, 26d34'18.02" S)
Band 1 Block = 42971x1 Typ = Float32 , ColorInterp = Grau
...
Deshalb habe ich mich entschlossen, die out-db-Funktionalität mithilfe des -R-Flags in raster2pgsql zu verwenden.
Aus der Dokumentation: Registrieren Sie das Raster als Dateisystem-Raster (out-db). In der Datenbank werden nur die Metadaten des Rasters und der Pfadposition zum Raster gespeichert (nicht die Pixel).
Ich habe das Raster mit dem folgenden Befehl importiert:
raster2pgsql /gis/Flood/ari100.tif -R | psql -U username database
Aber als ich eine Abfrage versuchte:
SELECT ST_Value(rast, ST_PointFromText('POINT(152.9632 -26.4878)')) FROM ari100
Ich erhalte folgende Fehlermeldung:
NOTICE: Attempting to get pixel value with out of range raster coordinates: (23975, 29491)
CONTEXT: PL/pgSQL function "st_value" line 13 at RETURN
Wenn ich jedoch GDAL (über Python) verwende, um das Raster direkt mit diesem Skript abzufragen
python val_at_coord.py 152.9632 -26.4878
Ich kann den Wert korrekt abrufen.
Ich habe beschlossen, die Ausmaße des Rasters in der Datenbank zu finden:
SELECT ST_Height(rast) As rastheight, ST_Width(rast) As rastwidth from ari100;
rastheight | rastwidth
11602 | 42971
Die Höhe ist völlig falsch (sollte 77138 sein).
Meine Frage lautet also: Habe ich etwas falsch gemacht (bei der Verwendung von raster2pgsql) oder gibt es eine Einschränkung bei der Verwendung von Out-DB-Rastern mit PostGIS?
Vielen Dank
quelle
Antworten:
Sie werden auf jeden Fall Ihr Raster kacheln wollen. Die maximal zulässige Breite x Höhe für den PostGIS-Rastertyp beträgt 65535 x 65535, unabhängig davon, ob das Raster in-db oder out-db ist. Der andere Grund für die Kachelung Ihres Rasters (obwohl dies in Ihrem Fall möglicherweise nicht zutrifft) ist, dass die von PostgreSQL maximal zulässige Feldgröße 1 GB beträgt [1].
Für eine optimale Fliesengröße kann ich nur zwei Dinge vorschlagen.
Fliesengrößen <= 100 x 100 sind am besten. kleiner ist schneller, verbraucht aber mehr Speicherplatz.
Suchen Sie nach Möglichkeit eine Kachelgröße, die sauber von den Abmessungen des Rasters teilbar ist. Bei einem Raster von 42971 x 77138 funktioniert also keine Kachelgröße <= 100 x 100 sauber. In diesen Situationen gehe ich normalerweise nur 50 x 50 oder so in dieser Nachbarschaft.
-bborie
[1] http://www.postgresql.org/about/
quelle