PostGIS导入shp数据

标签: Postgis 分类: Gis 创建时间:2019-10-24 01:45:13 更新时间:2024-11-15 10:49:43

其实写了有两三篇了关于解决PostGIS导入数据的问题,包括安装过程,以及安装过程中出现的问题,这篇问题作为一切准备就绪的情况下,PostGIS安装成功了,进行数据库的建立和数据的导入操作步骤。

1.PostGIS Shape GUI

1.新建数据库

这一步就省略好了。

2.为数据库添加扩展

打开数据库pgAdming4管理工具,选择新建的数据,选择Extensions,右键单击,选择创建extension

打开创建扩展窗口,填入Name为postgis

新建成功

3.打开开始菜单postgis自带的shp导入工具

打开导入工具

4.连接数据库

输入用户密码和数据库名称

5.添加shp文件

打开Add File

6.修改SRID

将SRID修改为shp文件的坐标

7.修改Options

将Options选项中的UTF-8改为GBK

8.选择导入

点击导入按钮Import

结果成功了。

2.Linux命令行导入数据

linux上安装完postgis,要想使用shp2pgsql,要安装:sudo apt install postgis,然后使用sudo su postgres登录postgres,输入的密码是切换时的用户密码,而不是postgres的密码,而且你用命令安装完之后,也没有地方设置postgres用户的密码,这个postgres的密码不是数据库用户postgres的密码。然后执行下面的命令。

1
2
3
4
shp2pgsql -c 路径/shp数据文件名 新建的数据表名 数据库名|psql -d 数据库名

## 这个命令没有试过,自己可以尝试下
shp2pgsql -s 3857 -a -W GBK 文件名.shp 命名空间名.表名 | psql -h localhost -U postgres -d 数据库名-p 5432

导入成功:

注意上面的命令其实没有执行成功,数据库里根本没有插进去,后来我换了方法

先把shp转成sql文件,然后通过sql文件导入到数据库中,具体内容参考文章3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 第一条命令(windows下执行)
shp2pgsql -s 3857 -c -W "GBK" "CLLX.shp">CLLX.sql

-s 代表指定数据的SRID为3857

-c 代表数据将新建一个表,这里可能的选项是 -d 删除旧的表,重新建表并插入数据; -a 向现有表中追加数据; -p 仅创建表结构,不添加数据,这四个参数是互斥的。

-W Shape文件中属性的字符集,通常Postgresql的字符集是UTF-8,有时候可能Shape数据中的字符集是其他,就可能报“Unable to convert data value to UTF-8 (iconv reports "无效或不完整的多字节字符或宽字符"). Current encoding is "UTF-8". Try "LATIN1" (Western European)”错误,这时候指定正确的字符集即可解决方问题。

生成sql文件成功后,需要用nodepad++ 将sql文件打开,然后选择菜单栏中的编码,选择使用UTF-8编码,这样就把sql文件的编码转换成了utf-8编码。

## 第二条命令(linux下执行,服务器上执行)
psql -d shp2pgsqldemo -U gisdb -f /tmp/shp/CLLX.sql -W

## 说明:首先连接数据库执行:sudo su postgres ,进入到postgres用户,然后执行以上语句,shp2pgsqldemo为数据库名,gisdb为用户名,/tmp/shp/CLLX.sql为导入的sql文件。

(中文乱码问题)
如果加-W GBK 还是没解决中文乱码的问题,那就先用shp-gui导入数据(这种方式没有乱码问题),然后在从数据库使用pg_dump命令导出数据表。

再次运行的时候,出现了权限禁止这个问题,这个问题没有解决,就换了另一个方法。

1.windows生成sql文件

先在window上转成了sql文件,然后上传服务器,导入到数据库中。我在windows上执行了下面的命令,由shp文件生成了sql文件

1
.\shp2pgsql.exe -s 4326 -c D:\zlc\hdxs\geodata\station_20190821_1834.shp >station.sql

2.修改sql文件的编码

用nodepade++打开生成的sql文件,然后将sql文件的编码改为utf-8编码。

3.上传sql文件到服务器

生成了station.sql文件,通过xsell的rz命令上传到服务器,执行导入数据到数据库,结果出现了编码问题,解决方式就是在windows上用nodepade++打开生成的sql文件,然后将sql文件的编码改为utf-8编码。

4.导入数据

执行数据导入命令

1
2
## shp2pgsqldemo数据库名,gisdb用户名
psql -d shp2pgsqldemo -U gisdb -h localhost -f /tmp/shp/CLLX.sql -W

如果在使用psql -d shp2pgsqldemo -U gisdb -f /tmp/shp/CLLX.sql 时需要输入密码,我输入了切换postgres用户之前的用户的密码,也成功了。

这里我输入了gis用户的密码,也能成功导入。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。