前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostGIS导入导出栅格数据

PostGIS导入导出栅格数据

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-22 10:44:27
4.2K0
发布2019-01-22 10:44:27
举报

上一篇博文PostGIS导入导出ESRI Shapefile数据介绍了如何导入空间矢量数据到PostgreSQL中,紧接上一篇,本文将介绍如何使用PostGIS导入导出空间栅格数据。 实验环境和上一篇的博文一样: Ubuntu 16.04 LTS 。 数据为全球影像(ESRI ArcGIS提供的示例数据),下载连接:全球影像百度网盘下载 可以使用GDAL的gdalinfo命令查看其详细信息:

gdalinfo
gdalinfo

在QGIS中查看如下:

wsiearth.tif
wsiearth.tif

PostGIS提供了raster2pgsql工具用于栅格数据的导入(可以使用man raster2pgsql命令查看帮助文档)。 使用如下命令进行影像数据的插入,具体参数的含义这里不在累赘,上篇文章有说明。关于raster2pgsql的参数可以使用man命令进行查看。

代码语言:javascript
复制
raster2pgsql -s 4326 -C ~/Downloads/gisdata/wsiearth.tif staging.wsiearth | psql -h localhost -p 5432 -U postgres -d postgis_in_action -W
PostGIS插入栅格数据
PostGIS插入栅格数据

可以使用psql进入数据库查看:

PostGIS插入栅格数据
PostGIS插入栅格数据

还可以使用\d staging.wsiearth查看关系表的结构:

PostGIS中的栅格关系表
PostGIS中的栅格关系表

可以看到有一个rid和rast的列,rid是以一个整形对插入的栅格数据进行的标示,rast列的类型是raster存储了具体数据。


如果想要导出数据,可以使用PostGIS提供的内置函数。其中ST_AsGDALRaster 是一个通用性的函数,可以导出为GDAL支持的任意格式。此外,还有ST_AsPNG,ST_AsJPEG和ST_AsTIFF等函数,提供了直接导出到指定格式,并且接受更少的参数。 注意:PostGIS的默认导出GDAL支持的格式数据是关闭的,启用的话需要修改PostgreSQL的配置文件。修改的方法比较多,而且不同的PostgreSQL版本的支持情况不一样。我使用如下命令进行修改:

代码语言:javascript
复制
sudo vim /etc/postgresql/9.5/main/postgresql.conf

在该配置文件后面添加:

代码语言:javascript
复制
postgis.gdal_enabled_drivers = 'ENABLE_ALL'
postgis.enable_outdb_rasters = True

重启PostgreSQL:

代码语言:javascript
复制
sudo service postgresql restart

参考链接: http://postgis.net/docs/postgis_gdal_enabled_drivers.html http://postgis.net/docs/manual-2.2/postgis_enable_outdb_rasters.html

第二个问题是:这些内置函数提供的导出结果是PostgreSQL的bytea (byte array)数据类型,我们需要自己写程序进行转换成实际的图像文件。


下面我使用Python的Psycopg库连接PostgreSQL数据库,进行查询并导出最终的结果。Psycopg库参见:http://initd.org/psycopg/docs/index.html。 我这里直接贴出代码,因为代码很容易理解。ST_AsTIFF函数参见:http://postgis.net/docs/RT_ST_AsTIFF.html

代码语言:javascript
复制
# -*- coding: utf-8 -*-

import psycopg2

# Connect to an existing database
conn = psycopg2.connect('host=localhost port=5432 user=postgres password=password dbname=postgis_in_action')

# Open a cursor to perform database operations
cur = conn.cursor()

# Execute SQL query
cur.execute("SELECT ST_AsTIFF(rast, 'LZW') AS rasttiff FROM staging.wsiearth WHERE rid=1;")

# Fetch data as Python objects
rasttiff = cur.fetchone()

# Write data to file
if rasttiff is not None:
    open('/home/theone/Desktop/wsiearth.tif', 'wb').write(str(rasttiff[0]))

# Close communication with the database
cur.close()
conn.close()

在QGIS中查看导出结果如下:

PostGIS导出结果
PostGIS导出结果

可以发现导出的结果,丢失了图像的colormap,但是每个像素值都是正确的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年02月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 PostgreSQL
腾讯云数据库 PostgreSQL(TencentDB for PostgreSQL,云 API 使用 postgres 作为简称)能够让您在云端轻松设置、操作和扩展目前功能最强大的开源数据库 PostgreSQL。腾讯云将负责绝大部分处理复杂而耗时的管理工作,如 PostgreSQL 软件安装、存储管理、高可用复制、以及为灾难恢复而进行的数据备份,让您更专注于业务程序开发。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档