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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,514评论 0 13
  • 转 # https://www.cnblogs.com/easypass/archive/2010/12/ 08/...
    吕品㗊阅读 9,824评论 0 44
  • 那天跟妹妹视频,妹妹忘了是因为什么事,妹妹,调侃说:“喲哟哟,你这个老司机要开车了” 妈妈不知道从来里冒了出来,好...
    就是流氓阅读 374评论 0 2
  • 有人问:这傻妮子从哪来? 有人答:许是从天上来。 那人又问:孙悟空还从石头缝里蹦出来的呢…… 其实,傻妮子没有了爹...
    郝逗阅读 1,149评论 0 1
  • 我给大家来讲个真实的故事:曾经有这么一个恶毒的女人,她为了利用企业达到自己的个人私欲,利用悲鄙的手段,残害①个正直...
    清简如荷阅读 279评论 1 1