【PostgreSQL+QGIS+Apache+GeoServer】如何使用PostSQL+QGIS制作专题图并在Apache与GeoServer发布

1.写在前

最近学习了点空间数据库的知识,算是知道了点皮毛,趁热打铁——所以打算利用所学知识制作一张交通线路专题图,主要包括数据下载、数据洗涤、清洗、专题图制作、专题图发布等内容,同时也希望下面的内容对你有帮助。

2. 运行环境与适读对象

2.1运行环境

硬件:笔记本电脑win11

软件:

名字版本备注
postgreSQL15.7.1

jdk8u411

postgis-v3.3.2

QGIS3.28.3
Apache2.4.59
GeoServer2.22.0

安装包图片如下,仅供参考。

注意:在本次使用过程中使用高版本的GeoServer发布的地图不显示,网上说是版本过高,所以我当时又换成了低版本的,

其次,使用安装版的GeoServer安装,默认服务端口是8080,有些笔记本电脑用这个端口安装后无法打开GeoServer,建议把端口换成别,比如8083,8084等端口,如果你用的是免安装的,那当我没说,免安装的问题从理论上讲,改一下配置里的端口应该可以,但是我试过没有用。

2.2 适合人群

学过空间数据库,会使用QGIS,postgreSQL,Apache,GeoServer等工具。(当然即使你没学过,单纯是对专题图制作兴趣,这也是适合)

3.1  数据收集导入和清洗

3.1.1地图数据收集

登录网址https://www.webmap.cn/commres.do?method=dataDownload,如下图,

全国地理信息资源目录服务系统下载页图

需要说明的是这个网站可能注册和登录时会显示账户已被注册,或说存在和账户不存在,反正就是注册注册不了,注册了又登录不了。

针对注册建议更换浏览器,用谷歌或者火狐的浏览器试试,多点击几次注册可能就会成功。

针对登录建议更换浏览器,同时使用邮箱登录,使用邮箱登录,使用邮箱登录!不要用昵称。

点击1:100万全国基础地理数据库进入数据地图下载。

地图数据下载入口图

点击查询进入下图界面,选择要下载的地图区域,然后选择黄色购物车添加下载的地图数据:

地图数据选择下载图

接着填写相关信息,点击提交订单进入下面的页面,点击数据下载如下图:

地图数据下载信息填写图

然后按照页面的提示完善信息,如下图三个步骤:

值得注意的是下载地图时可能会出现如下情况,填写的信息不显示,刷新网站或者更换浏览器也一样的情况,这里给连个建议:

1.等一段时间再进去试试;

2.使用我给的资料包,当然这个建议只适合练习的小伙伴。(后面会附上链接)

地图数据下载信息填写图

下面是正常显示的效果:

地图数据下载信息填写图

完善信息后最后一步就可以下载选中的地图数据了,点击页面上的“矢量地图数据”,在下拉选项中点击下载,如下如:

地图数据下载图

至此地图数据下载就完成了。

3.1.2数据导入

将下载的地图进行解压,如下图:

地图数据解压图

运行QGIS,连接postgres后点击菜单栏的数据库,找到刚才解压的数据,选择.gdbtable结尾的文件,根据本次设计需要选择名字以c、b、e结尾的.gdbtable文件(你可以选择其他的),他们分别表示交通线路、桥梁、县市地图,在此我们将使用traffic、bridge、city 表示这些数据,下面是具体操作步骤:

导入数据库:

地图数据导入图

这里需要注意的是如果在导入数据库时没有勾选创建空间索引,那么可以在创建后再右下角,如下图:

EPSG设置图

在弹出页面使用过滤所搜自己需要的索引,测出为4326,如下图:

EPSG设置图

设置导入的数据表的坐标投影,如下图:

坐标投影设置图

对于city与bridge也需要同样的操作。

3.1.3数据洗涤

在操作之前,右键图层,让地图上的标注显示:

接着继续右键图层点击过滤,如下图:

使用like命令过滤掉不必要信息,在traffic空间数据中使用"name"  LIKE '%铁路%'保留包含铁路字样的信息,如下图:

图3-13 铁路数据过滤图

点击平移地图,拖动地图查看效果,其实也就是类似于刷新。

图3-14 点击平移地图

同样的操作:

对bridge使用"name"  LIKE '%桥%'保留包含桥字样的数据;

对city使用"name"  LIKE '%市%'保留包含市字样的数据;

当数据都使用like命令过滤后,找到要制作的地图位置,本次制作的是长葛市交通地图,在地图上放大找到长葛市,如下图:

数据过滤结果图

可以发现周围还有很多不需要的数据,此时就需要使用delete命令删除选中你ID以外的数据,先打开SQLshell,输入口令,进入命令行操作;

打开SQLshell图

在使命令前,我们需要添加如下命令,

create extension if not exists postgis;

目的是创建PostGIS 扩展到当前数据库,如下图是已添加拓展后执行的结果:

添加拓展到数据库

