【应用实践】湖北省 DEM 数据下载导入PostGIS并实现基本查询
本文详细介绍 raster2pgsql 的使用,从地理空间数据云下载覆盖湖北省范围内的DEM数据,然后导入到PostGIS进行入库,执行栅格数据相关的基本查询,主要是的用法,详细的参考相关章节:
raster2pgsql
一、 数据准备
从地理空间数据云下载 DEM 数据,选择 SRTM 90 米分辨率,选取覆盖湖北省范围,查询到共有 6 幅影像,也可以从别的网络渠道获取免费开源 DEM 数据。

二、 查看数据
下载完数据后使用 QGIS 打开 6 幅图像,设置渲染波段,下载的数据统一 WGS84 坐标系,通常就可以用GIS软件来做镶嵌、合并、裁剪等操作来抽取研究范围内的栅格数据,本系列文章主要用PostGIS来处理分析栅格影像数据,用于满足系统底层开发需求。

三、 数据导入
PostGIS 作为 PostgreSQL 数据库的一个扩展,让其具备了针对空间数据的存储、查询、分析能力,因此首先要安装好PostgreSQL数据库,本文已经创建好了【gisdata】数据库,可根据项目实际业务需求单独建立空间数据库,然后安装 PostGIS 扩展,为了支持栅格数据,还需要创建 postgis_raster 扩展。
-- 创建用户、密码create user gisdata with password 'gisdata';-- 创建数据库create database gisdata with owner gisdata;-- 为用户授予数据库的权限grant all privileges on database gisdata to gisdata;-- 授予所有表操作权限grant all privileges on all tables in schema public to gisdata;-- 切换到新创建的数据库\c gisdata-- 查看扩展列表\dx
-- 查看可用扩展,是否已安装postgis,postgis_rasterselect * from pg_available_extensions;-- 如果未安装,在开启扩展创建postgis_raster扩展create extension postgis_raster;
注意:当前数据库用户需要有文件的读写权限

/*** 坐标系未指定,默认源文件坐标系* -I 创建索引* -C 添加约束* -M 导入后执行vacuum analyze* -P 保证瓦片的大小一致* -F 保留文件名* -t 瓦片大小(宽和高)为256x256* *.img 导入所有img文件* public.srtm_90 生成一个在public模式下的srtm_90表* gisdata导入的数据库*/ raster2pgsql -I -C -M -P -F -t 256x256 *.img public.srtm_90 | psql -d gisdata
注意:按照下载下来的分块的DEM影像数据,导入完成后,将每一个栅格文件按照指定瓦片大小(宽和高)进行切分,每一行数据是一个rast数据,如果不指定切片大小,则按照默认一个文件为一个rast数据.
四、 基本查询
数据入库完毕后,会将生成的表注册到系统视图【raster_columns】中,该表维护了栅格数据的基本元数据信息,可以看到包括坐标系、分辨率、瓦片大小、栅格数据类型、空间范围等等详细信息
一般在实践中,在进行栅格数据的空间查询、裁剪、转换等操作之前,先通过 【raster_columns】视图获取相关栅格的信息,有助于确定合适的操作方法和参数。
数据导入后生成一个 【public.srtm_90】 表,查询表的基本情况,为后续的栅格数据查询分析提供基础
-- 1. 数据注册查询select * from raster_columns;-- 返回结果:Name |Value |----------------+-----------------------------------------------------------------+r_table_catalog |gisdata |r_table_schema |public |r_table_name |srtm_90 |r_raster_column |rast |srid |4326 |scale_x |0.0008333333 |scale_y |-0.0008333333 |blocksize_x |256 |blocksize_y |256 |same_alignment |true |regular_blocking|false |num_bands |1 |pixel_types |{16BSI} |nodata_values |{-32768.0} |out_db |{false} |extent |POLYGON ((105 24.88, 105 35, 120.12 35, 120.12 24.88, 105 24.88))|spatial_index |true |-- 2. 查询记录,理解每个字段意义有助于更好的理解对栅格表的处理分析,尤其是rast字段,是Postgis处理栅格的基本核心select * from srtm_90 limit 3;-- 返回结果-- rid:瓦片行id,-- rast:代表一个被切成的256x256栅格瓦片,-- filename:瓦片所属的文件rid| rast | filename |-----+-------------------+--------------+ 1|01000001004F...77A0|srtm_58_06.img| 2|01000001004F...7FA0|srtm_58_06.img| 3|01000001004F...6D80|srtm_58_06.img|-- 3. 查看元数据信息select (ST_MetaData(rast)).*from srtm_90 where rid=1;-- 返回结果,返回瓦片的基本信息:Name |Value |----------+-------------------+upperleftx|114.12458333333363 |upperlefty|31.362916666666656 |width |256 |height |256 |scalex |0.0002777777777778 |scaley |-0.0002777777777778|skewx |0.0 |skewy |0.0 |srid |4326 |numbands |1 |-- 4. 瓦片基本统计信息,均值、方差、最值等select (ST_SummaryStats(rast,1,true)).* from srtm_90 where rid=1;-- 返回结果,单个瓦片信息的统计信息,因为是256x256大小,总像素数为65536count|sum |mean |stddev |min |max |-----+---------+-----------------+------------------+------+------+65536|114254751|1743.389144897461|134.71134814142528|1392.0|2193.0|-- 5. 按文件名分组查询每个文件被分成了多少瓦片select filename,count(1) from srtm_90group by filename;-- 返回结果,基本上每个文件被分成了576个256x256大小的瓦片: filename |count|--------------+-----+srtm_59_06.img| 576|srtm_58_07.img| 576|srtm_60_07.img| 569|srtm_60_06.img| 572|srtm_58_06.img| 576|srtm_59_07.img| 576|--6. 按像素值统计个数select (ST_ValueCount(rast)).* from srtm_90 where rid =1 limit 10-- 返回结果:按照dem值统计个数value |count|------+-----+1954.0| 66|1939.0| 90|1940.0| 79|1948.0| 84|1969.0| 48|1975.0| 50|1935.0| 101|1913.0| 110|1892.0| 126|1881.0| 134|
原创不易,求关注支持,欢迎转发
夜雨聆风