mysql中geometry字段的查询和保存

2023-11-19

有段时间为了追求效率,把用es相关的地理位置功能都去掉了,使用mysql已有的geometry的功能做地理位置,mybatis这块

@TableName(value = "t_event_info",autoResultMap = true)
如果使用复杂的数据结构,json,有两个方式
1、使用xml的是要 resultMap
2、没有使用xml的 必须配置autoResultMap=true

地理相关的函数https://dev.mysql.com/doc/refman/8.0/en/spatial-function-reference.html
姓名 描述 介绍
GeomCollection() 从几何构造几何集合
GeometryCollection() 从几何构造几何集合
LineString() 从点值构造 LineString
MBRContains() 一个几何的 MBR 是否包含另一个几何的 MBR
MBRCoveredBy() 一个 MBR 是否被另一个覆盖
MBRCovers() 一个 MBR 是否覆盖另一个
MBRDisjoint() 两个几何的 MBR 是否不相交
MBREquals() 两个几何的 MBR 是否相等
MBRIntersects() 两个几何的 MBR 是否相交
MBROverlaps() 两个几何的 MBR 是否重叠
MBRTouches() 两个几何的 MBR 是否接触
MBRWithin() 一个几何的 MBR 是否在另一个几何的 MBR 内
MultiLineString() 从 LineString 值构造 MultiLineString
MultiPoint() 从点值构造多点
MultiPolygon() 从 Polygon 值构造 MultiPolygon
Point() 从坐标构造点
Polygon() 从 LineString 参数构造多边形
ST_Area() 返回多边形或多多边形区域
ST_AsBinary(), ST_AsWKB() 从内部几何格式转换为 WKB
ST_AsGeoJSON() 从几何生成 GeoJSON 对象
ST_AsText(),ST_AsWKT() 从内部几何格式转换为 WKT
ST_Buffer() 返回几何给定距离内的点的几何
ST_Buffer_Strategy() 为 ST_Buffer() 生成策略选项
ST_Centroid() 将质心作为一个点返回
ST_Collect() 将空间值聚合到集合中 8.0.24
ST_Contains() 一个几何图形是否包含另一个几何图形
ST_ConvexHull() 返回几何的凸包
ST_Crosses() 一个几何图形是否与另一个几何图形相交
ST_Difference() 两个几何形状的返回点集差异
ST_Dimension() 几何尺寸
ST_Disjoint() 一个几何图形是否与另一个几何图形脱节
ST_Distance() 一个几何体与另一个几何体的距离
ST_Distance_Sphere() 地球上两个几何图形之间的最小距离
ST_EndPoint() 线串的终点
ST_Envelope() 返回几何的 MBR
ST_Equals() 一个几何图形是否等于另一个几何图形
ST_ExteriorRing() 返回 Polygon 的外环
ST_FrechetDistance() 一个几何体与另一个几何体的离散 Fréchet 距离 8.0.23
ST_GeoHash() 产生一个geohash值
ST_GeomCollFromText(), ST_GeometryCollectionFromText(), ST_GeomCollFromTxt() 从 WKT 返回几何集合
ST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB() 从 WKB 返回几何集合
ST_GeometryN() 从几何集合中返回第 N 个几何
ST_GeometryType() 返回几何类型的名称
ST_GeomFromGeoJSON() 从 GeoJSON 对象生成几何
ST_GeomFromText(), ST_GeometryFromText() 从 WKT 返回几何图形
ST_GeomFromWKB(),ST_GeometryFromWKB() 从 WKB 返回几何图形
ST_HausdorffDistance() 一个几何体与另一个几何体的离散豪斯多夫距离 8.0.23
ST_InteriorRingN() 返回 Polygon 的第 N 个内环
ST_Intersection() 返回点集两个几何的交集
ST_Intersects() 一个几何图形是否与另一个几何图形相交
ST_IsClosed() 几何是否封闭且简单
ST_IsEmpty() 几何是否为空
ST_IsSimple() 几何是否简单
ST_IsValid() 几何是否有效
ST_LatFromGeoHash() 从 geohash 值返回纬度
ST_Latitude() 返回Point的纬度 8.0.12
ST_Length() LineString 的返回长度
ST_LineFromText(),ST_LineStringFromText() 从 WKT 构造 LineString
ST_LineFromWKB(),ST_LineStringFromWKB() 从 WKB 构造 LineString
ST_LineInterpolatePoint() 沿 LineString 的给定百分比的点 8.0.24
ST_LineInterpolatePoints() 沿 LineString 的给定百分比的点 8.0.24
ST_LongFromGeoHash() 从 geohash 值返回经度
ST_Longitude() 返回Point的经度 8.0.12
ST_MakeEnvelope() 围绕两个点的矩形
ST_MLineFromText(), ST_MultiLineStringFromText() 从 WKT 构造 MultiLineString
ST_MLineFromWKB(),ST_MultiLineStringFromWKB() 从 WKB 构造 MultiLineString
ST_MPointFromText(),ST_MultiPointFromText() 从 WKT 构造多点
ST_MPointFromWKB(),ST_MultiPointFromWKB() 从 WKB 构造多点
ST_MPolyFromText(),ST_MultiPolygonFromText() 从 WKT 构造 MultiPolygon
ST_MPolyFromWKB(),ST_MultiPolygonFromWKB() 从 WKB 构造 MultiPolygon
ST_NumGeometries() 返回几何集合中的几何数
ST_NumInteriorRing(),ST_NumInteriorRings() 返回 Polygon 中的内环数
ST_NumPoints() 返回 LineString 中的点数
ST_Overlaps() 一个几何图形是否与另一个几何图形重叠
ST_PointAtDistance() 沿 LineString 给定距离的点 8.0.24
ST_PointFromGeoHash() 将 geohash 值转换为 POINT 值
ST_PointFromText() 从 WKT 构造点
ST_PointFromWKB() 从 WKB 构造点
ST_PointN() 从 LineString 返回第 N 个点
ST_PolyFromText(), ST_PolygonFromText() 从 WKT 构造多边形
ST_PolyFromWKB(),ST_PolygonFromWKB() 从 WKB 构造多边形
ST_Simplify() 返回简化几何
ST_SRID() 返回几何的空间参考系统 ID
ST_StartPoint() 线串的起点
ST_SwapXY() 交换 X/Y 坐标的返回参数
ST_SymDifference() 返回点设置两个几何的对称差
ST_Touches() 一个几何图形是否接触另一个几何图形
ST_Transform() 变换几何坐标 8.0.13
ST_Union() 返回点集两个几何的并集
ST_Validate() 返回经过验证的几何图形
ST_Within() 一个几何体是否在另一个几何体中
ST_X() 返回Point的X坐标
ST_Y() 返回Point的Y坐标

