Chapter 13. PostGIS栅格常见问题解答

13.1. 我在哪里可以找到有关PostGIS栅格项目的更多信息?
13.2. 有没有什么书或教程能让我开始了解这项奇妙的发明?
13.3. 如何在我的PostGIS数据库中安装栅格支持?
13.4. 如何将栅格数据加载到PostGIS中?
13.5. 我可以将哪种类型的栅格文件格式加载到数据库中?
13.6. 我可以将我的PostGIS栅格数据导出为其他栅格格式吗?
13.7. 他们的GDAL二进制文件是否已使用PostGIS Raster支持进行编译?
13.8. 我可以使用哪些工具来查看PostGIS栅格数据?
13.9. 如何将PostGIS栅格图层添加到我的MapServer地图?
13.10. 我当前可以对我的栅格数据使用哪些函数?
13.11. 我收到错误:函数st_intersects(raster,未知)不唯一或st_Union(几何图形,文本)不唯一。我该怎么修?
13.12. PostGIS Raster与Oracle GeoRaster(SDO_GEORASTER)和SDO_RASTER类型有何不同?
13.13. 大文件的raster2pgsql加载失败,N字节的字符串对于编码转换来说是否太长?
13.14. 我收到了错误消息 ERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format. 使用ST_FromGDALRaster或 ERROR: rt_raster_to_gdal: Could not load the output GDAL driver 尝试使用ST_AsPNG或其他栅格输入函数时。

13.1.

我在哪里可以找到有关PostGIS栅格项目的更多信息?

请参阅 PostGIS栅格主页

13.2.

有没有什么书或教程能让我开始了解这项奇妙的发明?

有一个完整的初学者教程 使用PostGIS栅格与栅格覆盖率较大的矢量缓冲区相交 。Jorge有一系列关于PostGIS Raster的博客文章,这些文章演示了如何加载栅格数据以及如何与Oracle GeoRaster中的相同任务进行交叉比较。查看: 豪尔赫的PostGIS栅格/Oracle GeoRaster系列 。有一整章(超过35页的内容)专门介绍PostGIS栅格,可从以下网址免费下载代码和数据 PostGIS在行动-栅格章节。在第二版中也有报道。 。你可以的 购买实际中的PostGIS 现在,来自曼宁的书有硬拷贝(批量购买有很大折扣)或只有电子书格式。你也可以从亚马逊和其他各种图书分销商那里购买。所有纸质书都有一张免费优惠券,可以下载电子书版本。

以下是一位PostGIS栅格用户的评论 PostGIS栅格在城市林业土地分类中的应用

13.3.

如何在我的PostGIS数据库中安装栅格支持?

PostGIS Raster是PostGIS代码库的一部分,通常可用于大多数PostGIS二进制发行版。从PostGIS 3.0开始,PostGIS栅格现在是一个单独的扩展,需要: `CREATE EXTENSION postgis_raster;` 在您的数据库中启用它。如果您正在编译您自己的PostGIS,则需要使用GDAL进行编译,否则将不会构建postgis_raster扩展。

请参阅 下载PostGIS二进制文件 适用于包含栅格支持的流行的PostGIS发行版。

13.4.

如何将栅格数据加载到PostGIS中?

最新版本的PostGIS附带了一个 raster2pgsql 栅格加载器可执行,能够加载多种类型的栅格,也可以生成较低分辨率的概视图,而无需任何额外的软件。请参阅 Section 11.1.1, “使用raster2pgsql加载栅格” 了解更多详细信息。

13.5.

我可以将哪种类型的栅格文件格式加载到数据库中?

您的GDAL库支持的任何内容。记录了GDAL支持的格式 GDAL文件格式

您的特定GDAL安装可能不支持所有格式。要验证特定GDAL安装支持的GDAL,您可以使用

raster2pgsql -G

13.6.

我可以将我的PostGIS栅格数据导出为其他栅格格式吗?

PostGIS栅格具有以下功能 ST_AsGDALRaster 这将允许您使用SQL导出到您的GDAL支持的任何栅格格式。您可以使用以下命令获取这些列表 ST_GDALDrivers SQL函数。

您也可以使用GDAL命令行工具将PostGIS栅格导出为其他格式。GDAL有一个PostGIS栅格驱动程序,但只有在您选择使用PostgreSQL支持进行编译时才会进行编译。

