【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
目录
前言
一、空间检索简介
1、空间表结构
2、四至空间检索
二、前后端实现
1、后端实现
2、前端集成
三、成果展示
1、东部省份
2、西部省份
3、南部省份
4、北部省份
5、中部省份
四、总结
前言
在当今数字化时代,地理信息数据的分析与可视化对于众多领域都有着至关重要的意义。从城市规划到资源管理,从环境监测到交通物流,精准、直观地呈现地理空间数据能够为决策提供有力支持。在中国这样一个地域辽阔、行政区划复杂的国家,各省的地理四至极点信息在一定程度上反映了该省的地理位置特征和空间分布情况。通过确定各省的东西南北四至极点所在的区县,并将其可视化展示,可以为众多领域提供有价值的参考。
在城市规划方面,了解周边省份的四至极点区县有助于明确自身的区域优势和潜在发展方向,合理布局城市功能区,规划交通线路和基础设施建设,促进区域间的协调发展。对于资源管理,直观的可视化界面可以帮助管理者快速了解资源的地理分布范围,以便更好地制定资源开发与保护策略,优化资源分配,提高资源利用效率。 在环境监测领域,通过观察四至极点区县及其周边环境数据的可视化呈现,可以及时发现环境问题的空间关联性,为跨区域的环境治理提供依据,实现区域性环境协同监测与管理。此外,交通物流行业也可以借助该可视化系统,优化运输路线规划,提高物流配送效率,降低运输成本,更好地应对复杂的地理环境和运输需求。
本次研究聚焦于基于 SpringBoot 和 PostGIS 的各省东西南北四至极点区县可视化项目。本项目旨在整合 SpringBoot 的高效开发能力和 PostGIS 的强大空间数据处理功能,构建一个精准、实时且交互性强的各省东西南北四至极点区县可视化平台,为相关领域的研究与决策提供一种创新、直观且便捷的地理信息可视化解决方案,助力探索和挖掘地理空间数据蕴含的巨大价值,推动各行业在地理维度上的科学决策与可持续发展。接下来,本文将深入探讨该可视化项目的空间查询设计、关键技术实现以及实际应用场景与效果评估等内容,详细阐述如何利用 SpringBoot 和 PostGIS 实现地理数据的有效处理与可视化展示,以满足不同用户的需求,为地理信息相关领域的研究和实践提供有价值的参考与借鉴。通过本文可以实现一个查找对应省份的四至区县和对应经纬度点坐标信息。
一、空间检索简介
本节将重点对空间检索的知识进行综合介绍,分别从以下两点开展,首先是空间表结构展示,对县域这张空间表进行简单介绍。其次介绍如何基于PostGIS来进行省域范围的区县四至空间检索实践。
1、空间表结构
本实例涉及的空间表结构有以下这张表,这张便是区域信息,是省份对象的区县信息。表结构如下:
具体的表结构SQL如下所示:
CREATE TABLE "public"."biz_area" ("id" int8 NOT NULL,"province_code" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,"province_name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,"city_code" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,"city_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL,"area_code" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,"area_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL,"type" varchar(32) COLLATE "pg_catalog"."default","geom" "public"."geometry",CONSTRAINT "pk_biz_area" PRIMARY KEY ("id")
);
CREATE INDEX "idx_biz_area_areacode" ON "public"."biz_area" USING btree ("area_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_area_city_code" ON "public"."biz_area" USING btree ("city_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_area_geom" ON "public"."biz_area" USING gist ("geom" "public"."gist_geometry_ops_2d"
);
CREATE INDEX "idx_biz_area_geom_gp" ON "public"."biz_area" USING gist ((geom::geography) "public"."gist_geography_ops"
);
CREATE INDEX "idx_biz_area_provincec_code" ON "public"."biz_area" USING btree ("province_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
COMMENT ON COLUMN "public"."biz_area"."id" IS '主键ID';
COMMENT ON COLUMN "public"."biz_area"."province_code" IS '省份编码';
COMMENT ON COLUMN "public"."biz_area"."province_name" IS '省份名称';
COMMENT ON COLUMN "public"."biz_area"."city_code" IS '市级编码';
COMMENT ON COLUMN "public"."biz_area"."city_name" IS '市级名称';
COMMENT ON COLUMN "public"."biz_area"."area_code" IS '区县编码';
COMMENT ON COLUMN "public"."biz_area"."area_name" IS '区县名称';
COMMENT ON COLUMN "public"."biz_area"."type" IS '类型';
COMMENT ON COLUMN "public"."biz_area"."geom" IS 'geom';
区县表的查询数据结果如下所示:
以上就是空间表模型和表结构的简单介绍。 这张表是基础数据表格,是后续进行四至空间分析的基础。
2、四至空间检索
要想实现空间四至的求解,其实可以转换成寻找当前面数据的四至范围极值的问题。因此我们只需要找到能包围当前面数据的做大点的坐标即可。为了方便实现按照某省份来查询其对应的四至范围,因此在Postgresql中使用子查询来进行数据的过滤,首先定义with 子句。查询的SQL如下:
WITH temp_area AS (SELECT * FROM biz_area T WHERE T.province_code = '510000'),bounds_info AS ((SELECT '最东' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY x DESC LIMIT 1)UNION (SELECT '最西' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY x ASC LIMIT 1)UNION (SELECT '最北' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY y ASC LIMIT 1)UNION (SELECT '最南' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY y DESC LIMIT 1)) SELECT direction,id, province_code, province_name, city_code,city_name,area_code,area_name,type,st_asgeojson(geom) AS geomJson,x AS lon,y AS lat FROM bounds_info;
这里我们以四川省为例,查询四川省的四至县域结果:
可以直观的看到,四川省最东边是达州市的宣汉县,最西边是甘孜藏族自治州的石渠县,最南边是凉山彝族自治州的会理县,最北边是阿坝藏族羌族自治州的若尔盖县。
二、前后端实现
介绍完空间表以及四至的空间检索实现后,接下来我们来介绍一下如何在前后端实现接口的接入和WebGIS界面的可视化。
1、后端实现
后端比较简单,这里我们将前面的四至查询函数包装成一个公共的方法,供后续的分析方法调用。在Mapper中定义查询请求的方法体,具体如下图所示:
static final String FIND_ESWNAREA_BYPROVINCE_SQL = "<script>"+ " WITH temp_area AS ( SELECT * FROM biz_area T WHERE T.province_code = #{province_code} ), "+ " bounds_info AS ("+ " ( SELECT '最东' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T,LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY x DESC LIMIT 1 "+ " ) UNION "+ " ( SELECT '最西' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T,LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY x ASC LIMIT 1 "+ " ) UNION "+ " ( SELECT '最南' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T, LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY y ASC LIMIT 1 "+ " ) UNION "+ " (SELECT '最北' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T, LATERAL ST_DumpPoints( T.geom ) AS dp ORDER BY y DESC LIMIT 1 "+ ") SELECT direction,id,province_code,province_name,city_code,city_name,area_code, "+ " area_name,type, st_asgeojson(geom) geomJson, x lon,y lat FROM bounds_info "+ "</script>";
/**
* - 根据省份code查询对应省份的四至区县信息
* @param provinceCode 需要查询的目标省份code
* @return
*/
@Select(FIND_ESWNAREA_BYPROVINCE_SQL)
List<EwsnAreaVo> findEswnAreaByProvinceCode(@Param("province_code")String provinceCode);
这里仅介绍Mapper的实现,具体的业务层和控制层代码比较简单,在此不在赘述。
2、前端集成
介绍完后端的方法实现后,再来介绍一下前端如何使用Leaflet来进行具体的展示。关于地图页面的展示分为两个部分,第一部分展示省份信息,第二部分是展示四至极值的所在区县信息。首先是展示省份信息的方法,关键代码如下:
function previewProvince(gid,name){var myStyle = {color:"red",weight:3,"opacity":0.65};$.ajax({ type:"get", url:prefix + "/geojson/" + gid, data:{}, dataType:"json", cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){var geojson = JSON.parse(result.data);var areaLayer = L.geoJSON(geojson,{style:myStyle}).addTo(mymap);var myIcon = L.divIcon({className: 'my-div-icon',iconSize: 100});showLayerGroup.clearLayers();showLayerGroup.addLayer(areaLayer);}},error:function(){$.modal.alertWarning("获取空间信息失败");}});
}
展示东南西北四至点和所在区县的核心方法如下:
function previewEwsn(pid,provinceCode,name){previewProvince(pid,name);$.ajax({ type:"get", url:prefix + "/ewsnprovince/list/" + provinceCode, data:{}, dataType:"json", cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){var legendData = new Array();for(var i = 0;i< result.data.length;i++){var areaData = result.data[i];var color = ccolor = getRandomColor();var areaLayer = L.geoJSON(JSON.parse(areaData.geomJson),{style: {color:color,fillColor:color,weight:3,"opacity":0.65, fillOpacity: 0.65 }}).addTo(mymap);var myIcon = L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: buildShowInfo(i,color,areaData)});showLayerGroup.addLayer(areaLayer);//中心点位L.marker([areaData.lat,areaData.lon], { icon: myIcon}).addTo(showLayerGroup);legendData.push({label: "\xa0\xa0"+areaData.cityName + areaData.areaName,type: "rectangle",radius: 12,color: color,fillColor: color,fillOpacity: 0.8,weight: 2});}mymap.fitBounds(showLayerGroup.getBounds());initLegend(legendData);}},error:function(){$.modal.alertWarning("获取空间信息失败");}});}
三、成果展示
篇幅有限不能将所有省份一一展示,从东西南北中四个方向各选取一些省份及其对应的四至区县来进行展示和讲解。各个省份排名不分先后,区县信息位置是准确的,文中展示不全的,如有兴趣,欢迎在评论区留言。
1、东部省份
上海市四至:
序号 | 四至 | 所在区县 |
1 | 最北边 | 上海崇明区 |
2 | 最东边 | 上海崇明区 |
3 | 最西边 | 上海青浦区 |
4 | 最南边 | 上海金山区 |
江苏省四至:
序号 | 四至 | 所在区县 |
1 | 最北边 | 连云港市赣榆区 |
2 | 最东边 | 南通市启东市 |
3 | 最西边 | 徐州市丰县 |
4 | 最南边 | 苏州市吴江区 |
2、西部省份
西藏自治区四至:
序号 | 四至 | 所在区县 |
1 | 最北边 | 那曲市双湖县 |
2 | 最东边 | 昌都市芒康县 |
3 | 最西边 | 阿里地区札达县 |
4 | 最南边 | 山南市错那县 |
3、南部省份
广西壮族自治区四至:
序号 | 四至 | 所在区县 |
1 | 最北边 | 桂林市全州县 |
2 | 最东边 | 贺州市八步区 |
3 | 最西边 | 百色市西林县 |
4 | 最南边 | 北海市海城区 |
4、北部省份
河北省四至:
序号 | 四至 | 所在区县 |
1 | 最北边 | 承德市围场满族蒙古族自治县 |
2 | 最东边 | 秦皇岛市山海关区 |
3 | 最西边 | 邯郸市涉县 |
4 | 最南边 | 邯郸市魏县 |
5、中部省份
湖北省四至:
序号 | 四至 | 所在区县 |
1 | 最北边 | 十堰市郧西县 |
2 | 最东边 | 黄冈市黄梅县 |
3 | 最西边 | 恩施土家族苗族自治州利川市 |
4 | 最南边 | 咸宁市通城县 |
四、总结
以上就是本文的主要内容,本次研究聚焦于基于 SpringBoot 和 PostGIS 的各省东西南北四至极点区县可视化项目。本项目旨在整合 SpringBoot 的高效开发能力和 PostGIS 的强大空间数据处理功能,构建一个精准、实时且交互性强的各省东西南北四至极点区县可视化平台,为相关领域的研究与决策提供一种创新、直观且便捷的地理信息可视化解决方案,助力探索和挖掘地理空间数据蕴含的巨大价值,推动各行业在地理维度上的科学决策与可持续发展。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。
相关文章:

【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
目录 前言 一、空间检索简介 1、空间表结构 2、四至空间检索 二、前后端实现 1、后端实现 2、前端集成 三、成果展示 1、东部省份 2、西部省份 3、南部省份 4、北部省份 5、中部省份 四、总结 前言 在当今数字化时代,地理信息数据的分析与可视化对于众…...
【C/C++】线程状态以及转换
文章目录 线程状态以及转换1 基本状态1.1 新建(New)1.2 就绪(Ready / Runnable)1.3 运行中(Running)1.4 阻塞/等待(Blocked / Waiting / Sleeping)1.5 挂起(Suspended&am…...
从零开始:Python语言进阶之异常处理
一、认识异常:程序运行中的“意外事件” 在编写Python程序时,即使代码语法完全正确,运行过程中也可能遭遇各种意外情况。这些意外被称为异常,它们会打断程序的正常执行流程。例如,当我们尝试打开一个不存在的文件、用0…...
关于vue彻底删除node_modules文件夹
Vue彻底删除node_modules的命令 vue的node_modules文件夹非常大,常规手段根本无法删除. 解决方法: 在node_modules文件夹所在的路径运行命令窗口,并执行下面的命令. npm install rimraf -g rimraf node_modules说明: npm install rimraf -g 该命令是安装 node…...

如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题?
环境: SearXNG Qwen3-32B-FP8 vllm 0.8.5 问题描述: 如何制作可以本地联网搜索的MCP,并让本地Qwen3大模型调用搜索回答用户问题? 解决方案: 一、安装searxng 1.按需新建模型相关文件夹 mkdir MCP chmod 777 /mnt/program/MCP2.配置conda源 nano ~/.condarc nano…...

服务器硬盘虚拟卷的处理
目前的情况是需要删除逻辑卷,然后再重新来弄一遍。 数据已经备份好了,所以不用担心数据会丢失。 查看服务器的具体情况 使用 vgdisplay 操作查看服务器的卷组情况: --- Volume group ---VG Name vg01System IDFormat …...

一个国债交易策略思路
该国债交易策略的核心在于通过分析历史价格数据来识别市场趋势,并在趋势确认时进行开仓操作。策略的设计思路结合了价格波动范围的计算和市场波动性的评估,旨在捕捉市场的短期趋势并控制风险。 首先,策略通过对过去5根K线的最高价和最低价进行…...
Linux常用下载资源命令
wget命令 基本用法 wget -O http://example.com/file.zip-O 参数表示将文件保存为原始文件名。 如果需要指定文件名,可以使用 -o 参数: wget -o custom_name.zip http://example.com/file.zip-P :指定下载文件的保存路径。 wget -P /path/…...
Go语言爬虫系列教程(三)HTML解析技术
第3课:HTML解析技术 在上一章中,我们使用正则表达式提取网页内容,但这种方法有局限性。对于复杂的HTML结构,我们需要使用专门的HTML解析库。下面将介绍如何在Go中解析HTML。 1. HTML DOM树结构介绍 1.1 什么是DOM DOM…...

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球
【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…...
“夹子音”的发声原理和潜在风险
关于“夹子音”的发声原理和潜在风险,以下从科学角度和声乐实践出发,为你详细解析: 一、什么是夹子音? 夹子音是近年来网络流行的非专业术语,指通过刻意挤压喉部、改变共鸣腔形态发出的 尖细、嗲气、幼态化 的声音。常…...
思科硬件笔试面试题型解析
本专栏预计更新60期左右。当前第13期 这个系列通过在各类网上搜索大厂公开的笔试和面试题目,然后构造相关的知识点矩阵,让大家对核心的知识点有更深的认识,这个过程虽然耗时费力,但大厂的很多题目(包括模拟题)确实非常巧妙,很有代表性。由于官方没有发布过这样的题库,所…...

手写ES6 Promise() 相关函数
手写 Promise() 相关函数: Promise()、then()、catch()、finally() // 定义三种状态常量 const PENDING pending const FULFILLED fulfilled const REJECTED rejectedclass MyPromise {/*定义状态和结果两个私有属性:1.使用 # 语法(ES2022 官方私有字…...
Windows 平台 TCP 通信开发指南
开篇介绍 在 Windows 平台进行 TCP 通信开发,是网络编程中的常见需求。本文将详细讲解在 Windows 平台下,如何利用 Winsock API 实现高效的 TCP 客户端与服务端通信。 使用示例 必须引入的头文件 #include <windows.h> #pragma comment(lib,&q…...

【NLP 76、Faiss 向量数据库】
压抑与痛苦,那些辗转反侧的夜,终会让我们更加强大 —— 25.5.20 Faiss(Facebook AI Similarity Search)是由 Facebook AI 团队开发的一个开源库,用于高效相似性搜索的库,特别适用于大规模向…...

软件名称:系统日志监听工具 v1.0
软件功能:一款基于 PyQt5 开发的 Windows 系统日志监听工具,适用于系统运维、网络管理、故障排查等场景,具备以下核心功能: 支持监听系统三大日志源:应用程序 / 系统 / 安全日志实时抓取新日志事件,自动滚…...

Spring AI 之结构化输出转换器
截至 2024 年 2 月 5 日,旧的 OutputParser、BeanOutputParser、ListOutputParser 和 MapOutputParser 类已被弃用,取而代之的是新的 StructuredOutputConverter、BeanOutputConverter、ListOutputConverter 和 MapOutputConverter 实现类。后者可直接替换前者,并提供相同的…...

Java虚拟机面试题:内存管理(上)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...

进程间通信I·匿名管道
目录 进程间通信(IPC) 含义 目的 分类 匿名管道 原理 创建过程 特性 四大情况 close问题 代码练习 简单通信 进程池 小知识 进程间通信(IPC) 含义 就是让不同的进程能看到同一份资源,实现数据交流。 …...

Ubuntu Linux系统的基本命令详情
1.Ubuntu Linux是以桌面应用为主的Linux发行版操作系统 2.Ubuntu的用户使用 在登录系统一般使用在安装系统时建立的普通用户登录,如果要使用超级用户权限 #sudo ---执行命令 sudo passwd ---修改用户密码 su - root ---切换超级用户 系统的不同,命令也不…...

大数据治理:理论、实践与未来展望(二)
书接上文 文章目录 七、大数据治理的未来发展趋势(一)智能化与自动化(二)数据隐私与安全的强化(三)数据治理的云化(四)数据治理的跨行业合作(五)数据治理的生…...

PCB布局设计
PCB布局设计 一、原理图到PCB转换前的准备工作 在将原理图转换为PCB之前,我们需要进行一系列准备工作,确保设计的正确性和完整性。这一步骤至关重要,可以避免后续PCB设计中出现不必要的错误。 // 原理图转PCB前必要检查步骤 // 1. 仔细检查…...
【49. 字母异位词分组】
Leetcode算法练习 笔记记录 49. 字母异位词分组 49. 字母异位词分组 public List<List<String>> groupAnagrams(String[] strs) {Map<String, List<String>> map new HashMap<>();for (int i 0; i < strs.length; i) {//排序就是相同字符了…...
用 AI 让学习更懂你:如何打造自动化个性化学习系统?
用 AI 让学习更懂你:如何打造自动化个性化学习系统? 在这个信息爆炸的时代,传统的学习方式已经难以满足个体化需求。过去,我们依赖固定的教学课程,所有学生按照统一进度进行学习,但每个人的学习节奏、兴趣点和理解方式都不尽相同。而人工智能(AI)正在彻底改变这一局面…...

esp32+IDF V5.1.1版本编译freertos报错
error: portTICK_RATE_MS undeclared (first use in this function); did you mean portTICK_PERIOD_MS 解决方法: 使用命令 idf.py menuconfig 打开配置界面配置freeRtos 使能configENABLE_BACKWARD_COMPATIBLITY...
嵌入式软件-如何做好一份技术文档?
嵌入式软件-如何做好一份技术文档? 文章目录 嵌入式软件-如何做好一份技术文档?一.技术文档的核心价值与挑战二.文档体系的结构化设计三.精准表达嵌入式特有概念四. **像管理代码一样管理文档**,代码与文档的协同维护五.质量评估与持续改进5.…...

笔记本6GB本地可跑的图生视频项目(FramePack)
文章目录 (一)简介(二)本地执行(2.1)下载(2.2)更新(2.3)运行(2.4)生成 (三)注意(3.1)效…...

SpringMVC实战:动态时钟
引言 在现代 Web 开发中,选择一个合适的框架对于项目的成功至关重要。Spring MVC 作为 Spring 框架的核心模块之一,以其清晰的架构、强大的功能和高度的可配置性,成为了 Java Web 开发领域的主流选择。本文将通过一个“动态时钟”的实战项目…...
vscode include总是报错
VSCode 的 C/C 扩展可以通过配置 c_cpp_properties.json 来使用 compile_commands.json 文件中的编译信息,包括 include path、编译选项等。这样可以确保 VSCode 的 IntelliSense 与实际编译环境保持一致。 方法一:直接指定 compile_commands.json 路径…...

哈希表的实现(上)
前言 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将…...