在使用delete命令前,需要知道要保留数据的ID,在QGIS右上角找到识别要素功能,接着在点击要操作的图层:

然后框选要保留的区域,如下图红色点则为选中点,是要保留的数据。

桥数据要素图

在右侧找到对应数据的ID,保留的ID为1269,1668

桥数据要素id图

随后在SQL shell中使用delete命令,

delete from bridge where id not in(1269,1668);

如下图:

delete命令执行图

回到QGIS点击平移地图,也就是白色手套,拖动地图查看结果,此时可以发现除了要保留的数据其他数据都已经被过滤掉了,如下图:

桥数据过滤图

使用同样的方式对city和traffic表进行操作,traffic表中所需要保留的数据ID为49,254,464,465,466,482;city表中要保留的市ID为123;这里就不依依展示了。

最终结果如下:

至此数据收集过滤洗涤就完成了,下一步是专题图的制作。

3.2  地图样式详细制作

对点数据样式选择红色,点击属性——符号化——分类——值为name。

桥样式设计图

而交通线路数据使用灰色,点击属性——符号化——分类——值name,调浅颜色。

铁路样式设计图

市地图使用浅蓝色,点击属性——符号化——分类——值name,颜色选择浅蓝色。

长葛市样式设计图

接着长葛市字样的大小,具体如下图:

长葛市样式设计图

最终结果如下:

长葛市样式设计结果图

3.3 数据操作与分析

数据分析这一步只是这次专题图制作的延伸,你可以跳过,做数据分析时依据自己的地图情况而定,下面具几个函数作为数据操作,需要声明的是这些命令一部分是询问AI的,所以——你遇到不懂的,想实现的也可以询问AI,像文心一言,通义千问,kimi等;

3.3.1 ST_buffer数据分析

先创建一个表,此处为citybuffer1,

create table citybuffer1(id int primary key,geom geometry( ' polygon' ,4326));

在往表里添加数据,数据需要结合bridge的数据,

insert into citybuffer1(id ,geom) values(3,(select st_buffer(geom,9.815) from bridge where id=1668));

如下图:

回到QGIS查看结果:

长葛市数据分析图

由图可知增福庙立交桥0.015单位内有铁路,而京广立交桥0.015单位内没有铁路经过。

3.3.2 st_astext和st_intersection数据分析

执行如下代码:

select st_intersects(geom,(select geom from traffic where id=482))from traffic where id=49;

执行结果如下:

结果返回t,这表明京广高速铁路和郑许市域铁路有交点。

执行st_intersection函数目的是为了找到京广高速铁路和郑许市域铁路交点坐标:

select st_astext(st_intersection((select geom from traffic where id=482),(select geom from traffic where id=49))) as intersection point from traffic where id in(482,29);

结果如下,从图中可以看到交点坐标是(113.81276238076573 34.2411422886219)。

3.3.3 ST_Distance、ST_SetSRID、ST_AsText和ST_GeomFromText数据分析

执行如下代码,目的是为了找到图上两个桥的坐标,第一个坐标(113.76838476000012 34.26305228000007)是增福庙立交桥,第二个坐标(113.7766645050001 34.18909505500005)是京广立交桥。

接着使用如下代码计算出两座桥的距离.

SELECT ST_Distance( ST_GeomFromText('POINT(113.76838476000012 34.26305228000007)', 4326), ST_GeomFromText('POINT(113.7766645050001 34.18909505500005)', 4326) ) AS distance;

从结果可以看出二者的距离大约是0.07个单位。

下面我们结合上面的分析计算出下图Q到P和G的距离,从之前的分析可知Q点就是京广高速铁路和郑许市域铁路交点坐标为(113.81276238076573,34.2411422886219),P(113.76838476000012,34.26305228000007),G(113.7766645050001,34.18909505500005)。

长葛市交通图

执行下面的代码:

SELECT ST_Distance( ST_GeomFromText('POINT(113.76838476000012 34.26305228000007)', 4326), ST_GeomFromText('POINT(113.81276238076573 34.2411422886219)', 4326) ) AS distance1,ST_Distance( ST_GeomFromText('POINT(113.81276238076573 34.2411422886219)', 4326), ST_GeomFromText('POINT(113.7766645050001 34.18909505500005)', 4326) ) AS distance1;

从结果可以看到QP长大约为0.0495,QG长大约为0.0633,说明交点到增福庙立交桥更近一些。

3.3.4 st_relate和ST_SetSRID数据分析

郑万高速铁路与增福立交桥关系图

执行如下代码:

select st_relate(ST_SetSRID(geom,4326),ST_SetSRID((select geom from city where id=123),4326)) from citybuffer1 where id=3;

对这个结果的解释是:

2:增福立交桥0.015个单位范围内与长葛市内部相交(存在面与面相交);

F:增福立交桥0.015个单位范围内与长葛市边界不相交;

F:增福立交桥0.015个单位范围内与长葛市外部不相交;

1:增福立交桥0.015个单位的边界与长葛市内部相交(存在线与线相交);

