在windows上安装Postgresql,安装空间数据库postgis引擎,创建可以存储空间点线面的数据库,解决could not open extension control file问题
前面问题描述比较长,喜欢吃快餐的帅哥美女可以跳过不看
一、为什么要用到Postgis空间数据库
本人是大三的学生,由于学院开设了GIS应用与开发的课程,而且给我们上课的老师强调了Postgis在这门课程当中的重要性,因此,我们需要人人在电脑上配置好Postgis的环境。老师给我们提供了OSGeo-live虚拟机,这个LUbuntu系统,官方的系统里面打包了我们课程学习需要用到的一切工具:如Postgresql、QGIS、GeoServer等,捣鼓这个官方的虚拟机可是费了我们好大的劲。我电脑性能不错(i7处理器+12G运行内存+480G固态),虚拟机还能正常启动和运行,我给虚拟机分了3G的内存,虚拟机运行起来还算流畅。因为我们上这门课主要用到的编程语言是java,然后用到了SSH的java EE框架,因此我电脑上还装了eclipse(这个工具自从我学java的时候就装了)和idea每次开启虚拟机以后,然后运行eclipse或者idea写jdbc代码从Postgis数据库取数据库,但是开发
二、为什么会想到在windows上装Postgis
说这个,一切都是出于开发效率的考量。还记得以前开发纯粹的跟GIS没有关系的Java EE系统,在windows上创建一个MySQL数据库,创建好表,打开eclipse集成开发环境,然后写代码直接连数据库,这一套流程简直行云流水。但是自从搞这个GIS开发,代码的执行就变得麻烦起来,我的代码执行过程有了以下几个步骤的演变:
1、在Windows上的eclipse里写好代码,然后把代码打成jar包或者是war包,拷贝到虚拟机共享文件里面,再从共享文件里面执行或者是移动到虚拟机的Tomcat里面运行, 一切都变得麻烦起来,有时候代码运行不出来,报了一个小错误,还需要改代码然后重新打包放到共享文件夹,再重复上面的运行过程,如果仅仅重复两遍那问题还不大,但是遇到那种报错不全,需要调试才能快速解决的问题,根本无法在外面改代码,改好多遍也无济于事,这简直就是在折磨人啊。
2、为了解决代码调试的问题,我模仿实验室老师安装的虚拟机(实验室的电脑可是高配的,16G运行内存,给虚拟机分了8G),也在自己的虚拟机里面装上了一个eclipse,调试果然方便多了,问题解决起来确实很快,但是写代码的时候着实难受,卡顿的感觉无处不在,代码提示也是延迟好久,没多久我决定再换方法。
3、根据老师提供的课程资料和我自己的百度搜索(期间花了将近一天时间,都是泪啊),最后将虚拟机的网卡设置成桥接模式,然后改了Postgresql的配置(两个配置文件 ,一个是pg_hba.conf,一个是postgresql.conf,配置方法这里不再赘述,咱们论坛有其他大佬写了),这才把宿主机和虚拟机的网络连通,最后将数据库连接的jdbc url的ip部分改成了虚拟机的ip,于是也能连接到Postgis数据库,完成了代码的运行,一切似乎还是挺顺利的。
可是问题终究还是出现了,桥接模式不太稳定,拔了网线就连不上数据库了,由于实验课上我得把电脑待到实验室,实验室又只能连无线网,我把桥接模式的宽带的网卡又换成无线的网卡(桥接的两种网卡如下图所示),连上无线网,重启虚拟机,代码也能运行。可是网线的插拔和无线网络的信号不稳定,我时而能连上虚拟机的数据库,时而不能连上让我苦恼万分。
有人会问我为什么不把网卡调成NAT或者其他模式,把ip调成固定的,然而我尝试了各种方法,诸如改/etc/network/interfaces、/etc/netplan/01-network-manager-all.yaml等等配置,还引入了net-manager和interfaces配置不能同时生效的问题,各种折腾都没有打通跟虚拟机的连接,就当我快要放弃的时候,还是挚友的告诉我桥接管用,我就试了下,果然能调通。
但是桥接也并不一定能百分之百能连上,我室友的电脑上就没起作用,一切按照我说的,他在宿主机上的eclipse里面写了代码然后跟数据库一连接就报错,错误内容就是xxx.xxx.xxx.xxx ip 拒绝了数据库的访问,但是postgresql的配置文件已经改了,并且虚拟机也重启了几回,都没能连上。最后他就放弃了这种方法,还是跟实验室机房的电脑一样,在虚拟机里面装eclispe写代码。还有班上一个同学的电脑配置不够(运行内存4G的办公本,因为内存不够只给虚拟机分了1G的内存),开了虚拟机以后非常卡,虚拟机里面还有跑了一个eclipse,她把代码发布到Tomcat启动到运行的过程得持续将近十分钟,这对于45分钟一节的实验课来说,简直效率低到了极点。
4、为了找到更好的开发体验和解决我室友和部分同学(电脑配置不够)运行代码慢的困惑,我特地研究了一下怎么在Windows上安装Postgresql,并扩展空间数据库(Postgis)引擎,我折腾了一个晚上,终于成功了,可以像之前连接MySQL数据库一样方便的连接Postgis数据库了,代码运行和调试,变得如此方便。另外我还从网上下载了QGIS、GeoServer Windows版(包括32位和64位的)。下载链接将贴在文末,首先讲一下安装和配置的一些细节。
三、Postgresql数据库的安装
1、首先去Postgresql的官网下载Postgresql Windows对应的版本,根据自己系统的情况,选择64位或者32位。我下载是最新版的,如下图。
2、下载好之后就可以进行安装了,安装的时候最好关掉杀毒软件,杀毒软件可能会拦截部分安装,清除你的部分文件,我第一次安装的时候就被莫名其妙删了文件,然后登陆不上数据库。前面基本上都是next下一步,具体如下图所示。
安装好了,如下图所示,有个如选框勾选着,这里解释下,勾不勾的区别,我这里可是踩坑了,我当时是看着网上的教程安装的,教程里面说的是把这个勾去掉,我就真的去掉了,然后等我去创建空间数据库的时候就悲剧了(扩展的时候会报错,等下再说报什么错,另外说一下postgresql数据库是默认不支持空间数据类型的,需要扩展postgis引擎),因为我没有扩展空间数据库的依赖,所以我就创建不了空间数据表,不能导入之前从虚拟机里面导出的sql。而依赖的添加方法之一就是通过勾选这个复选框从系统的服务器下载安装。
大家可以通过勾选的方式安装依赖,如下图所示,下拉列表里面直接选第一个,然后下一个,
大家根据需求勾选下载,我这里勾选了两个,一个是jdbc驱动,一个是扩展到Postgis空间库的依赖安装文件,然后再下一个。
接下来会进行下载,下载好之后安装下就好了。
常用的依赖我都下载了,并且在文末附上了百度网盘链接,提供大家直接下载,就不用勾选下载了,如果大家网速快,也可以自己去勾选下载。
接下来,安装Postgis扩展引擎,如下图所示:
勾选create spatial database,点next下一步
输入自己刚才你装Postgresql的时候输入的账号和密码,点击next下一步进行安装
进度条走完了会有两个弹出框,都选是就行了
到此,Postgis引擎扩展的依赖就装好了。
四、如何创建一个支持空间点线面存储的空间数据库?
下面跟大家说一下怎么登录到Postgis创建一个数据库,给这个数据库添加Postgis扩展功能,然后就可以创建空间数据表了。这里以我课设的数据库的创建的过程为例,给大家做演示。
4.1创建课设的数据库
首先打开开始菜单,找到Postgresql 下的pgAdmin,运行pgAdmin,如下图所示。
会自动打开浏览器,会看到一个Postgresql的网页管理工具,类似于老版本的软件图形化界面,如图所示,进去发现是英文的,讨厌英文的朋友可以点preference,在User language里面切换到简体中文。
刷新当前页即可看到中文操作页面了
用默认的postgres用户登录,输入用户名,即可连接到数据库。
由于我之前在虚拟机里面的Postgresql数据库导出的sql脚本是在user用户下创建和导出的,所以需要新建一个数据库登录的用户user,如下图所示。
设置账户user的密码,账户过期时间尽量设置得常一点,以免过期带来的错误。
将user账户的权限都打开,点击保存
看到账户列表里面多了一个user,即创建成功。
如下图点击左侧导航栏创建一个数据库服务器,即通过刚创建的user来连接到数据库
填写连接名称
填写连接的参数,主机地址为localhost,用户名为user,输入密码,其他参数默认即可,点保存
左侧导航栏出现刚创建的连接,创建成功,打开数据库,发现有postgis_25_sample这张表里面已经完成了扩展,仔细想想,这是安装了Postgis引擎扩展的结果,所以,后面创建我们自己的空间数据库只需以这张表作为模板,即可完成空间数据库的扩展。
接下来创建我们自己的数据库,因为要将postgis_25_sample这个数据库作为模板,所以首先要断开对这个库的连接,如下图:
点左侧导航栏的gisda连接,创建一个新的数据库,我课设的字母所以为ccgm_rhs,所以我就以此为数据库的名称,选择数据库的所有者为user
切换到定义里面,选择模板为postgis_25_samples,其他选项可以空着或者默认就行了,点保存。
至此课设的数据库创建好了。
注:如果不通过模板的方式创建空间数据库也是可以的,需要自己为数据库手动扩展Postgis引擎,接下来对此进行演示,首先找到我们Postgis的安装路径。如下图所示,psql.exe就是我们一会儿在黑窗口里面需要用到的。
打开黑窗口,cd到刚才psql.exe所在的目录,然后输入指令,psql -U user -W -d ccgm_rhs,输入口令,就会连接到相应的数据库,然后再输入指令create extension postgis;就可以完成扩展。
参数解释:
-U:用户名
-W:密码
-d:数据库名称
如果有安装postgis空间数据库引擎,那么数据库里面也不会有postgis_25_samples模板,并且黑窗口里面输入指令进行扩展会报如下如错误:
could not open extension control file “/usr/local/share/postgresql/extension/postgis.control”: No such file or directory
4.2将课设中导出的sql脚本中的数据再导入到Windows上的Postgresql的ccgm_rhs数据库中。
这里我使用了网页端的图形化管理工具导入sql脚本进行了测试可是导入失败了,于是我又在黑窗口中输入了如下命令,结果导入成功。
打开网页的管理工具查看,数据库表已经导入成功,
查询表格数据,数据也正常显示,如下图所示。
最后我新建了一个java项目,用jdbc对Windows本地的Postgresql数据库进行了测试,需要导入jdbc驱动,数据能查询出来,测试成功。
五、闲扯一下
本人是狂热的编程爱好者,喜欢写代码,非常讨厌写文档,我知道要提升自己的能力,写文档是必不可少的,故想通过写博文的方式来提升自己的写作能力。这学期我们开了GIS开发与应用的课程,这门课综合性非常强,我们要学Postgis数据库的使用,OpenLayer、GeoServer、Java EE 的SSH框架,我的老师非常负责,作业压力很大,很多东西都要现学现用,不会用的东西就需要上网查找资料,其中我在CSDN上查找的次数最多,很多博主也给了我很大帮助,以此博文来宣告我伸手党生涯的结束,这篇博文只是个开始,以后会多写心得和体会来帮助新人少走弯路。有问题欢迎大家指正,请在下方评论区留言,我看到会及时回复的,谢谢各位。
六、下载链接
Postgresql、Postgis引擎、QGIS、GeoServer下载链接:
https://pan.baidu.com/s/1LtrLTTv1Ku8Np41X4dUmzQ 解压密码:im3w