使用GeoServer发布PostGIS数据
前言
有些使用使用GeoServer发布地图的时候,用Shape文件比较方便,因为ArcMap可以直接导出Shape文件,然后将Shape文件拷贝到服务器上就可以发布了,但是也存在缺点,就是Shape文件的字段值最大支持255个字符,从10.2.2开始,Shape文件中的中文字段名也只能是三个了,超过三个将会被截断。所以,放弃Shape文件,改用PostGIS数据库的形式发布地图服务,是一个不错的选择。
1.安装Postgres
(1) 下载地址
(2) 安装,这个没啥好说的,修改安装位置->修改数据文件存放位置->选择安装的组件(都选上就好了)->设置默认的用户密码->选择端口号->一路next,等待安装成功就可以了。
2.安装PostGIS
(1) 1PostGIS不需要单独下载,上一步的最后,Postgresql安装完成最后会显示一个Finish按钮,并默认打开Stack Builder,如果没有,就在开始菜单中的PostgreSQL文件夹下打开。选择安装(也就是本机服务器)位置,PostgreSQL就可以了。
(2) 然后下一步,选择需要下载安装的组件,这里找到PostGIS
(3) 选择下载位置,点击下一步
(4) 下载完成,就可以安装了
(5) 选择同意协议->选择安装组件(默认)->安装位置(默认)->安装
(6) 接下来会弹出几个提示框,设置环境变量,设置关联等,都选是,没毛病。
(7) 完成
注意
(1) 使用Stack Builder没有翻墙的话,可能不能正常下载PostGIS,总是出现未响应。
可以下载离线版本的Postgis,然后手动安装。PostGIS管网的地址,还是有些问题的,总是找不到在哪里下载可执行文件,后来找了很久,打开下载地址,选择合适的版本的exe,双击打开安装。
期间可能还要设计环境变量什么的,根据需要进行选择是或者否
3.新建地理数据库
(1) 开始菜单->PostgreSQL 11->pgAdmin 4,打开PostgreSQL网页控制台
(2) 点击左侧Server,输入密码,登录服务器
(3) 右键Databases,选择创建
(4) 在pgAdmin III中,新建数据库的时候,会有一个postgis_22_simple模板,有些文章中会说要选中他,但是pgAddmin4中没有这个选项了,那就默认好了。
pgAdmin III中新建数据库
4.安装OSGeo4W
PostGIS自带了将shape文件导入到PostgreSQL的工具,但是为了实现将ArcGIS中的文件地理数据库(File Geodatabase)导入到PostgreSQL数据库中,需要借助第三方软件OSGeo4W。
(1) [下载](<https://trac.osgeo.org/osgeo4w/)
(2) 双击安装包,选择 Advanced Install
(3) 选择从网络下载安装,看这几个选项,也是可以先下载下来然后从本地文件中安装的。
(4) 选择安装的目录
(5) 选择下载目录
(6) 选择是否通过代理下载
(7) 选择从哪个网站下载,选择第三个网址好像快点,http://www.norbit.de
(8) 选择下载哪些软件,这里搜索gdb,选择gdal-filegdb,上面的奇怪的字母是什么不知道,但是点击下Skip,就可以看到安装的版本了,然后点击后面的B和S那一列,好像是有x号的就是选中,没有x号的就没有选中(这设计也是有点反人类了)。
(9) 有个短暂的下载
(10) 选择同意协议
(10) 接下来是下载你选中的组件,可以说是巨慢。
(11) 下载完了,也就安装完成了。
(12) 安装完成会在桌面上出现一个OSGeo4W文件夹,里面有个shell快捷方式,双击可以shell,相关的命令就在里面输入。
5.将File Geodatabase数据导入到PostgreSQL中
(1) 打开OSGeo4W的shell,即上一步桌面文件夹里面的哪一个快捷方式打开的命令行。
(2) 查看OSGeo4W支持哪些格式,shell命令行中输入ogrinfo –formats
(3) 输入转换命令,dbname为第四步创建的数据名,”D:/Data/JCData.gdb”是自己的gdb。
1 | ogr2ogr -f "PostgreSQL" PG:"host=localhost port=5432 user=postgres password=XXX dbname=jhdzzhd" D:/Data/JCData.gdb -overwrite -progress --config PG_USE_COPY YES |
(4) 导入成功后,PostgreSQL数据库jhdzzhd中就有数据了。
6.GeoServer发布PostGIS数据
(1) 下载安装就略过了(安装Java、Tomcat,下载geoserver.war放到Tomcat\webapp目录下即可)
(2) 打开 localhost:8080/geoserver
,登录
(3) 新建数据存储,选择PostGIS数据源
(4) 填写用户名、密码和数据库名称等信息
(5) 将数据存储发布为图层,可以选中上一步直接发布,也可以选中图层,添加新的数据资源,选择自己创建的数据存储。
(6) 发布时一个数据存储中有三个图层,选择第一个发布就可以了。
7.GeoServer发布PostGIS数据后,使用CQL_FILTER语句进行查询
在GeoServer中发布地理数据之后,通常用CQL_FILTER语句进行空间数据的查询,包括点在多边形内,BBOX等,在GeoServer用户手册中,有对CQL_FILTER进行空间查询的详细描述。主要是构造url,传入适量的参数,请求获取数据即可。对于空间查询,很重要的一点就是查询的图形属性,例如,在以shape为原始数据发布WFS服务时,默认的字段名the_geom标志了矢量数据的点线面坐标,查询时的构造的CQL_FILTER通常为
1 | cql_filter=INTERSECTS(the_geom,POINT(-74.817265%2040.5296504)) |
而对于PostGIS发布的数据来说,是不存在the_geom字段的,那么PostGIS又是如何存储了图像的坐标数据呢?在Navicate中可以查看数据库,有个特殊的字段shape(也有可能是其他的),里面存储了PostGIS特有的图形数据。
使用pgAdmin4查看是这样的,同样也标志了shape字段就是the_geom字段。
现在可以构造CQL_FILTER查询语句
1 | cql_filter=INTERSECTS(shape,POINT(-74.817265%2040.5296504)) |