专栏首页TheOneGIS空间站PostGIS导入导出ESRI Shapefile数据

PostGIS导入导出ESRI Shapefile数据

PostGIS作为PostgreSQL数据库的空间扩展,提供了对空间数据管理的支持。对于空间矢量数据,PostGIS提供了Geometry和Geography俩种类型用于空间对象的存储,Geometry使用笛卡尔坐标系,而Geography使用球面坐标系(默认是WGS84坐标系)。对于空间栅格数据,则提供了Raster类型。

这里介绍如何导入我们常用的ESRI Shapefile数据到PostgreSQL数据库中,我们可以使用PostGIS提供的shp2pgsql和pgsql2shp工具进行导入和导出操作,还可以使用GDAL库提供的ogr2ogr工具,ogr2ogr工具支持更加多样的数据格式。

我的实验环境如下: OS: Ubuntu 16.04 LTS PostgreSQL:9.5.5 (安装好PostgreSQL以后可以使用psql --version进行查看) PostGIS: 2.2 (安装好PostGIS,并在数据库中启用PostGIS扩展以后,可以在psql命令行中使用SELECT PostGIS_Version();或者SELECT PostGIS_Full_Version();进行查看。

我们使用的数据是全球大洲的一个矢量数据,坐标类型为WGS84。数据下载链接:百度云下载


在Ubuntu中安装PostgreSQL和PostGIS非常简单: 首先,使用如下命令安装PostgreSQL:

sudo apt-get install postgresql

然后,使用如下命令添加UbuntuGIS的PPA用于安装PostGIS扩展。

sudo add-apt-repository ppa:ubuntugis/ppa
sudo apt-get update

最后,使用如下命令安装PostGIS:

sudo apt-get install postgis

安装好了以后,使用sudo -u postgres psql命令可以进入psql交互环境。 可以使用SQL修改postgres用户的密码alter user postgres with password 'new password'; (修改了postgres用户密码和没有修改使用当前用户登录,在后面插入数据时命令会稍有不同)


进入psql交互环境以后,我们首先创建数据库。

CREATE DATABASE postgis_in_action;

然后再创建一个schema,以后我们可以将我们创建的table都存储在我们的schema中,而不是默认的public schema中。

CREATE SCHEMA staging;

然后,切换到我们新建的postgis_in_action数据库中。

\c postgis_in_action

然后在postgis_in_action数据库中启用PostGIS扩展。

CREATE EXTENSION postgis;

可以通过\dx命令查看安装的扩展:

创建好了数据库以后,我们可以使用\q命令退出psql。

接下来就是使用shp2psql命令行工具导入数据了,命令如下:

shp2pgsql -s 4326 -I "continent" staging.world_continent | psql -h localhost -p 5432 -d postgis_in_action -U postgres -W

首先说明的是shp2pgsql的参数(具体参数使用shp2pgsql --help进行查看): -s指定空间参考系,PostGIS的参考系和EPSG代码是一样的,比如EPSG:4326表示WGS84地理坐标系 -I指定在新建的关系表的空间对象的那一列建立空间索引 然后,双引号引起来的是Shapefile的文件名称(也可以加上扩展名.shp) 最后是关系表的全名,staging是schema名称,world_continent是关系名称 shp2pgsql的输出是一个标准的SQL,然后Linux的管道操作符’|’将结果传入到psql中进行SQL的执行。 -h指定连接的地址hostname -p指定连接的端口号 -d指定连接的数据库名称 -U指定连接的用户名 -W指定在执行时弹出密码输入提示

注意: 修改了postgres用户密码的情况下,使用上面的命令插入数据。执行过程中,按照提示输入postgres用户的密码即可。 也可以不给postgres用户设置密码,使用如下的命令插入数据,效果是一样的。其实,raster2pgsql命令及其参数不变,就是进入psql命令的时候,稍微有些不同。要不然会提示password authentication failed for user “postgres”错误。

raster2pgsql -s 4326 -C ~/Downloads/gis-data/wsiearth.tif staging.wsiearth | sudo -u postgres psql -d postgis_in_action

这条命令执行过程中,需要输入当前用户的密码即可。

执行过程如下:

执行成功以后,我们可以进入psql从数据库中查看数据。命令如下:\dt staging.其中,staging是schema的名称,可以看到staging中有两个关系表。

此外,我们还可以使用\d staging.world_continent查看world_continent关系的表结构:

可以看到这里有一个geom的列。在PostGIS中Geography对象类型保存在名为geog的列,而Geometry对象类型保存在geom的列。所以,我们的数据被以Geometry对象类型保存在数据库。如果要保存成为Geography对象,则需要在shp2psql命令行导入的时候加入-G参数。


下面说说数据的导出,我们可以使用psql2shp工具导出数据为Shapefile文件。命令如下:

pgsql2shp -f ~/Desktop/continent -h localhost -p 5432 -u postgres -P [passworld] postgis_in_action staging.world_continent

-f后面是导出的文件全路径 -P后面接用户postgres的密码 最后面postgis_in_action是数据库名称,staging.world_continent是关系表名称

最后,看看如何使用QGIS直接连接PostgreSQL数据库进行数据显示。 (添加了UbuntuGIS的PPA以后,我们可直接使用sudo apt-get install qgis python-qgis qgis-plugin-grass命令安装QGIS) 打开QGIS,在最左侧的图标中点击Add PostGIS layers,在弹出的对话框中点击New新建一个连接,输入连接参数。

点击Connect,可以看到我们的staging中有两个关系表。

选择world_continent关系表,然后点击Add可以进行数据的显示。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NestJS折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及Linux信息过滤裁切基础

    适合尝尝鲜,目前有1W+ star, 上正式线我觉得等version 6会稳定些,

    CRPER
  • WordPress 怎么修改文章中已经写入数据库的链接地址

    经常有人会问怎么修改 WordPress 已经写入数据库中的链接地址,通常都是 http 升级 https 啊,替换资源链接等需求

    沈唁
  • 宝塔面板专业版破解/免费使用所有插件

    3、使用XFtp登录服务器 找到路径/www/server/panel/class 找到 common.py 文件

    周俊辉
  • 要读源代码才能解决的报错-GEOquery下载表达矩阵缺样本名

    就是昨天推文末尾的小测试: GEOquery包的getGEO函数总是无法下载肿么办

    生信技能树
  • 案例:Redis命令不当 引起数据库雪崩 造成数百万损失

    最近的互联网线上事故发生比较频繁,9月19日网上爆料出顺丰近期发生了一起线上删库事件,在这里就不介绍了。

    Debian社区
  • 软链接与硬链接的区别

    由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

    233333
  • GEOquery包的getGEO函数总是无法下载肿么办

    解决方式也简单,加上代码: options( 'download.file.method.GEOquery' = 'libcurl' ) 即可!

    生信技能树
  • Python从零开始第五章生物信息学(3):查询目录正文

    通常,方法需要访问在线KEGG数据库,因此需要时间。 例如,上面的命令需要几秒钟。 但是,有些是缓冲的,所以下次调用它时会更快。另一个有用的别名是检索所有通路I...

    用户1359560
  • MySQL数据库优化小结

    第三范式-表的其他普通数据不依赖其他普通数据,就是依赖的数据记得给索引。要用其他属性做查询条件记得用索引

    ydymz
  • 关于腾讯云新发布的CynosDB,干货都在这里

    CynosDB源于单词Cynosure,是古希腊神话中北极星的名字,就是北天小熊座最亮的一颗星,现译为引人注目的人或物、天生的焦点。

    DevOps时代

扫码关注云+社区

领取腾讯云代金券