码农知识堂 - 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) 从低端写入 (不大确定)

  • 相关阅读:
    CANdelaStudio-从入门到深入到实践目录
    【前端】html+css案例:品优购 代码存档
    『无为则无心』Python日志 — 67、logging日志模块处理流程
    require、loadfile、dofile、load、loadstring
    【ArcGIS Pro二次开发】(71):添加图层名称和路径到字段
    c语言:十进制转任意进制
    Python 教程之 Numpy—— 数据类型对象
    大数据技术栈常见错误总结(更新中)
    矩阵乘积知识
    使用docker部署dubbo项目
  • 原文地址:https://blog.csdn.net/bianfu2008zhi/article/details/126656990
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号