基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践

news2025/3/3 21:56:07

目录

前言

1、研究背景

2、研究意义

一、研究目标

1、“地理难抵点”的概念

二、“难抵点”空间检索实现

1、数据获取与处理

2、计算流程

3、难抵点计算

4、WebGIS可视化

三、成果展示

1、华东地区

2、华南地区

3、华中地区

4、华北地区

5、西北地区

6、西南地区

7、东北地区

8、台港澳地区

四、总结

1、研究创新点

2、未来展望


前言

1、研究背景

最近看到一个有趣的内容,就是求解一个Polygon的地理难抵点以及其空间范围。地理难抵点(Pole of Inaccessibility)是指在一个多边形区域内,距离周边边界的最远点。这一概念在地理学、城市规划、资源勘探等领域具有重要意义。例如,在城市规划中,了解一个区域的难抵点有助于评估该区域的可达性和开发潜力;在资源勘探中,难抵点的确定可以帮助确定资源开发的最佳位置。因此,对省域“地理难抵点”的研究具有重要的理论和实践价值。下图是我国上海市、山东省、河南省等6个省的地理难抵点的空间分析结果拼图。

随着地理信息技术的不断发展,地理数据的获取、处理和分析变得更加便捷和高效。SpringBoot和PostGIS作为当前流行的开源技术框架,为地理信息系统的开发和应用提供了强大的支持。SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序。它简化了基于Spring的应用开发,通过提供一系列的“Starters”和自动配置功能,使开发者能够快速搭建和部署应用程序。PostGIS是一个开源的地理信息系统(GIS)扩展,用于PostgreSQL数据库。它允许用户存储、管理、查询和分析地理空间数据,提供了丰富的空间数据类型和函数,支持复杂的地理空间操作,如距离计算、拓扑分析等。

2、研究意义

  1. 理论意义:通过对省域“地理难抵点”的研究,可以进一步丰富地理学的理论体系,为地理空间分析提供新的视角和方法。难抵点的确定有助于深入理解区域的地理特征和空间结构,为地理学研究提供新的数据支持。

  2. 实践意义:在城市规划、资源勘探、环境保护等领域,难抵点的确定具有重要的实践价值。例如,在城市规划中,了解一个区域的难抵点有助于评估该区域的可达性和开发潜力,为城市布局和基础设施建设提供科学依据。在资源勘探中,难抵点的确定可以帮助确定资源开发的最佳位置,提高资源利用效率。

  3. 技术意义:结合SpringBoot和PostGIS技术,可以实现省域“地理难抵点”的高效检索和可视化展示。SpringBoot提供了强大的后端开发框架,PostGIS提供了丰富的地理空间数据处理功能,两者结合可以大大提高地理信息系统的开发效率和性能。通过本研究,可以为地理信息系统的开发和应用提供一种新的技术方案,推动地理信息技术的发展和应用。

本文为省域“地理难抵点”的检索及可视化提供了一种有效的技术方案,具有较高的理论和实践价值。未来,可以进一步优化算法,提高计算效率和准确性;结合更多的地理数据,为地理研究和应用提供更丰富的支持;探索系统的扩展功能,为地理信息系统的开发和应用提供更全面的支持。同时,可以将本研究的技术方案应用于其他地理空间分析任务,推动地理信息技术的发展和应用。通过本文的讲解,您不仅可以了解什么是难抵点,同时掌握如何在PostGIS数据库中求解该难抵点,最后基于Leaflet组件对结果进行可视化。

一、研究目标

本文的目标是基于SpringBoot和PostGIS技术,实现省域“地理难抵点”的高效检索和可视化展示。在正式介绍之前,首先对“地理难抵点”的概念、理论及实践意义进行简单介绍。

1、“地理难抵点”的概念

难抵点(极)这个词听着比较艰涩,但是其英文名称就容易理解的多,即"pole of inaccessibility",指的是对一个多边形而言(可以是凸多边形也可以是凹多边形),存在某个点,在这个点可以画出位于多边形内的半径最大的圆。

难抵极(Pole of Inaccessibility,缩写为PIA、POI),请注意这里的POI与兴趣点是两个不同的概念。难抵点是地理学上指最难到达的位置,通常是指离海岸线最远的点,代表着最大程度的大陆性或海洋性。难抵极并不意味着在物理上难以抵达,而仅仅是一个地理学上的概念,但由于其定义,大多数探险家对其产生兴趣。难抵极通常指离海岸线最远的点,无论往哪个方向前进,与海岸线的最近距离都比难抵极与海岸线的最近距离要短。因此地理难抵极或者点的空间检索问题就转变成求解该面内的最大内切圆的圆点及其范围的事宜。