F:增福立交桥0.015个单位的边界与长葛市边界不相交;

F:增福立交桥0.015个单位的边界与长葛市外部不相交;

2:增福立交桥0.015个单位的外部与长葛市内部相交(存在面与面相交);

1:增福立交桥0.015个单位的外部与长葛市的边界相交(存在线与线相交);

2:增福立交桥0.015个单位的外部与长葛市的外部相交(存在面与面相交);

3.3.5 st_union数据分析

更具id联合显示京广高速铁路和郑许市域铁路,先创建一个表

create table traffic_union_line(id int primary key,geom geometry(MultiLineString,4326));

注意这里使用的类型是MultiLineString,而不是LINESTRING,前者用于表示多条线段的集合,每条线段都是一个单独的 LINESTRING 对象,后者用于表示由两个或多个点组成的线段,这些点在空间上是连续的,如果显示的是点或面则不能用这一类型;

接着往表里插入京广高速铁路和郑许市域铁路数据,执行命令:

insert into traffic_union_line(id,geom) select 1,st_union(geom) from traffic where id in(482,49);

执行结果如下图:

联合显示郑万高速铁路与增福立交桥

3.4 专题图制作

点击打印布局,如下图:

打印布局图

在弹出的页面填写布局名称,在左侧栏有以下功能,主要用到框出来的部分:

专题图制作功能图

添加地图

长葛市专题图制作图

添加方向、比例尺和图例

长葛市专题图图例、比例尺制作图

添加标题

 长葛市专题图方位制作图

导出为JPG格式图片

长葛市专题图导出图

长葛市专题图导出格式设置图
长葛市专题图导出位置图

3.5 地图发布

3.5.1Apache发布专题图

在Apache24文件目录bin下打开下图程序

启动Apache

查看电脑右下角Apache是否打开,亮绿灯表示打开

查看是否启动

在.html中插入图片

网页代码添加图片

打开电脑终端cmd,输入ipconfig查看本地IP地址

查看本地ip地址

查看运行端口

启动端口文件

打开httpd.conf找到Listen,查看开放端口,此处为8090.

Apache启动端口

在浏览器上数据IP地址+开放端口如下图:

电脑端:

网页查看地图

手机端:

手机查看地图

手机端查看请确保网络在局域网内,否则无法访问。

3.5.2geoserver发布专题图

创建工作空间如下图:

创建工作空间

创建存储空间如下图

创建存储空间

创建样式此处需要创建三个样式,即city、bridge和traffic的样式,在这之前我们需要将QGIS的样式导出为.sdl文件,此处我们以city的为例。对city的样式修改如下图:

设置样式

需要说明的是使用name字段也是可以的,但也会出现GeoServer无法识别的情况,所以你嫌麻烦可以先不更改字段为id,而是用原来的name。

右键图层点击导出,如下图:

sld文件样式导出

选择保存样式和保存路径如下图:

sld文件样式导出

回到GeoServer创建图层,发布要显示的图层,如下图:

发布图层

在发布的图层中的数据一栏往下滑,看到边框字样,点击computer fromnative bounds,接着点击保存。

设置边界

接着创建样式,如下图:

上传sld文件

将id修改为objectid这是因为导入的样式GeoServer无法识别id,但可以识别objectid,这一点的依据可以点击Layer Attributes查看,在下图中可以发现确实没有id字段,而有objectid,

查看表字段

从上面这张图可以看到数据里面是有name字段的,而没有id,所以理论上创建样式的时候可以使用name字段(但是我自己用name和id都不行,都报错说无法识别,所以这里用了id,而且还要把.sld文件里面的部分代码改掉,属实是走了很多弯路了)

知道这一点后修改下面的代码,把id改为objectid如下图:

修改代码

点击采用并验证是否有报错,接着点击publishing选择默认,如下图:

publishing设置

点击预览如果可以正常预览则说明创建没有问题,如下图:

预览地图

最后保存即可。

然后回到图层编辑对应图层,选择发布一栏往下滑,看到WMS设置,将要显示的图层添加到右边,并点击保存,如下图:

发布地图样式

接着就可以预览发布的图层了,如下图:

查看发布的地图

上面是city图层的发布,对bridge和traffic也是一样的操作。他们的发布预览如下图:

查看发布的桥地图

查看发布的铁路地图

3.5.3 GeoServer中图层组的发布

显示三个图层则需要创建图层组,创建图层组名称并添加要显示的图层,如下图:

创建图层组

添加图层

值得注意的是排在最后的是在最上层的图层,点击保存后可以查看发布的图层组,如下图所示:

查看图层组

查看发布的地图

至此GeoServer的发布就结束了。

4. 结束语

希望本次的专题图制作与发布教程对你有帮助,我也是第一次完整的制作专题图,这一过程中一些论述可能会有问题,一些方法可能欠缺,希望你在实际操作中结合自己实际情况,多多搜集资料,祝你成功!感谢你看到这里。

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值