springboot+mybatis对接使用postgresql中PostGIS地图坐标扩展类型字段

方案一(完全集成和自动解析):

        <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency>

 使用 org.postgresql.geometric包下的 PGpoint 类来接收数据库中POINT类型,但是由于直接使用无法达到指定sql语句格式,需要重写一下getValue()方法

package com.ruoyi.protect.bean.control.countybound.po;
import org.postgresql.geometric.PGpoint;public class MyPGPoint extends PGpoint {public MyPGPoint(double x, double y){super(x,y);}@Overridepublic String getValue() {return isNull ? null : "ST_GeomFromText('POINT(" + x + " " + y + ")', 4326)";}}

 mybatis原生类型中没有这个类型,需要自定义handler进行处理

package com.ruoyi.protect.handler;import com.ruoyi.protect.bean.control.countybound.po.MyPGPoint;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKBReader;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class PGpointTypeHandler extends BaseTypeHandler<MyPGPoint> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, MyPGPoint parameter, JdbcType jdbcType) throws SQLException {
//        String param = "ST_GeomFromText('POINT(" + parameter.x + " " + parameter.y + ")', 4326)";ps.setObject(i, parameter);}// 走的这个方法,所以先只重写这个,如果其他方法需要 思路一样@Overridepublic MyPGPoint getNullableResult(ResultSet rs, String columnName) throws SQLException {String pointStr = rs.getString(columnName);// 解析从数据库中获取的字符串格式的pointif (pointStr!= null) {pointStr = pointStr.replace("POINT", "");pointStr = pointStr.substring(1, pointStr.length() - 1);String[] coords = pointStr.split(" ");double x = Double.parseDouble(coords[0]);double y = Double.parseDouble(coords[1]);return new MyPGPoint(x, y);}return null;}@Overridepublic MyPGPoint getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String pointStr = rs.getString(columnIndex);if (pointStr!= null) {pointStr = pointStr.substring(1, pointStr.length() - 1);String[] coords = pointStr.split(",");double x = Double.parseDouble(coords[0]);double y = Double.parseDouble(coords[1]);return new MyPGPoint(x, y);}return null;}@Overridepublic MyPGPoint getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String pointStr = cs.getString(columnIndex);if (pointStr!= null) {pointStr = pointStr.substring(1, pointStr.length() - 1);String[] coords = pointStr.split(",");double x = Double.parseDouble(coords[0]);double y = Double.parseDouble(coords[1]);return new MyPGPoint(x, y);}return null;}}

 然后将这个hanler启动时加载,一般配置文件都可以指定加载自定义handler路径,如果是mybatis也有类似的配置项,也可以在配置类或者mybatis-config.xml中配置,反正目的就是把这个handler加载进去:

 Mapper.xml中写法也有要求:

插入时要使用${} 否则#{}会带单引号;查询时要使用ST_AsText()包着,否则是一串二进制字符串;

    <insert id="addPoint">insert into gfa_point (point_name,point_addr,point_coor) values(#{gp.pointName},#{gp.pointAddr},${gp.pointCoor} )</insert><select id="selectPage" resultMap="BaseResultMap">selectpoint_name,point_addr,ST_AsText(point_coor) pointCoorfromgfa_point;</select>

 此时,启动项目就可以

方案二(更简便方式):

正常使用原生mybatis即可

1、创建实体类

@data
public class{/*** 经度*/@TableField(exist = false)private double x;/*** 纬度*/@TableField(exist = false)private double y;
}

2、数据库创建坐标类型

 

3、mapper.xml新增和查询写法

 

     <insert id="addPoint">insert into gfa_point (point_name,point_addr,point_coor) values(#{gp.pointName},#{gp.pointAddr},ST_GeomFromText('POINT(${gp.x} ${gp.y})', 4326))</insert><select id="selectPage" resultMap="BaseResultMap">selectpoint_name,point_addr,ST_X(point_coor) x,ST_Y(point_coor) yfromgfa_point;</select>

设计表时对于坐标类型使用三个字段,double x ,double y, POINT p;在插入时Point需要特殊处理一下,sql语句使用x y 加上拼接就可以插入进去;查询时不需要查POINT类型,直接查x y就可以返回坐标值,计算时使用POINT类型字段:

INSERT INTO test1 (name, geom) VALUES ('Point A', ST_GeomFromText('POINT(116.40 39.90)', 4326));INSERT INTO test1 (name, geom) VALUES ('Point bA',ST_SetSRID(ST_MakePoint(-122.3493, 47.6205), 4326));

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

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

相关文章

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定

《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者&#xff0c;在游戏开发和维护过程中&#xff0c;我们经常会遇到各种运行时错误和系统报错。今天&#xff0c;我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…

华为HarmonyOS 让应用快速拥有账号能力 -- 3 获取用户手机号

场景介绍 当应用对获取的手机号时效性要求不高时&#xff0c;可使用Account Kit提供的手机号授权与快速验证能力&#xff0c;向用户发起手机号授权申请&#xff0c;经用户同意授权后&#xff0c;获取到手机号并为用户提供相应服务。以下只针对Account kit提供的手机号授权与快…

linux环境人大金仓数据库修改密码

1.进入人大金仓安装目录 cd /home/opt/Kingbase/ES/V9/Server/bin2.连接数据库 ./ksql -U system -d mydb -h 127.0.0.1 -p 54321-u 用户名 -d 数据库名 -h ip地址 -p 端口号 3.修改密码 ALTER USER system WITH PASSWORD 密码;

使用R语言进行美国失业率时空分析(包括绘图)

今天写一篇利用R语言&#xff0c;针对面板数据的简单分析与绘图。让我们直接开始把。 一、数据准备 这次的示例数据非常简单&#xff0c;只有一个shp格式的美国区县矢量数据&#xff0c;我们在QGIS中打开数据查看一下它的属性表。事实上我们需要的数据都在属性表的字段中。 二…

单片机几大时钟源

在单片机中&#xff0c;MSI、HSI和HSE通常指的是用于内部晶振配置的不同功能模块&#xff1a; MSI (Master Oscillator System Interface)&#xff1a;这是最低级的一种时钟源管理单元&#xff0c;它控制着最基本的系统时钟&#xff08;SYSCLK&#xff09;&#xff0c;一般由外…

前端开发 之 15个页面加载特效上【附完整源码】

文章目录 一&#xff1a;彩球环绕加载特效1.效果展示2.HTML完整代码 二&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 三&#xff1a;两个圆形加载特效1.效果展示2.HTML完整代码 四&#xff1a;半环加载特效1.效果展示2.HTML完整代码 五&#xff1a;音乐波动加载特效1.效…

Spring入园须知

序 聊 Spring&#xff0c;先从发展历史谈起&#xff0c;对整个生态有个大致认识&#xff0c;最后再看下 Spring 依赖的基础机制——IoC 和 AOP&#xff0c;就达到入门须知的目的了。毕竟 Spring 太大了&#xff0c;如果把话题扯得太宽泛太细节&#xff0c;很可能会迷失在 Spri…

作品截图_

openstack project create --domain default --description "姓氏" xingopenstack user create --domain default --password-prompt --description "名字" mingziopenstack role create --description "姓名首字母" xmzopenstack role add --pr…

使用API管理Dynadot域名,设置默认域名服务器ip信息

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

聚合支付系统官方个人免签系统三方支付系统稳定安全高并发

系统采用fastadmin框架独立全新开发&#xff0c;安全稳定,系统支持代理、商户、码商等业务逻辑。 针对最近一-些JD&#xff0c;TB等业务定制&#xff0c;子账号业务逻辑API 非常详细&#xff0c;方便内置对接! 注意&#xff1a;系统没有配置文档很使用教程&#xff0c;不清楚…

vue结合canvas动态生成水印效果

在 Vue 项目中添加水印可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;使用 CSS 直接通过 CSS 的 background 属性实现水印&#xff1a; 实现步骤 在需要添加水印的容器中设置背景。使用 rgba 设置透明度&#xff0c;并通过 background-repeat 和 background-size…

S32K324 信息安全开发-Secure Debug原理及其实现

文章目录 前言Secure debug原理LC(Life Cycle)Application debug key/password (ADKP)固定密钥的实现方案一机一密实现方案AUTH_MODE的区别代码实现ADKP写入确认认证方式写入LC总结前言 车载信息安全对于MCU的要求越来越高,debug口作为直接刷写调试程序的通道,对其进行保护是…

iptables之地址转换

1、自定义链 iptables -N hello #在filter表中创建一个自定义链&#xff0c;链名hello,自定义链名可以任意大小写 iptables -E hello happy #修改自定义的链名 iptables -t filter -I happy -s 192.168.206.30 -p icmp -j REJECT #禁止192.168.206.30ping本机 自定义没有策略&a…

[241129] Docker Desktop 4.36 发布:企业级管理功能、WSL 2 增强 | Smile v4.0.0 发布

目录 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强Smile v4.0.0 发布&#xff01;Java 机器学习库迎来重大升级 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强 Docker Desktop 4.36 带来了强大的更新&#xff0c;简化了…

Linux信号集、信号的阻塞信号驱动

一、信号集 信号的三种方式&#xff0c;即使是忽略&#xff0c;也仍然打断了进程的进行&#xff08;相当于是捕捉了信号&#xff0c;执行的了空函数什么都没做&#xff09;&#xff0c;可如果在访问重要资源时不希望被打断呢&#xff1f; 可以用阻塞&#xff0c;即产生了信号却…

什么是内网什么是外网?区别是什么

内网和外网是计算机网络中的两个基本概念&#xff0c;它们在定义、特点和使用场景上有显著的区别。‌虎观代理小二将带大家详细了解内网与外网的定义以及它们之间的主要差异&#xff0c;帮助读者更好地理解和应用这两种网络。 内网&#xff08;局域网&#xff0c;LAN&#xff0…

如何在 Spring Cloud 集成 Micrometer Tracing?

1.什么是 Micrometer Tracing&#xff1f; Micrometer Tracing 是一个用于微服务架构的追踪库&#xff0c;它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息。它是 Micrometer 库的一部分&#xff0c;Micrometer 是一个用于应用程序监控的指标收集工具…

爬虫专栏第五篇:Python BeautifulSoup 库全解析:从解析器到网页数据爬取实战

简介&#xff1a;本文围绕 Python 的 BeautifulSoup 库展开&#xff0c;介绍了其安装方式&#xff0c;详细解析了各类解析器&#xff08;如标准库、lxml 库、xml 库、html5lib 等&#xff09;的特点与作用&#xff0c;并通过代码案例展示不同解析器在实际应用中的表现。同时&am…

架构06-分布式共识

零、文章目录 架构06-分布式共识 1、分布式共识 &#xff08;1&#xff09;基本概念 **分布式共识&#xff1a;**在分布式系统中&#xff0c;多个节点之间达成一致的过程。**复杂性来源&#xff1a;**网络的不可靠性和请求的并发性。**应用场景&#xff1a;**如何确保重要数…

linux基础病毒编写

linux目录介绍 /bin二进制可执行命令/etc系统管理和配置文件/etc/rc.d启动的配置文件和脚本 /home用户主目录的基点/lib标准程序设计库&#xff0c;又叫动态链接共享库 /sbin超级管理命令&#xff0c;这里存放的是系统管理员使用的管理程序 /tmp公共的临时文件存储点 /root系统…