二、“难抵点”空间检索实现

本节将重点介绍“地理难抵点”的空间数据库检索以及SpringBoot的后后台实现。主要介绍空间数据的获取与处理,空间难抵点的计算流程,其次介绍难抵点的计算过程,最后详细介绍如何基于Leaflet进行WebGIS可视化的展示实现。

1、数据获取与处理

本文主要研究省域的最大纵深地点,因此进行空间计算的数据是省域,在之前的系列博客中,我们已经实现将Shapefile中的省域数据导入到PostGIS空间数据库中。在省域信息表中,包含了编码、名称、类型、Geometry字段信息等。其物理表结构如下所示:

表中的数据例子如下:

2、计算流程

省域最大内切圆求解流程图

如上流程图所示,首先会从PostGIS空间数据库中查询出一个Polygon面数据,然后调用空间查询函数ST_MaximumInscribedCircle()计算出一个最大内切圆对象,从最大内切圆对象中可以获取中心圆的经纬度坐标以及圆的半径(请注意,在空间数据库中,半径的单位跟参考坐标系息息相关,例如4326的参考系的返回单位是度,而3857的参考系是米)。然后在SpringBoot中返回输出的GeoJSON和圆心位置坐标和半径,最后在Leaflet中绘制返回的圆。查询SQL如下:

SELECT T
	.NAME,
	( mic ).radius AS radius,
	st_x ( ( mic ).center ) lon,
	st_y ( ( mic ).center ) lat,
	st_asgeojson ( T.geom ) geomJson 
FROM
	biz_province T,
	ST_MaximumInscribedCircle ( geom ) AS mic 
WHERE
	T.ID = 1733467199265333250;

在Navicat中执行以上sql后,可以得到以下的结果。以下结果表示圆形的位置坐标是东经119.93563966,北纬29.05648878。半径是1.369497度的一个内切圆。

上述就是基于PostGIS数据库的最大内切圆的求解过程。有了这个基础,下一步来讲解如何在SpringBoot中进行相关的计算。

3、难抵点计算

