将空间数据导入PostGIS存储和管理,是比较常见的需求,PostGIS本身提供了shp2pgsql和pgsql2shp进行Shapefile和PostGIS的互转,如果是其他格式的空间数据就无能为力。我们可以使用QGIS和GDAL来做数据的互操作,QGIS非常好用,但我们有时候需要自己开发应用,GDAL优势就体现出来了,其实,QGIS也是使用了GDAL。这篇文章咱就说说利用GDAL的数据互操作工具ogr2ogr,将数据导入PostGIS中的那些事。
转换字段名称
可通过-sql
转换导入PostgreSQL的字段名称,我们可以将原始数据看成是数据库中的一张表,-sql
参数指定了一个标准的sql语句,该语句执行的结果会被保存到结果数据中。整个过程可以类比PostgreSQL中的create table as select ...
语句。
例如入库一个shapefile文件,数据原有的字段是id,name,age,现在想入库的时候name改为s_name,命令如下:
ogr2ogr -sql “select id, name as s_name, age from layer_name”
数据的字段列表可以通过ogrinfo 判断。
转换数据字段类型
不同于PostgreSQL中的数据类型,ogr有一套自己的数据类型系统:
- character,对应PostgreSQL中的
Character Types
; - float,对应PostgreSQL中的
double precision
; - numeric,可自定义精度的数值类型,可对应PostgreSQL中的
numeric
; - integer,对应PostgreSQL中的
integer
; - date,对应PostgreSQL中的
date
; - time,对应PostgreSQL中的
time
; - timestamp,对应PostgreSQL中的
timestamp
。
使用COLUMN_TYPES
参数可以指定数据类型转换列表,不同字段使用逗号分隔。例如我要将一个shapefile导入PostgreSQL中,更改原为int类型的column1
为float,那么命令可以这么写:
ogr2ogr -f "Postgresql" PG:"host=localhost port=5432 dbname=test user=user password=pass" -lco COLUMN_TYPES="column1=float" file.shp
如果字段的原始类型不能转换成指定的类型,会报错。
添加转换进度
ogr2ogr使用-progress
可以获得粗略的进度信息,每2.5%就会输出一次进度。
关于导入数据内容乱码
PostgreSQL是以utf8编码存储数据的,客户端也默认以utf8读取内容,然后以utf8写入到数据库。如果待输入的文件内容编码非utf8,那么导入数据库的内容,也会乱码。
解决问题的方法自然就是让ogr2ogr以正确的编码读取文件内容,然后再以utf8编码输入到PostgreSQL。ogr2ogr会根据PGCLIENTENCODING环境变量指定的编码读取内容,因此我们可以在执行ogr2ogr入库命令之前,可以先设置该环境变量为文件内容编码,这样,导入的数据便不会再出现乱码问题。