GDAL – 地理数据导入PostGIS

将空间数据导入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入库命令之前,可以先设置该环境变量为文件内容编码,这样,导入的数据便不会再出现乱码问题。

转载自:https://blog.csdn.net/weixin_34101229/article/details/87256735

You may also like...