Gibt es Einschränkungen bei der Verwendung eines PostGIS-Out-DB-Rasters?


8

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


4
Nur eine Anmerkung: es sieht so aus, als wäre es gut übergelaufen, da 77138 = 65536 + 11602.
Lynxlynxlynx

Antworten:


8

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.

  1. Fliesengrößen <= 100 x 100 sind am besten. kleiner ist schneller, verbraucht aber mehr Speicherplatz.

  2. 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/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.