该驱动程序目前不支持不规则分块的栅格,尽管您可以将不规则分块的栅格存储为PostGIS栅格数据类型。

如果从源代码进行编译,则需要在配置中包含

 --WITH-PG=路径/至/PG_CONFIG 

以启用驱动程序。参考 GDAL构建提示 获取有关在各种操作系统平台上构建GDAL的提示。

如果您的GDAL版本是使用PostGIS栅格驱动程序编译的,则在执行此操作时应在列表中看到PostGIS栅格

gdalinfo --formats

要通过GDAL获取有关栅格的摘要,请使用gdalinfo:

gdalinfo  "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable"

要将数据导出为其他栅格格式,请使用Gdal_Translate下面将以10%的大小将表中的所有数据导出到PNG文件。

根据像素带类型的不同,如果导出格式不支持该像素类型,则某些转换可能不起作用。例如,浮点带类型和32位无符号整数不能很容易地转换为JPG或其他类型。

下面是一个简单的翻译例子

gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable" C:\somefile.png

还可以使用WHERE=...在导出中使用SQL WHERE子句在您的驱动程序连接字符串中。下面是一些使用WHERE子句的代码

gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable where='filename=\'abcd.sid\''" " C:\somefile.png
gdal_translate -of PNG -outsize 10% 10% "PG:host=localhost port=5432 dbname='mygisdb' user='postgres' password='whatever' schema='someschema' table=sometable where='ST_Intersects(rast, ST_SetSRID(ST_Point(-71.032,42.3793),4326) )' " C:\intersectregion.png

要查看更多示例和语法,请参阅 读取PostGIS栅格区的栅格数据

13.7.

他们的GDAL二进制文件是否已使用PostGIS Raster支持进行编译?

是。查看页面 GDAL二进制文件 佩奇。任何支持PostgreSQL的编译工具都应该包含PostGIS栅格。GDAL工具通常也包含在 QGIS

如果您想获得Windows的最新夜间构建--那么请查看使用Visual Studio构建的Tamas Szekeres夜间构建,其中包含GDAL主干、Python绑定、MapServer可执行文件和内置的PostGIS栅格驱动程序。只需点击SDK BAT并从那里运行您的命令。 http://www.gisinternals.com 。VS项目文件也是可用的。

13.8.

我可以使用哪些工具来查看PostGIS栅格数据?

您可以使用 MapServer 使用GDAL编译以查看栅格数据。如果安装了PostGIS栅格驱动程序,则QGIS支持查看PostGIS栅格。

理论上,任何使用GDAL渲染数据的工具都可以支持PostGIS栅格数据,或者只需很少的工作就可以支持它。同样适用于Windows,Tamas的二进制文件(包括MapServer) http://www.gisinternals.com 对于Windows用户来说是一个很好的选择,如果你不想麻烦的话必须安装编译自己的。

13.9.

如何将PostGIS栅格图层添加到我的MapServer地图?

首先,您需要使用PostGIS栅格支持编译的GDAL 1.7或更高版本。GDAL 3或更高版本是首选,因为在1.8版本中修复了许多问题,并且在主干版本中修复了更多的PostGIS栅格问题。

您可以像处理任何其他栅格一样。参考 地图服务器栅格处理选项 有关可用于MapServer栅格图层的各种处理函数的列表,请参见。

使PostGIS栅格数据特别有趣的是,由于每个切片可以具有各种标准数据库列,因此您可以在数据源中对其进行分段

以下是如何在MapServer中定义PostGIS栅格图层的示例。

[Note]

模式=2是平铺栅格所必需的,已添加到PostGIS 2.0和GDAL 1.8驱动程序中。这在GDAL 1.7驱动程序中不存在。

-- displaying raster with standard raster options
LAYER
        NAME coolwktraster
        TYPE raster
        STATUS ON
        DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever'
                schema='someschema' table='cooltable' mode='2'"
        PROCESSING "NODATA=0"
        PROCESSING "SCALE=AUTO"
        #... other standard raster processing functions here
        #... classes are optional but useful for 1 band data
        CLASS
                NAME "boring"
                EXPRESSION ([pixel] < 20)
                COLOR 250 250 250
        END
        CLASS
                NAME "mildly interesting"
                EXPRESSION ([pixel] > 20 AND [pixel] < 1000)
                COLOR 255 0 0
        END
        CLASS
                NAME "very interesting"
                EXPRESSION ([pixel] >= 1000)
                COLOR 0 255 0
        END