这里主要说明如何基于SpringBoot来进行后台开发,这里给出涉及的相关实体类和后台数据库操作类。关键代码如下:

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@TableName(value = "biz_province", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class Province implements Serializable {
	private static final long serialVersionUID = 7710812916753245132L;
	@TableId
	private Long id;
	private String code;
	private String name;
	private String type;
	@TableField(typeHandler = PgGeometryTypeHandler.class)
	private String geom;
	@TableField(exist=false)
	private String geomJson;
}

上面是省份信息实体类,下面是最大内切圆实体类,

package com.yelang.project.extend.earthquake.domain;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
 * - 最大内切圆视图对象,返回圆心中心点的坐标以及圆的半径
 * @author  
 */
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class ProvinceInscribedCircleVO extends Province{
	private static final long serialVersionUID = 4152326858933523374L;
	private BigDecimal lon = new BigDecimal("0");//经度
	private BigDecimal lat = new BigDecimal("0");//纬度
	private BigDecimal radius = new BigDecimal("0");//半径,单位根据坐标系不同而定
}

基于上一节的空间查询的Mapper操作对象关键代码如下:

static final String INSCRIBED_CIRCLE_BYID = "<script>"
			+ " SELECT t.name,(mic).radius AS radius,st_x((mic).center) lon,st_y((mic).center) lat,st_asgeojson(t.geom) geomJson " 
			+ " FROM biz_province t, ST_MaximumInscribedCircle(geom) AS mic where t.id = #{id} "
+ "</script>";
/**
 * - 根据省份主键ID查询最大内切圆信息 add by  in 2025-02-06
 * @param id 查询省份ID
 * @return 该国对应的最大内切圆信息即当前空间对象的矢量范围
 */
 @Select(INSCRIBED_CIRCLE_BYID)
 ProvinceInscribedCircleVO getInscribedCircleById(@Param("id")Long id);

以上就是关键的难抵点的后台计算代码,其它的业务层和控制层代码都比较简单,这里不进行赘述。

4、WebGIS可视化

这里讲述如何对Polygon的最大内切圆进行展示,同时展示省域的GeoJSON信息,其中有一个地方是需要注意的,就是返回的半径单位的问题。对于返回的半径有多种处理方式,我们可以在后台对数据进行处理,也可以在前端对数据进行处理。相对来说,使用后台的处理方式通用性比较强,前端只需要负责进行空间展示即可。这里给出核心的展示源码:

function previewInscribedCircle(gid,name){
	$.ajax({  
		type:"get",  
		url:prefix + "/inscribedcircle/" + gid,  
		data:{},  
		dataType:"json",  
		cache:false,
		processData:false,
		success:function(result){
		    if(result.code == web_status.SUCCESS){
		        showLayerGroup.clearLayers();
		        var legendData = new Array();
		        var areaData = result.data;
	        	var color = ccolor = getRandomColor();
	        	if(gid == areaData.id){
	        		color = "red";
	        	}
	        	var areaLayer = L.geoJSON(JSON.parse(areaData.geomJson),{style: {color:"red",fillColor:"red",weight:3,"opacity":0.35, fillOpacity: 0.35 }}).addTo(mymap);
		        var myIcon = L.divIcon({
	        		iconSize: null,
	        		className: '',
	        		popupAnchor:[5,5],
	        		shadowAnchor:[5,5],
	        		html: buildShowInfo("#f4a90e",areaData)
	        	});
		        showLayerGroup.addLayer(areaLayer);
		        var radius = areaData.radius * 111320; // 半径,单位为米
                // 在地图上绘制圆
			    var circle = L.circle([areaData.lat, areaData.lon], {
			        color: '#1ab394', // 边框颜色
			        fillColor: '#1ab394', // 填充颜色
			        dashArray:"10,5",//设置虚线样式:每段实线宽10px,间隔5px
			        fillOpacity: 0.39, // 填充透明度
			        radius: radius // 半径
			     }).addTo(showLayerGroup);
		        //中心点位
		        L.marker([areaData.lat, areaData.lon], { icon: myIcon}).addTo(showLayerGroup);
		        mymap.fitBounds(showLayerGroup.getBounds());
		    }
		},
		error:function(){
		    $.modal.alertWarning("获取空间信息失败");
		}
	});
}

请注意,在上述的代码中,var radius = areaData.radius * 111320; // 半径,单位为米,这里的11320代表的是一个常量。后台返回的单位是度的情况下才可以这么计算,请各位在实际实践时注意选择。经过以上的几个环节,我们基本完成了对省域空间面的最大内切圆的求解。

三、成果展示

本节将结对我们的所有省份进行地理区域划分,按照传统的七大区域划分分为东北、华北、华中、华南、华东、西北、西南地区,同时将展示这七大区域的所属省份及其最大内切圆的空间信息展示。下面跟随我们的分析成果来看看每个省的最大纵深点大概在哪个位置吧。

1、华东地区(包括山东、江苏、安徽、浙江、福建、上海);
2、华南地区(包括广东、广西、海南);
3、华中地区(包括湖北、湖南、河南、江西);
4、华北地区(包括北京、天津、河北、山西、内蒙古);
5、西北地区(包括宁夏、新疆、青海、陕西、甘肃);
6、西南地区(包括四川、云南、贵州、西藏、重庆);
7、东北地区(包括辽宁、吉林、黑龙江);
8、台港澳地区(包括台湾、香港、澳门).

1、华东地区

序号

省份名称

纵深点

1

山东省

莱芜区附近,离济南有一定距离

2

江苏省

靖江市附近,离南京有一定距离

3

安徽省

庐江县附近,离合肥有一定距离

4

浙江省

位于金华市附近,离杭州有一定距离

5

福建省

塔前镇附近,离福州有一定距离

6

上海市

闵行区

2、华南地区

序号

省份名称

纵深点

1

广东省

清远市附近,离广州有一定距离

2

广西壮族自治区

来宾市附近,离南宁有一定距离

3

海南省

红毛镇附近,离海口有一定距离

3、华中地区

序号

省份名称

纵深点

1

河南省

颍阳镇附近,离郑州有一定距离

2

湖北省

柴湖镇附近,离武汉有一定距离

3

湖南省

荣华乡附近,离长沙有一定距离

4

江西省

拖船镇附近,离南昌有一定距离

4、华北地区

序号

省份名称

纵深点

1

北京市

延寿镇附近

2

河北省

安国市附近,离石家庄有一定距离

3

内蒙古自治区

牙克石市附近,离呼和浩特很远

4

山西省

位于清徐县附近,离太原有一定距离

5

天津市

西堤头镇附近

5、西北地区

序号

省份名称

纵深点

1

甘肃省

敦煌市附近,距离兰州很远

2

宁夏回族自治区

同心镇附近,离银川有一定距离

3

青海省

离西宁有距离

4

陕西省

位于新场镇附近,离西安有一定距离

5

新疆维吾尔自治区

尉犁县附近,离乌鲁木齐远

6、西南地区

序号

省份名称

纵深点

1

重庆市

璧山区附近

2

贵州省

瓮安县附近,离贵阳有一定距离

3

四川省

康定市附近,离成都有距离

4

云南省

位于新场镇附近,离西安有一定距离

5

西藏自治区

离拉萨远

7、东北地区

序号

省份名称

纵深点

1

黑龙江省

铁力市附近,离哈尔滨有一定距离

2

吉林省

八道河子镇附近,离长春有一定距离

3

辽宁省

鸡冠山乡附近,离沈阳有一定距离

8、台港澳地区

四、总结

以上就是本文的主要内容,本文为省域“地理难抵点”的检索及可视化提供了一种有效的技术方案,具有较高的理论和实践价值。未来,可以进一步优化算法,提高计算效率和准确性;结合更多的地理数据,为地理研究和应用提供更丰富的支持;探索系统的扩展功能,为地理信息系统的开发和应用提供更全面的支持。

1、研究创新点

本研究将SpringBoot和PostGIS技术相结合,实现了省域“地理难抵点”的高效检索和可视化展示。这种技术融合为地理信息系统的开发和应用提供了一种新的技术方案,具有较高的创新性和实用性。

2、未来展望

在难抵点计算过程中,通过优化算法和数据库查询,提高了计算效率和准确性。同时,结合实际应用需求,探索了系统的扩展功能,为地理信息系统的开发和应用提供了更全面的支持。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。

只有站在前人的肩膀上才能看得更高更远,本文在编写过程中参考以下内容:

1、难抵点——海岸线两侧的极点。

2、「地图故事」全国各省的难抵点(最纵深处)分别在什么地方?。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt】详细介绍如何在Visual Studio Code中编译、运行Qt项目

Visual Studio Code一只用的顺手&#xff0c;写Qt的时候也能用VS Code开发就方便多了。 理论上也不算困难&#xff0c;毕竟Qt项目其实就是CMake&#xff08;QMake的情况这里就暂不考虑了&#xff09;项目&#xff0c;VS Code在编译、运行CMake项目还是比较成熟的。 这里笔者打…

本地部署大语言模型-DeepSeek

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型&#xff0c;具备数学推理、代码生成等深度能力&#xff0c;堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…

SQLAlchemy系列教程:SQLAlchemy快速入门示例项目

SQLAlchemy是与数据库交互的Python开发人员不可或缺的库。这个强大的ORM允许使用python结构进行简单的数据库操作。设置过程很简单&#xff0c;并且允许可扩展的数据库应用程序开发。本文通过入门项目完整介绍SQLAlchemy的应用过程&#xff0c;包括安装依赖包&#xff0c;创建连…

【Linux网络#10】:Https协议原理

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xf…

蓝桥杯备考:记忆化搜索之function

这道题是有重复的问题的&#xff0c;所以我们可以选择记忆化搜索 #include <iostream> using namespace std; typedef long long LL; const int N 25; LL ret[N][N][N]; LL dfs(LL a,LL b, LL c) {if(a<0 || b<0 || c<0) return 1;if(a>20 || b>20 || c…

mysql 全方位安装教程

下载 MySQL 【官网下载地址】 注意要选择较大的哪个安装包&#xff0c;小的安装包是一个安装器。 我们不用登录&#xff0c;直接下载 直接运行下载好的安装包 MySQL如果是 安装包安装, 可以图形化界面自主配置 如果是压缩包解压, 可以配置 配置文件, 可以解压安装到指定的…

设计模式Python版 观察者模式

文章目录 前言一、观察者模式二、观察者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…

如何在Python用Plot画出一个简单的机器人模型

如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中&#xff0c;首先要知道机器人的DH参数&#xff0c;然后计算出每一个关节的位置&#xff0c;最后利用 plot 函数画出关节之间的连杆就可以了&#xff0c;最后利用 animation 库来实现一个动画效果。 import matplo…

如何使用ArcGIS Pro制作横向图例:详细步骤与实践指南

ArcGIS Pro&#xff0c;作为Esri公司推出的新一代地理信息系统&#xff08;GIS&#xff09;平台&#xff0c;以其强大的功能和灵活的操作界面&#xff0c;在地理数据处理、地图制作和空间分析等领域发挥着重要作用。 在地图制作过程中&#xff0c;图例作为地图的重要组成部分&…

【Python 数据结构 3.顺序表】

目录 一、顺序表基本概念 1.顺序表的概念 2.顺序表的元素插入 元素插入的步骤 3.顺序表的元素删除 元素删除的步骤 4.顺序表的元素查找 元素查找的步骤 5.顺序表的元素索引 元素索引的步骤 6.顺序表的元素修改 元素修改的步骤 二、Python中的顺序表 1.顺序表的定义 2.顺序表的插…

SQL经典题型

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装

【deepseek第二课】docker部署dify&#xff0c;配置私有化知识库&#xff0c;解决网络超时&#xff0c;成功安装 1. dify安装1.1 官网安装文档介绍1.2 安装报错&#xff0c;网络连接问题使用镜像加速器处理1.3 dify后台启动很多docker进程 2. 页面探索2.1 设置管理账号2.2 添加…

P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用

P8651 [P8651 [蓝桥杯 2017 省 B] 日期问题--注意日期问题中2月的天数 / if是否应该连用 题目 分析代码 题目 分析 代码中巧妙的用到3重循环&#xff0c;完美的解决了输出的顺序问题【题目要求从小到大】 需要注意的是2月的值&#xff0c;在不同的年份中应该更新2月的值 还有…

动态规划多阶段报童模型,c++ 实现, java 实现

借助 chaptgpt 和 deepseek&#xff0c;成功实现了c上的多阶段报童模型的动态规划。花费了几天&#xff0c;将以前的 java 程序用 c 实现。 文章目录 C 代码Java 代码 总结&#xff1a; c 还是比 java 快点&#xff0c;30个阶段快了零点几秒c 使用了 unordered_map &#xff0…

PE文件结构详解(DOS头/NT头/节表/导入表)使用010 Editor手动解析notepad++.exe的PE结构

一&#xff1a;DOS部分 DOS部分分为DOS MZ文件头和DOS块&#xff0c;其中DOS MZ头实际是一个64位的IMAGE_DOS——HEADER结构体。 DOS MZ头部结构体的内容如下&#xff0c;我们所需要关注的是前面两个字节&#xff08;e_magic&#xff09;和后面四个字节&#xff08;e_lfanew&a…

[含文档+PPT+源码等]精品基于Python实现的vue3+Django计算机课程资源平台

基于Python实现的Vue3Django计算机课程资源平台的背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、教育行业发展背景 1. 教育资源数字化趋势 随着信息技术的快速发展&#xff0c;教育资源的数字化已成为不可逆转的趋势。计算机课程资源作为教育领域的重要组成部…

vue3中ref和reactive响应式数据、ref模板引用(组合式和选项式区别)、组件ref的使用

目录 Ⅰ.ref 1.基本用法&#xff1a;ref响应式数据 2.ref模板引用 3.ref在v-for中的模板引用 ​4.ref在组件上使用 ​5.TS中ref数据标注类型 Ⅱ.reactive 1.基本用法&#xff1a;reactive响应式数据 2.TS中reactive标注类型 Ⅲ.ref和reactive的使用场景和区别 Ⅳ.小结…

Oracle VM VirtualBox 7.1 安装与虚拟机创建全流程指南(Windows平台)

一、软件定位与核心功能 Oracle VM VirtualBox 是开源跨平台虚拟化工具&#xff0c;支持在 Windows、Linux、macOS 系统上创建和管理虚拟机&#xff08;VM&#xff09;&#xff0c;其核心功能包括&#xff1a; 多系统兼容&#xff1a;可安装 Windows、Ubuntu、CentOS 等 50 操…

细说 Java GC 垃圾收集器

一、GC目标 业务角度&#xff0c;我们需要追求2个指标&#xff1a; 低延迟&#xff08;Latency&#xff09;&#xff1a;请求必须多少毫秒内完成响应&#xff1b;高吞吐&#xff08;Throughput&#xff09;&#xff1a;每秒完成多少次事务。 两者通常存在权衡关系&#xff0…

第2章 windows故障排除(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第2章开始带你入门了&#xff0c;这里给出了几个windows重要的工具&#xff0c;说实话&#xff0c;好多我也是第一…