最近研究了基于GeoServer的开源GIS框架,其中GIS数据库的构建需要使用PostgreSQL+PostGIS插件。学习了一段时间,记录在这里。如有错误,谢谢指正~~本文地址:https://segmentfault.com/a/1190000013141990参考资料PostgreSQL新手入门为什么PostGIS安装不创建template_postgis?PostGIS安装和SHP数据存储(两种方法)LinuxInstallPostgreSQL+PostGISCreatePostGIStemplatewithsourcecodeintheenvironment—这里主要说明需要创建的几个key:geometry_columns,geography_columns,spatial_ref_sys"psql:couldnotconnecttoserver:Connectionrefused”连接远程数据库时出错InstallPostgreSQLandPostGISPostgreSQL和PostGIS已经是流行的开源项目,并且已经包含在主要Linux发行版的yum或apt包中。以Ubuntu为例,安装如下包即可:$sudoapt-getinstallpostgresql-clientpostgresqlpostgis-yRedHat系列,请安装:$sudoyuminstallpostgresql-serverpostgresqlpostgis初始安装后,一个名为postgres的数据库和一个数据库名为postgres的用户。这里需要注意的是,同时还生成了一个名为postgres的Linux系统用户。以后我们操作PostgreSQL的时候,应该是在这个新建的postgres用户下进行。如果PostgreSQL配置是从源码安装的,不建议从源码安装。我试过从源码安装,但是太麻烦了,各种make安装容易出错。最后我用rpm安装了它。不过由于我花了一些时间研究并且安装成功,所以记录一下——不过可能会有错误和遗漏,所以如果读者想从源码安装,请做好回滚的准备。如果你是使用源码编译和makeinstall安装,那么这部分需要额外配置。好像CentOS系列的安装也需要...默认makeinstall后,PostgreSQL安装目录为:/usr/local/pgsql/首先根据这个链接的参考,需要配置环境变量$set$PGDATA="/usr/local/pgsql/database"但执行pg_ctlstart后会出现错误:pg_ctl:directory"/usr/local/pgsql/database"isnotadatabaseclusterdirectory这种情况下,你需要按照PostGreSQL官方文档的步骤来创建一个真正的数据库:PostgreSQL:Documentation:9.1:CreatingaDatabaseCluster首先创建一个名为postgres$usraddpostgres$sudochownpostgres/usr/local/pgsql/database的用户账户然后进入这个账户并创建一个数据库$sudosupostgres$initdb-D/usr/local/pgsql/database/此时shell会输出:Thefilesbelongingtothisdatabasesystemwillbeownedbyuser"postgres"。此用户还必须拥有服务器进程。数据库集群将使用语言环境“C”进行初始化。默认数据库编码相应地设置为“SQL_ASCII”。默认文本搜索配置将设置为“english”。禁用数据页校验和。修复现有目录/usr/local/pgsql/database的权限...okcreatingsubdirectories...okselectingdefaultmax_connections...100selectingdefaultshared_buffers...128MBselectingdynamicsharedmemoryimplementation...posixcreatingconfigurationfiles...okcreatingtemplate1databasein/usr/local/pgsql/database/base/1...okinitializingpg_authid...okinitializingdependencies...okcreatingsystemviews...okloadingsystemobjects'descriptions...okcreatingcollat??ions...okcreatingconversions...okcreatingdictionaries...oksettingprivilegesonbuilt-inobjects...okcreatinginformationschema...okloadingPL/pgSQL服务器端语言...okvacuuming数据库template1...okcopyingtemplate1totemplate0...okcopyingtemplate1topostgres...oksyncingdatatodisk...okWARNING:enabling"trust"authenticationfor本地连接您可以通过编辑pg_hba.conf或使用选项-A或--auth-local和--auth-host来更改它,下次运行initdb.Success时。您现在可以启动数据库服务rusing:pg_ctl-D/usr/local/pgsql/database/-llogfilestart恭喜你接下来可以启动PostgreSQL:pg_ctl-D/usr/local/pgsql/database/-l/usr/local/pgsql/database/psql.logstartPostgreSQL安装完成后,输入postgres账号,进入PostgreSQL控制台:$sudosupostgres$psql相当于系统用户postgres以同名数据库用户登录数据库,否则我们每隔一段时间执行一次psqltime总是在参数中指定用户,很容易忘记在psql中设置密码——需要注意的是这里设置的密码不是postgres系统账户的密码,而是数据库中的用户密码:postgres=#\passwordpostgres然后按照提示输入密码。从源码安装PostGIS如果选择从源码安装PostgreSQL,首先需要确定安装的PostgreSQL是什么版本,然后到PostGIS网页查看对应的PostGIS是哪个版本。最后根据PostGIS的版本,下载对应的源很麻烦。最后导入很麻烦。作者就卡在了这一步,所以最后放弃了从源码安装。。。导入PostGISextension取决于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用户。注意不要向该数据库中添加数据。这个数据库之所以被称为“模板”,是因为它是用来推导的。对应的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:Thepathofthe.shpfileentry:表示要导入的数据库表名——假设这个.shp文件代表每一个条目,所以我将其命名为“entry"demo.sql得到.sql文件后,直接导入PostgreSQL数据库即可。要创建PostGIS数据库,这里需要使用之前的模板。sudosupostgrespsqlCREATEDATABASEnewdbWITHTEMPLATEoriginaldbOWNERdbuser;newdb:新数据库名originaldb:也就是之前的template_postgisdbuser:你的账户名,我一般用postgres导入.sql文件sudosupostgrespsql\cnewdb\idemo.sql\d可以看到已经导入了.sql文件。设置数据库权限OK,现在我们在本机(假设服务器IP为192.168.1.111)使用以下命令登录psql,会发现一些输出:$psql-h192.168.1.111-p5432psql:couldnot连接到服务器:连接被拒绝服务器是否在主机“100.94.110.105”上运行并在端口5432上接受TCP/IP连接?这是因为PostgreSQL默认不对外开放权限,只监听环回地址。如果要修改,需要找到postgresql.conf文件,修改listen_addresses的值:listen_addresses='*'