END
        
-- displaying raster with standard raster options and a where clause
LAYER
        NAME soil_survey2009
        TYPE raster
        STATUS ON
        DATA "PG:host=localhost port=5432 dbname='somedb' user='someuser' password='whatever'
                schema='someschema' table='cooltable' where='survey_year=2009' mode='2'"
        PROCESSING "NODATA=0"
        #... other standard raster processing functions here
        #... classes are optional but useful for 1 band data
END
        

13.10.

我当前可以对我的栅格数据使用哪些函数?

请参阅以下列表 Chapter 12, 栅格参考 。还有更多,但这仍是一项正在进行的工作。

请参阅 PostGIS栅格路线图页面 以了解未来可期待的详细情况。

13.11.

我收到错误:函数st_intersects(raster,未知)不唯一或st_Union(几何图形,文本)不唯一。我该怎么修?

如果您的其中一个参数是几何体的文本表示,而不是几何体,则会发生函数不唯一错误。在这些情况下,PostgreSQL将文本表示标记为未知类型,这意味着它可能落入st_intersects(栅格、几何)或st_intersects(栅格、栅格),从而导致不唯一的情况,因为这两个函数在理论上都可以支持您的请求。要避免这种情况,需要将几何体的文本表示形式强制转换为几何体。

例如,如果您的代码如下所示:

SELECT rast
 FROM my_raster
   WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)');

通过将代码更改为以下代码,将文本几何图形表示转换为几何图形:

SELECT rast
 FROM my_raster
   WHERE ST_Intersects(rast, 'SRID=4326;POINT(-10 10)'::geometry);

13.12.

PostGIS Raster与Oracle GeoRaster(SDO_GEORASTER)和SDO_RASTER类型有何不同?

有关这个主题的更广泛的讨论,请查看Jorge Aévalo Oracle GeoRaster和PostGIS栅格:第一印象

与逐层地理配准相比,逐栅格地理配准的主要优势在于:

*覆盖范围不一定是矩形的(栅格覆盖范围大时通常是这种情况。请参阅文档中可能的栅格排列)

*栅格到重叠(这是实现无损矢量到栅格转换所必需的)

这些安排在Oracle中也是可能的,但它们意味着存储链接到尽可能多的SDO_RASTER表的多个SDO_GEORASTER对象。复杂的覆盖可能会导致数据库中有数百个表。使用PostGIS Raster,您可以将类似的栅格排列存储到唯一的表格中。

这有点像如果PostGIS强制您只存储没有间隙或重叠的完全矩形矢量覆盖(完美的矩形拓扑层)。这在一些应用中是非常实用的,但实践表明,对于大多数地理覆盖来说,这是不现实或不可取的。矢量结构需要灵活地存储不连续和非矩形的覆盖率。我们认为,栅格结构也应该受益,这是一个很大的优势。

13.13.

大文件的raster2pgsql加载失败,N字节的字符串对于编码转换来说是否太长?

在生成要加载的文件时,raster2pgsql不会与数据库建立任何连接。如果数据库设置了与数据库编码不同的显式客户端编码,则在加载大型栅格文件(大小超过30 MB)时,可能会遇到 bytes is too long for encoding conversion

例如,如果您的数据库使用UTF8,但为了支持Windows应用程序,您将客户端编码设置为 WIN1252

要解决此问题,请确保客户端编码与加载期间的数据库编码相同。您可以通过在加载脚本中显式设置编码来实现这一点。例如,如果您使用的是Windows:

set PGCLIENTENCODING=UTF8

如果您在Unix/Linux上

export PGCLIENTENCODING=UTF8

这个问题的血淋淋的细节在 http://trac.osgeo.org/postgis/ticket/2209

13.14.

我收到了错误消息 ERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format. 使用ST_FromGDALRaster或 ERROR: rt_raster_to_gdal: Could not load the output GDAL driver 尝试使用ST_AsPNG或其他栅格输入函数时。

从PostGIS 2.1.3和2.0.5开始,对安全性进行了更改,默认禁用所有GDAL驱动程序和数据库栅格。发行说明位于 PostGIS 2.0.6、2.1.3安全版本 。要重新启用特定驱动程序或所有驱动程序并重新启用数据库外支持,请参阅 Section 2.1, “简略版”