geometry的类型

MySQL 具有对应于 OpenGIS 类的空间数据类型。

一些空间数据类型包含单个几何值:

  • GEOMETRY

  • POINT

  • LINESTRING

  • POLYGON

GEOMETRY可以存储任何类型的几何值。其他单值类型(POINT、 LINESTRINGPOLYGON)将它们的值限制为特定的几何类型。

其他空间数据类型包含值的集合:

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

GEOMETRYCOLLECTION可以存储任何类型的对象的集合。其他集合类型(MULTIPOINT、 MULTILINESTRING和 MULTIPOLYGON)将集合成员限制为具有特定几何类型的成员。

  • Well-Known Text (WKT) format 文本

  • Well-Known Binary (WKB) format 二进制

    domain

     @TableField(value = "main_geo",typeHandler = GeometryTypeHandler.class)
     private String mainGeo;

    handler
     

    @Slf4j
    @MappedTypes(value = {String.class})
    public class GeometryTypeHandler extends BaseTypeHandler {
    
        @Override
        public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
            WKTReader wktReader= SpringUtil.getBean(WKTReader.class);
            try {
            Geometry pointGeo = wktReader.read(o.toString());
            WKBWriter wkbWriter= SpringUtil.getBean(WKBWriter.class);
            byte[] writer = wkbWriter.write(pointGeo);
            byte[] wkb=new byte[writer.length+4];
            ByteOrderValues.putInt(4326, wkb, ByteOrderValues.LITTLE_ENDIAN);
            System.arraycopy(writer,0,wkb,4,writer.length);
            preparedStatement.setBytes(i, wkb);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    /**
     * 获取jts包对象的wkt文本,再转换成sqlserver的Geometry对象
     * 调用ps的setBytes()方法,以二进制持久化该geometry对象
    
     */
    
        @Override
    
        public String getNullableResult(ResultSet resultSet, String s) {
    
            try {
    /**
     * 从ResultSet中读取二进制转换为SqlServer的Geometry对象
     * 使用jts的WKTReader将wkt文本转成jts的Geometryd对象
     */
                WKBReader wkbReader= SpringUtil.getBean(WKBReader.class);
                byte[] bytes = resultSet.getBytes(s);
                byte[] bytesN = new byte[bytes.length-4];
                System.arraycopy(bytes,4,bytesN,0,bytes.length-4);
                Geometry geometry = wkbReader.read(bytesN);
                return geometry.toText();
            } catch (Exception e) {
                log.error(e.getMessage());
            }
            return null;
        }
    
        @Override
        public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
            return null;
        }
    
        @Override
        public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
            return null;
        }

    工具类申明
     

    @Component
    @ComponentScan(value = {"cn.hutool.extra.spring"})
    @Import(SpringUtil.class)
    public class JTSBean {
    
        private GeometryFactory geometryFactory;
    
        public JTSBean() {
            geometryFactory = new GeometryFactory(new PrecisionModel(), 4326);
        }
    
        @Bean
        public WKBWriter wkbWriter() {
            return new WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN);
        }
    
        @Bean
        public WKBReader wkbReader() {
            return new WKBReader(geometryFactory);
        }
    
        @Bean
        public WKTReader wktReader() {
            return new WKTReader(geometryFactory);
        }
    }

    有两点注意,
    1、整数 SRID (0) 的 4 个字节的值 必须与GeometryFactory声明的一致
    2、WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN) 从低端写入 (不大确定)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql中geometry字段的查询和保存 的相关文章

  • 如何在 WP_Query 中按日期排序?

    我已经尝试过这种方式但是orderby and order不适用于 WP Query 类 posts new WP Query array post type gt block code orderby gt post date order
  • PHP 中的异步数据库/服务调用:Gearman 与 pthreads

    在我们的 LAMP 站点上 我们遇到一些服务必须多次调用数据库才能提取数据的问题 通常在 PHP 中完成此操作的方式 至少我的经验 是串行的 这显然是低效的 我们可以通过使用缓存和聚合一些查询来缓解一些低效率的问题 但在某些情况下我们仍然需
  • 在mysql中搜索“SanF”时获取旧金山的记录

    当我搜索 SanF 时获得 San Francisco 记录 SELECT FROM table WHERE col LIKE san Works SELECT FROM table WHERE col LIKE san F Works S
  • 物理写入文件已满 - mysql 错误

    我正在使用xampp 每次启动mysql时 我都会在xampp中收到以下错误 Error MySQL shutdown unexpectedly 13 16 14 mysql This may be due to a blocked por
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • 更新重复密钥上的复合密钥 [重复]

    这个问题在这里已经有答案了 我需要更新新行 如果两者都满足 date dat and empId who 作为复合键 但如果其中之一或两者不同 则插入 sql INSERT INTO history SET endtimestamp now
  • 基本表创建 fpdf

    我找不到使用 fpdf 制作表格并从 mysql 数据库获取数据的合适教程 我只是想知道如何创建一个 我在网上尝试示例时遇到了很多错误 例如 我有 名字 中间名 姓氏 年龄 和 电子邮件 列 如何使用 fpdf 创建表格并回显数据库中的条目
  • PHP 的 PDO 可以限制为单个查询吗?

    PHP 的 PDO 允许通过 query 方法或作为准备好的语句同时执行多个查询 以下两个示例均有效 Two SQL queries query SELECT FROM table DROP table Execute via query
  • 如何在 join 语句中进行计数

    我有桌子post int post id varchar title text content和表comment int comment id int post id varchar content其中 post id 是外键引用表帖子 如
  • Laravel Group By 和 Order By 不起作用

    我尝试制作一个Laravel 5 8项目 项目中的数据是这样的 id purch name prcvalue 1 10234 Nabila 100 2 10234 Nadeera 450 3 10234 Nabila 540 4 10234
  • 如何使用 PHP 获取列中的所有值?

    我一直在到处寻找这个问题 但仍然找不到解决方案 如何从 mySQL 列中获取所有值并将它们存储在数组中 例如 表名称 客户 列名称 ID 名称 行数 5 我想获取此表中所有 5 个名称的数组 我该如何去做呢 我正在使用 PHP 我试图 SE
  • 如何解决 MySQL innodb 在 TRUNCATE TABLE 上“等待表元数据锁”?

    在 GitLab CI 服务器中运行包含数百个应用程序单元测试的测试套件 运行 10 次测试后 不知怎的 它总是卡在等待 TRUNCATE TABLE 上的表元数据锁上 这是一个拆卸步骤 我知道SHOW ENGINE INNODB STAT
  • 在JavaFX中如何在表视图中添加带有数据的组合框

    我已经尝试了很多 但无法将数据库中的所有值填充到我的组合框表格单元格中 控制器 java public class controller GetConnection gc new GetConnection PreparedStatemen
  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • 如何在数据库中保存未来(!)日期

    这个问题专门涉及未来的日期和时间 对于过去的值 UTC 无疑是首选 我想知道是否有人对拯救生命的 最佳 方法有建议futureMySQL 数据库中的日期和时间 或者就此而言一般来说 特别是在该列可以保存不同时区时间的情况下 考虑到时区规则可
  • MySQL:空间查询查找纬度/经度点是否位于给定边界内

    我正在研究谷歌地图搜索功能 其目的是找出 地理位置 点是否位于多边形内 如下图所示 我使用带有 Spatial 扩展的 mysql 5 6 20 我知道它内置有用的几何函数 因此我可以直接从数据库查询地理编码位置 我的目的是熟悉地理空间函数
  • PHP + MySQL 队列

    我需要一个充当队列的简单表 我的 MySQL 服务器限制是我不能使用 InnoDB 表 只能使用 MyISAM 客户 工人将同时工作 他们每次都需要接受不同的工作 我的想法是执行以下操作 伪代码 job lt SELECT FROM que
  • 未知的表引擎“InnoDB”

    最近 我发现如果我有好的硬件 我可以最大限度地提高 mysql 的性能 由于我一直在使用 InnoDB 所以我在 my ini 中添加了额外的配置 以下是新添加的配置 innodb data file path ibdata1 10M au
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 安装后步骤未成功完成 MySQL Mac OS Sierra

    pyEnv Anants MacBook Pro litibackend anantchandra brew postinstall mysql gt Postinstalling mysql gt usr local Cellar mys

