Có giới hạn nào khi sử dụng raster PostGIS out-db không?


8

Tôi đã cố gắng nhập một raster lớn vào cơ sở dữ liệu PostGIS 2.0 và gặp một vài vấp ngã.

Ban đầu khi tôi cố gắng nhập raster bằng raster2pgsql, tôi sẽ nhận được lỗi sau: rt_band_set_pixel_line: Tọa độ ngoài phạm vi

Sau khi tìm thấy trang này và sử dụng gdalinfo tôi thấy rằng raster vượt quá kích thước tối đa được phép là 65535 x 65535.

đầu ra gdalinfo:

$ gdalinfo ari100.tif
Trình điều khiển: GTiff / GeoTIFF
... Kích thước là 42971,
Hệ thống tọa độ 77138 là:
GEOGCS ["WGS 84",
...
AUTHORITY ["EPSG", "4326"]] Origin = (152.741676637167842, 2008 )
Kích thước điểm ảnh = (,000009239757419, -,000009239757419)
Metadata:
AREA_OR_POINT = Diện tích
hình ảnh cấu trúc siêu dữ liệu:
Interleave = BAND
Corner Tọa độ:
Upper Left (152,7416766, -26,2153028) (152d44'30.04 "E, 26d12'55.09" S)
dưới bên trái (152,7416766 , -26,9280392) (152d44'30.04 "E, 26d55'40.94" S)
Phía trên bên phải (153.1387183, -26.2153028) (153d 8'19,39 "E, 26d12'55.09 "S)
Trung tâm bên phải (153.1387183, -26.9280392) (
Trung tâm 153d 8'19,39 "E, 26d55'40.94" S) (152.9401974, -26.5716710) (152d56'24.71 "E, 26d34'18.02" S)
Band 1 , ColorInterp = Xám
...

Vì vậy, tôi quyết định sử dụng chức năng out-db bằng cách sử dụng cờ -R trong raster2pgsql.

Từ tài liệu: Đăng ký raster dưới dạng raster systemystem (out-db), Chỉ siêu dữ liệu của raster và vị trí đường dẫn đến raster mới được lưu trữ trong cơ sở dữ liệu (không phải pixel).

Tôi đã nhập raster bằng lệnh sau:

raster2pgsql /gis/Flood/ari100.tif -R | psql -U username database

Nhưng khi tôi thử một truy vấn:

SELECT ST_Value(rast, ST_PointFromText('POINT(152.9632 -26.4878)')) FROM ari100

Tôi nhận được lỗi sau đây:

NOTICE:  Attempting to get pixel value with out of range raster coordinates: (23975, 29491)  
CONTEXT:  PL/pgSQL function "st_value" line 13 at RETURN  

Tuy nhiên, nếu tôi sử dụng GDAL (thông qua Python) để truy vấn raster trực tiếp bằng tập lệnh này

python val_at_coord.py 152.9632 -26.4878

Tôi có thể lấy lại giá trị một cách chính xác.

Tôi quyết định tìm phạm vi của raster trong cơ sở dữ liệu:

SELECT ST_Height(rast) As rastheight, ST_Width(rast) As rastwidth from ari100;

rastheight | rastwidth  
11602      | 42971  

Chiều cao hoàn toàn không chính xác (nên là 77138).

Vì vậy, câu hỏi của tôi là: tôi đã làm điều gì sai (khi sử dụng raster2pgsql) hoặc có giới hạn trong việc sử dụng các trình raster out-db với PostGIS không?

Cảm ơn


4
Chỉ cần một lưu ý: có vẻ như nó đã tràn ra độc đáo, vì 77138 = 65536 + 11602.
lynxlynxlynx

Câu trả lời:


8

Bạn chắc chắn sẽ muốn gạch raster của bạn. Chiều rộng x chiều cao tối đa được phép cho loại raster PostGIS là 65535 x 65535, bất kể raster là in-db hay out-db. Lý do khác để xếp raster của bạn (mặc dù điều này có thể không áp dụng trong trường hợp của bạn) là kích thước trường tối đa được PostgreQuery cho phép là 1 GB [1].

Đối với kích thước gạch tối ưu, tôi chỉ có thể đề xuất hai điều.

  1. Kích thước gạch <= 100 x 100 là tốt nhất. nhỏ hơn là nhanh hơn nhưng tiêu thụ nhiều không gian lưu trữ hơn.

  2. Nếu có thể, hãy tìm kích thước ô chia hết cho các kích thước của raster. Vì vậy, đối với một raster 42971 x 77138, không có kích thước gạch <= 100 x 100 hoạt động sạch sẽ. Trong những tình huống này, tôi thường chỉ đi 50 x 50 hoặc một cái gì đó trong khu phố đó.

-bborie

[1] http://www.postgresql.org/about/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.