码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • mysql中geometry字段的查询和保存


    有段时间为了追求效率,把用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、 LINESTRING和POLYGON)将它们的值限制为特定的几何类型。

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

    • MULTIPOINT

    • MULTILINESTRING

    • MULTIPOLYGON

    • GEOMETRYCOLLECTION

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

    • Well-Known Text (WKT) format 文本

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

      domain

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

      handler
       

      1. @Slf4j
      2. @MappedTypes(value = {String.class})
      3. public class GeometryTypeHandler extends BaseTypeHandler {
      4. @Override
      5. public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
      6. WKTReader wktReader= SpringUtil.getBean(WKTReader.class);
      7. try {
      8. Geometry pointGeo = wktReader.read(o.toString());
      9. WKBWriter wkbWriter= SpringUtil.getBean(WKBWriter.class);
      10. byte[] writer = wkbWriter.write(pointGeo);
      11. byte[] wkb=new byte[writer.length+4];
      12. ByteOrderValues.putInt(4326, wkb, ByteOrderValues.LITTLE_ENDIAN);
      13. System.arraycopy(writer,0,wkb,4,writer.length);
      14. preparedStatement.setBytes(i, wkb);
      15. }catch (Exception e){
      16. e.printStackTrace();
      17. }
      18. }
      19. /**
      20. * 获取jts包对象的wkt文本,再转换成sqlserver的Geometry对象
      21. * 调用ps的setBytes()方法,以二进制持久化该geometry对象
      22. */
      23. @Override
      24. public String getNullableResult(ResultSet resultSet, String s) {
      25. try {
      26. /**
      27. * 从ResultSet中读取二进制转换为SqlServer的Geometry对象
      28. * 使用jts的WKTReader将wkt文本转成jts的Geometryd对象
      29. */
      30. WKBReader wkbReader= SpringUtil.getBean(WKBReader.class);
      31. byte[] bytes = resultSet.getBytes(s);
      32. byte[] bytesN = new byte[bytes.length-4];
      33. System.arraycopy(bytes,4,bytesN,0,bytes.length-4);
      34. Geometry geometry = wkbReader.read(bytesN);
      35. return geometry.toText();
      36. } catch (Exception e) {
      37. log.error(e.getMessage());
      38. }
      39. return null;
      40. }
      41. @Override
      42. public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
      43. return null;
      44. }
      45. @Override
      46. public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
      47. return null;
      48. }

      工具类申明
       

      1. @Component
      2. @ComponentScan(value = {"cn.hutool.extra.spring"})
      3. @Import(SpringUtil.class)
      4. public class JTSBean {
      5. private GeometryFactory geometryFactory;
      6. public JTSBean() {
      7. geometryFactory = new GeometryFactory(new PrecisionModel(), 4326);
      8. }
      9. @Bean
      10. public WKBWriter wkbWriter() {
      11. return new WKBWriter(2, ByteOrderValues.LITTLE_ENDIAN);
      12. }
      13. @Bean
      14. public WKBReader wkbReader() {
      15. return new WKBReader(geometryFactory);
      16. }
      17. @Bean
      18. public WKTReader wktReader() {
      19. return new WKTReader(geometryFactory);
      20. }
      21. }

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

  • 相关阅读:
    3.4 Swaps
    医院安全(不良)事件管理系统源代码(B/S架构):事件全程监管 质量持续改进
    【教师节特辑】做个教师节快乐照片墙吧
    Discuz!论坛程序安装+模板配置教程
    refseq数据库的特点_eureka如何剔除服务
    山西佳诺德:短视频有哪些类型
    十四天学会C++之第三天(数组和字符串)
    Leetcode 918. Maximum Sum Circular Subarray (单调队列好题)
    docker学习1
    [2023.09.26]: JsValue的转换体验与as关键字的浅析
  • 原文地址:https://blog.csdn.net/bianfu2008zhi/article/details/126656990
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号