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提供的手机号授权与快…

shodan(3)

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

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 密码;

C++中protobuf Message与JSON的互相转换

C中protobuf Message与JSON的互相转换 环境&#xff1a; protobuf: v27.3(2024-08-01) abseil: 20240722.0文章目录 C中protobuf Message与JSON的互相转换前言1. 编写通讯录addressbook.proto2. 编译3. C中测试protobuf与json的转换4. 结果 前言 PB转JSON&#xff1a;Protoc…

使用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.效…

介绍常见的图片分类模型与算法

介绍常见的图片分类模型与算法 在机器学习和深度学习的领域中&#xff0c;图片分类任务是一个广泛的应用场景。随着深度学习技术的飞速发展&#xff0c;很多强大的图像分类算法和模型已经被提出&#xff0c;广泛应用于从医疗影像到自动驾驶、从人脸识别到图像检索等多个领域。…

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;包括域名邮箱&…

【Python】深入探索Python类型检查:掌握 `typing` 模块的高级用法

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着代码复杂度的增加,类型安全性在现代开发中变得尤为重要。Python自3.5引入类型提示(type hints),为开发者提供了静态类型检查的能力,而typing模块则是这一系统的核心。本篇文章深入研究Python的类型提示及…

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

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

nginx配置笔记

前言 nginx官方文档: https://nginx.org/en/docs/openresty官方文档: https://github.com/openresty/lua-nginx-module一、配置 1. 配置实例 1.1. 80端口转443 server {listen 80 default_server;listen [::]:80 default_server;rewrite ^ https://$http_host$request_uri?…

数字图像稳定DIS介绍目录

之前用OpenCV做过防抖&#xff0c;OpenCV处理时&#xff0c;先处理一遍&#xff0c;再输出视频。二者相差还是挺大的。 前 言.......................................................................................................................................... …

C++动态内存管理 之一

C动态内存管理 之一 std::uninitialized_copystd::uninitialized_movestd::uninitialized_default_construct std::uninitialized_copy template< class InputIt, class NoThrowForwardIt > NoThrowForwardIt uninitialized_copy( InputIt first, InputIt last, NoThrow…

Leetcode62. 不同路径(HOT100)

链接 我的代码&#xff1a; class Solution { public:int uniquePaths(int m, int n) {if(m<1||n<1)return 1;vector<vector<int>> dp(m,vector<int>(n));for(int i 0;i<m;i){for(int j 0;j<n;j){if(!i&&!j)dp[i][j] 0;else if(!i|…

如何使用Apache HttpClient发送带有基本认证的HTTP请求

Apache HttpClient 是一个多功能且强大的Java库&#xff0c;用于处理HTTP请求。 它支持多种认证机制&#xff0c;包括基本认证&#xff08;Basic Authentication&#xff09;。 基本认证是一种简单的认证方案&#xff0c;内置在HTTP协议中&#xff0c;使用用户名和密码来验证…

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

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