详解Linux中PostgreSQL和PostGIS的安装和使用
安装PostgreSQL和PostGIS
PostgreSQL和PostGIS已经是热门的开源工程,已经收录在各大Linux发行版的yum或apt包中。Ubuntu为例,安装以下包即可:
$sudoapt-getinstallpostgresql-clientpostgresqlpostgis-y
RedHat系列则请安装:
$sudoyuminstallpostgresql-serverpostgresqlpostgis
初次安装后,默认生成一个名为postgres的数据库和一个名为postgres的数据库用户。这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户。我们以后在操作PostgreSQL的时候都应该在这个新创建的postgres用户中进行。
PostgreSQL配置
如果是从源码安装
不建议从源码安装,我曾经试过从源码安装,实在是太麻烦了,而且各种makeinstall容易出错。最后我还是用rpm安装了。不过既然花了些时间研究并且我成功安装过,所以还是记录一下吧——不过,可能有错漏,所以读者如果要从源码安装的话,请做好回滚的准备。
如果使用的是通过source编译并且makeinstall安装,那么这一节是需要额外配置的。
貌似CentOS系列的安装也需要……
默认的makeinstall之后,PostgreSQL安装目录在:/usr/local/pgsql/
首先根据这个链接的参考,需要配置环境变量
$set$PGDATA="/usr/local/pgsql/database"
但是执行了pg_ctlstart之后,会出现错误:
pg_ctl:directory"/usr/local/pgsql/database"isnotadatabaseclusterdirectory
这样的话,就需要参照PostGreSQL官方文档的步骤创建真正的database:
PostgreSQL:Documentation:9.1:CreatingaDatabaseCluster
首先创建一个用户账户,名叫postgres
$usraddpostgres $sudochownpostgres/usr/local/pgsql/database
然后进入这个账户,创建database
$sudosupostgres $initdb-D/usr/local/pgsql/database/
此时shell会输出:
Thefilesbelongingtothisdatabasesystemwillbeownedbyuser"postgres". Thisusermustalsoowntheserverprocess. Thedatabaseclusterwillbeinitializedwithlocale"C". Thedefaultdatabaseencodinghasaccordinglybeensetto"SQL_ASCII". Thedefaulttextsearchconfigurationwillbesetto"english". Datapagechecksumsaredisabled. fixingpermissionsonexistingdirectory/usr/local/pgsql/database...ok creatingsubdirectories...ok selectingdefaultmax_connections...100 selectingdefaultshared_buffers...128MB selectingdynamicsharedmemoryimplementation...posix creatingconfigurationfiles...ok creatingtemplate1databasein/usr/local/pgsql/database/base/1...ok initializingpg_authid...ok initializingdependencies...ok creatingsystemviews...ok loadingsystemobjects'descriptions...ok creatingcollations...ok creatingconversions...ok creatingdictionaries...ok settingprivilegesonbuilt-inobjects...ok creatinginformationschema...ok loadingPL/pgSQLserver-sidelanguage...ok vacuumingdatabasetemplate1...ok copyingtemplate1totemplate0...ok copyingtemplate1topostgres...ok syncingdatatodisk...ok WARNING:enabling"trust"authenticationforlocalconnections Youcanchangethisbyeditingpg_hba.conforusingtheoption-A,or --auth-localand--auth-host,thenexttimeyouruninitdb. Success.Youcannowstartthedatabaseserverusing: pg_ctl-D/usr/local/pgsql/database/-llogfilestart
恭喜你,接下来就可以启动PostgreSQL了:
pg_ctl-D/usr/local/pgsql/database/-l/usr/local/pgsql/database/psql.logstart
PostgreSQL安装好后
进入postgres账户,并且进入PostgreSQL控制台:
$sudosupostgres $psql
这时相当于系统用户postgres以同名数据库用户的身份,登录数据库,否则我们每次执行psql的时候都要在参数中指定用户,容易忘。
在psql中设置一下密码——需要注意的是,这里设置的密码并不是postgres系统帐户的密码,而是在数据库中的用户密码:
postgres=#\passwordpostgres
然后按照提示输入密码就好。
从源码安装PostGIS
如果选择了从源码安装PostgreSQL的话,那么首先需要判断你安装的PostgreSQL是什么版本
然后,再到PostGIS的网页上去查其对应的是PostGIS的哪个版本。
最后,按照PostGIS的版本去下载对应的source
最后的导入很麻烦,笔者就是卡在这一步,所以才最终放弃从源码安装的……
导入PostGIS扩展
根据postgresql和postgis的版本不同,路径会有些差异,主要是路径中包含版本信息:
$sudosupostgres $createdbtemplate_postgis $createlangplpgsqltemplate_postgis $psql-dtemplate_postgis-f/usr/share/postgresql/9.5/contrib/postgis-2.2/postgis.sql $psql-dtemplate_postgis-f/usr/share/postgresql/9.5/contrib/postgis-2.2/spatial_ref_sys.sql
上面的操作中,创建了一个叫做“template_postgis”的空数据库。这个数据库是空的,并且属于postgres用户。注意,不要往这个数据库中添加数据,这个数据库之所以称为“模板”(template),就说明它是用来派生用的。
相应的PostGIS路径可能不同,如果失败,就在上面的路径附近多尝试一下,找几个.sql文件试试看。
转换.shp文件到PostGIS数据库中
转换.shp到.sql文件
首先找到需要转换的文件,假设需要转换的.shp文件是:/tmp/demo.shp,那么就做以下操作:
$sudosupostgres $cd/tmp $shp2pgsql-WGBK-s3857./demo.shpentry>demo.sql
这里需要说明一下最后一句各部分所代表的含义:
- -WGBK:如果你的.shp文件包含中文字符,那么请加上这个选项
- -s3857:指明文件的参考坐标系统。我的.shp文件使用的是EPSG:3857
- ./demo.shp:.shp文件的路径
- entry:表示要导入的数据库表名——假设这个.shp文件表示的是各个入口,所以我命名为“entry”
- demo.sql
得到了.sql文件后,就可以直接导入到PostgreSQL数据库了。
创建一个PostGIS数据库
这里就需要用到前面的template了。
sudosupostgres psql CREATEDATABASEnewdbWITHTEMPLATEoriginaldbOWNERdbuser;
- newdb:新的数据库名
- originaldb:也就是前面的template_postgis
- dbuser:你的账户名,我一般使用postgres
导入.sql文件
sudosupostgres psql \cnewdb \idemo.sql \d
可以看到,.sql文件已经被导入了。
设置数据库权限
OK,现在我们在本机(服务器IP假设是192.168.1.111)用以下命令登录psql,会发现一段输出:
$psql-h192.168.1.111-p5432 psql:couldnotconnecttoserver:Connectionrefused Istheserverrunningonhost"100.94.110.105"andaccepting TCP/IPconnectionsonport5432?
这是因为PostgreSQL默认不对外开放权限,只对监听环回地址。要修改的话,需要找到postgresql.conf文件,修改值listen_addresses:
listen_addresses='*'
以上就是本次小编整理的关于Linux中PostgreSQL和PostGIS的安装和使用的全部内容,感谢你对毛票票的支持。