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

目录

前言

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 夜郎king 
 */
@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 夜郎king 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、「地图故事」全国各省的难抵点(最纵深处)分别在什么地方?。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…

AN 433:源同步接口的约束与分析

文章目录 简介时钟和数据的关系SDR&#xff08;单数据速率&#xff09;和 DDR&#xff08;双数据速率&#xff09;接口约束默认时序分析行为 源同步输出输出时钟输出时钟约束时钟电路和约束示例 以系统为中心的输出延迟约束输出最大延时输出最小延时 以系统为中心的输出时序例外…

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

docker学习---第3步:docker实操大模型

文章目录 1.Images2.Container3.DockerfileENTRYPOINT和CMDCOPY和ADDLABLE、EXPOSE和VOLUME卷中的数据是如何做数据备份的&#xff1f; ARG和ENVHEALTHCHECK 4. Network&#xff08;本节讲容器与容器之间的通信方案&#xff09; 跟着b站 胖虎遛二狗学习 Docker动手入门 &…

DeepSeek系统崩溃 | 极验服务如何为爆火应用筑起安全防线?

引言 极验服务让您的产品站在风口之时&#xff0c;不必担心爆红是灾难的开始&#xff0c;而是期待其成为驱动持续创新的全新起点。 01现象级狂欢背后&#xff0c;你的业务安全防线抗得住吗&#xff1f; “近期DeepSeek线上服务受到大规模恶意攻击&#xff0c;注册可能繁忙&am…

中国计算机学会(CCF)新规解读:CSP-J/S年龄限制政策

中国计算机学会&#xff08;CCF&#xff09;新规解读&#xff1a;CSP-J/S年龄限制政策 一、政策背景与动机 问题根源 低龄化竞赛趋势&#xff1a;近年来&#xff0c;CSP-J/S&#xff08;非专业级软件能力认证&#xff09;参赛者中小学生比例显著增加&#xff0c;部分学生甚至在…

K8s之存储卷

一、容忍、crodon和drain 1.容忍 即使节点上有污点&#xff0c;依然可以部署pod。 字段&#xff1a;tolerations 实例 当node01上有标签test11&#xff0c;污点类型为NoSchedule&#xff0c;而node02没有标签和污点&#xff0c;此时pod可以在node01 node02上都部署&#xff0c…

用大模型学大模型03-数学基础 概率论 条件概率 全概率公式 贝叶斯定理

要深入浅出地理解条件概率与贝叶斯定理&#xff0c;可以从以下几个方面入手&#xff0c;结合理论知识和实例进行学习&#xff1a; 贝叶斯定理与智能世界的暗语 条件概率&#xff0c;全概率公式与贝叶斯公式的推导&#xff0c;理解和应用 拉普拉斯平滑 贝叶斯解决垃圾邮件分类 …

JAVA学习第三天

继承关系变量访问的特点 01.方法中找 02.子类变量定义中找 03.父类中找 this和super关键字的使用区别&#xff1a; super父类构造函数的使用&#xff1a; 使用子类构造函数时&#xff0c;都会初始化父类的数据&#xff0c;自动调用父类的无参构造函数 super内存图——007 继…

多媒体软件安全与授权新范例,用 CodeMeter 实现安全、高效的软件许可管理

背景概述 Reason Studios 成立于 1994 年&#xff0c;总部位于瑞典斯德哥尔摩&#xff0c;是全球领先的音乐制作软件开发商。凭借创新的软件产品和行业标准技术&#xff0c;如 ReWire 和 REX 文件格式&#xff0c;Reason Studios 为全球专业音乐人和业余爱好者提供了一系列高质…

计算机三级网络技术知识点全面总结

声明1 本文参考了计算机三级网络技术考过指南和其他网络教程写成&#xff0c;感谢这些作者提供的资料声明2 如果存在错误和不足&#xff0c;欢迎提出评判建议&#xff1b;如果涉及侵权&#xff0c;请联系我进行删除声明3 本文还提供了PDF版本以便下载&#xff0c;所有资料均完全…

【数据结构】(8) 二叉树

一、树形结构 1、什么是树形结构 根节点没有前驱&#xff0c;其它节点只有一个前驱&#xff08;双亲/父结点&#xff09;。所有节点可以有 0 ~ 多个后继&#xff0c;即分支&#xff08;孩子结点&#xff09;。每个结点作为子树的根节点&#xff0c;这些子树互不相交。 2、关于…

qt中实现QListWidget列表

FR:徐海涛&#xff08;hunkxu)

网络工程师 (35)以太网通道

一、概念与原理 以太网通道&#xff0c;也称为以太端口捆绑、端口聚集或以太链路聚集&#xff0c;是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作&#xff0c;共同承担数据传输任务&#xff0c;从而提高了网络的传输能力和可靠性。 二…

8K样本在DeepSeek-R1-7B模型上的复现效果

7B Model and 8K Examples: Emerging Reasoning with Reinforcement Learning is Both Effective and Effic (notion.site) 港科大助理教授何俊贤的团队以Qwen2.5-Math-7B&#xff08;基础模型&#xff09;为起点&#xff0c;直接对其进行强化学习。整个过程中&#xff0c;没有…

Docker部署Alist网盘聚合管理工具完整教程

Docker部署Alist网盘聚合管理工具完整教程 部署alist初始化修改密码添加存储&#xff01;联通网盘阿里云盘百度网盘 部署alist 本文以Linux Docker部署&#xff0c;假设你已经安装好Docker docker run -d --restartalways \-v /your/data:/opt/alist/data \-p 5244:5244 \-e …

SpringMVC环境搭建

文章目录 1.模块创建1.创建一个webapp的maven项目2.目录结构 2.代码1.HomeController.java2.home.jsp3.applicationContext.xml Spring配置文件4.spring-mvc.xml SpringMVC配置文件5.web.xml 配置中央控制器以及Spring和SpringMVC配置文件的路径6.index.jsp 3.配置Tomcat1.配置…

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…

多模态本地部署和ollama部署Llama-Vision实现视觉问答

文章目录 一、模型介绍二、预期用途1. 视觉问答(VQA)与视觉推理2. 文档视觉问答(DocVQA)3. 图像字幕4. 图像-文本检索5. 视觉接地 三、本地部署1. 下载模型2. 模型大小3. 运行代码 四、ollama部署1. 安装ollama2. 安装 Llama 3.2 Vision 模型3. 运行 Llama 3.2-Vision 五、效果…

破局・重构:建筑行业数字化转型生死时速——当“推土机思维”撞上“数据洪流”,谁能率先上岸?

一、冰与火之歌&#xff1a;大基建遗产下的转型阵痛 中国建筑行业曾用20年时间&#xff0c;浇筑了超越西方200年总量的基建工程&#xff1a;543万公里公路、16万公里铁路、6亿栋房屋……这些钢铁巨龙曾托起“基建狂魔”的荣光&#xff0c;却也埋下时代转折的伏笔。 1. 大维修时…