随机推荐

  • Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示

    一 当我们用Python matplot时作图时 一些数据需要以百分比显示 以更方便地对比模型的性能提升百分比 二 借助matplotlib ticker FuncFormatter 将坐标轴格式化 例子 encoding utf 8 im
  • C语言:整型在内存中的存储及表示形式(附习题)

    我们都知道 一个变量的创建是要在内存中开辟空间的 而空间的大小是根据不同的类型而决定的 那么数据在开辟空间中是如何存储的呢 首先我们先了解以下概念 一 整数的表示形式 原码 反码 补码 计算机中的整数有三种表示方法 即原码 反码和补码 三种
  • Unity 使用LineRenderer连接2个物体

    1 在Hierarchy面板中创建2个GameObject A和B 这就是希望连接的2个物体 2 同理创建1个EmptyObject C 挂上LineRenderer组件 记得给Materials赋值 3 创建1个新的C 脚本LineMan
  • jenkins解决不能打印springboot启动日志问题

    背景 已经可以在jenkins打包部署 但不能显示springboot启动日志 导致springboot启动报错时 并不知道具体原因 还需要登录linux系统去查看原因 主要步骤 1 开启远程服务器日志 2 利用sed命令 结束tail命令
  • String类

    下面是关于String类1相关的知识点 关于Java JDK 中内置的一个类 java lang String 1 String表示字符串类型 属于引用数据类型 不属于基本数据类型 2 在java 中随便使用双引号括起来的都是String对
  • 计算机领域中随处可见的抽象

    想要管理多种具体的东西 那么需要遵守每种东西的规范 如果想要提供一种通用模式来对这些具体的东西统一管理 需要使用一种古老的技术 抽象 抽象是将多种具体的东西 管理时需要遵守的规范 的共同点抽取出来 放入到更高一层的抽象层 在抽象层不定义或少
  • unix环境高级编程——文件IO

    本期主题 unix环境高级编程 文件IO 文件IO 0 引言 1 文件描述符 2 IO编程中常用的API接口 1 open函数 2 close函数 3 read函数 4 write函数 5 lseek函数 3 函数sync fsync和fd
  • 51单片机中断详解(上)

    一 中断的概念 中断发生 CPU在处理某一事件A时 发生了另一事件B请求CPU迅速去处理 中断响应和中断服务 CPU暂时中断当前的工作 转去处理事件B 中断返回 待CPU将事件B处理完毕后 再回到原来事件A被中断的地方继续处理事件A 这一过
  • pgpool-II常见错误

    持续更新中 1 pg hba中的项不匹配 假设您的pgpool集群中有2个节点 您更新了其中一个节点中的pg hba conf条目 但忘记在其他节点上应用相同的条目 您会看到如下错误 psql d postgres U postgres h
  • 在Linux下编译micropython源码的方法(包括win10的ubuntu子系统)

    本文介绍了在Linux下编译micropython源码的方法 包括了虚拟机 win10子系统等 在Win10的应用商店中 提供了Linux的子系统 这是实际上是一个虚拟机软件 与virtualbox和vmplayer功能类似 下面就介绍在L
  • C语言 宏定义

    一 预备知识 一个项目可以通过 编译 链接最终形成一个可执行文件 每个源文件 cpp 都会单独编译 编译成一个目标文件 o 也可能是 obj 扩展名跟操作系统有关 然后系统把这些 o文件进行链接 最终形成一个可执行文件 编译做的事 词法 语
  • charles及弱网测试

    安装 安装完成后 charles gt help gt register 输入注册信息 Registered Name https zhile io License Key 48891cf209c6d32bf4 相关配置 1 安装根证书 h
  • 【华为OD机试】阿里巴巴找黄金宝箱(V)(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 跨时钟域电路设计——结绳法

    信号从快时钟域到慢时钟域过渡时 慢时钟可能无法对快时钟变化太快的信号进行采样 之前的同步器法对两个时钟间的关系有要求 结绳法适用于任何时钟域之间的过渡 结绳法的原理是将快时钟信号的脉冲周期延长 等到慢时钟周期采样后再 解绳 还原为原来的脉冲
  • Java 基础系列(十六) --- Java中模板引擎的使用

    模板引擎 1 关于动态页面的渲染 2 非模板引擎的弊端 3 模板引擎 3 1 什么是模板引擎 3 2 Thymeleaf 语法 3 3 模板引擎的使用 4 总结 1 关于动态页面的渲染 渲染就是把数据和页面进行结合起来 主要分为服务器渲染和
  • Vue3 集成 UEditor puls 富文本编辑器

    一 前端配置 1 下载代码https gitee com modstart lib ueditor plus tree master 2 解压压缩包 如下图 3 拿到dist文件夹的内容 重命名为UEditor 并将其复制到vue项目的pu
  • 未找到esUtil_win32.c 您需要查找 esUtil_win32.c 以通过查看源来确定当前调用堆栈帧

    前言 在调试OPENGL ES 3 0编程指南 原书第2版 中文版 pdf 中第8章的例子报错 在调试时 发现 esUtil win32 c文件中的代码 如下 if esMain esContext GL TRUE return 1 这里r
  • 如何零基础自学c/c++语言?

    现在零基础学习C C 无非就两种方法 一种是自学还有 一种就是报班学习 关于报班学习在这里就不多说了 那么今天就说怎么从零基础开始自学C C 编程吧 先学习C语言入门 那么问题来了 怎么去学习C语言呢 一开始肯定是要看书 这里推荐的入门书籍
  • scipy.stats的用法——常见的分布和函数

    介绍python统计函数库scipy stats中常见的分布和函数 commom distributions uniform norm poisson bernoulli expon lognorm norm t chi2 f commom
  • mysql中geometry字段的查询和保存

    有段时间为了追求效率 把用es相关的地理位置功能都去掉了 使用mysql已有的geometry的功能做地理位置 mybatis这块 TableName value t event info autoResultMap true 如果使用复杂