mybatis类型转换器处理MYSQL数据库geometry类型转换

本文的解决方案是在mybatis类型转换器处理Postgis的方案基础上更改的,使用mysql5.7+版本。

mybatis类型转换器处理PostGis数据库geometry类型转换_mybatis geometry-优快云博客

首先需要确定在mysql中geometry类型数据的存储格式,输入输出格式。在Postgis中的geometry存储格式,输入输出格式。

1.Postgis的geometry格式与mysql的geometry格式联系

1.1postgis的geometry格式

在Postgis官方文档说明了,OGC SFA specifications这套规范定义了WKB数据只支持2D数据,不支持3D数据,不支持坐标系数据。在OGC SFA specification 1.2.1 (which aligns with the ISO 19125 standard)这个标准中定义了3D数据,但是不支持坐标数据。

EWKB作为一种WKB格式的扩展,支持3D数据格式、测量坐标数据measured coordinates(XYZM)和SRID坐标数据(M坐标为监测值,可看成第4维)。(注意EWKB的3D格式扩展方式和OGC SFA specification 1.2.1中的3D格式扩展 OGC WKB不一样)。Postgis的几个类型底层存储的是EWKB格式。Postgis输入格式支持EWKB二进制格式,或者EWKB和EWKT文本格式。输出格式为二进制EWKB或文本格式HEXEWKB。

 EWKB的扩展类型标志位代表的含义(BIG_ENDIAN),分别是Z,M,SRID的标志位。本文转换默认SRID标志位存在。Well-Known Binary (WKB) | GEOS

WKT数据{"type":"Point","coordinates":[115.79504,33.867779]}对应

WKB数据0101000000C2C073EFE1F25C40EA93DC6113EF4040

EWKB数据字节0101000020E6100000C2C073EFE1F25C40EA93DC6113EF4040

WKB第一个字节01代表了字节顺序,01代表LITTLE_ENDIAN;再后面4个字节代表了几何类型,这里01000000(LITTLE_ENDIAN)代表了类型1是Point类型。EWKB与WKB在这4个字节中的前3个字节含义一样,第4个字节通过字节or操作可代表4维数据XYZM(注意这里是(LITTLE_ENDIAN情况,BIG_ENDIAN情况相反)。

EWKB又在之后的插入4个字节代表SRID坐标。 

在Postgis实现org.locationtech.jts.io.WKBWriter源码中也能找出对应解析方式。

1.2mysql的geometry格式

mysql官方文档说明了mysql的geometry类型是在WKB前面加了4个字节表明SRID坐标。

WKT数据{"type":"Point","coordinates":[115.79504,33.867779]}对应

WKB数据0101000000C2C073EFE1F25C40EA93DC6113EF4040

Mysql的WKB数据字节E61000000101000000C2C073EFE1F25C40EA93DC6113EF4040

 通过抓包分析可知Mysql的输出格式是Mysql扩展的WKB格式。

1.3mysql的geometry格式与postgis的geometry格式转换

如果需要Geotools包来解析mysql的WKB格式,首先需要将mysql的WKB转换EWKB。

可以看出mysql的geometry格式和postgis的geometry格式都是在WKB基础上改造的。

postgis支持3D,mysql只支持2D,所以EWKB数据类型包括Mysql扩展的WKB数据类型。通过以上分析只需要将坐标位的顺序和类型位转换,就能将EWKB和Mysql扩展的WKB互相转换。

2.1代码实现

Mysql官方文档中提供许多操作geometry类型的函数,一个简单的思路可以是调用ST_GeomFromText转换函数,将WKT转换为Mysql扩展的WKB格式。

本文实现直接向Mysql发送二进制WKB数据。

通过查询mysql官方文档发送二进制数据需要添加introducer标识符,二进制的Introducers标识符是_binary,一般情况下sql语句只能发送字符流,在_binary后面可以输入二进制流(上图中为'abc'对应的ascii,但一般ascii只能通过程序编程输入)。

2.1 java实现

(1)将Mysql扩展WKB与Postgis的EWKB格式互相转换,再调用geotools工具解析EWKB。其余大致实现类似mybatis类型转换器处理PostGis数据库geometry类型转换_mybatis geometry-优快云博客

(2)发送二进制方法需要调用mysql提供的JDBC驱动,其提供了一些操作二进制的方法。

2.1.1 MYSQL的JDBC驱动操作二进制部分源码分析

大致思路是

(1).调用com.mysql.cj.jdbc.ClientPreparedStatement#setBlob(int, java.io.InputStream)方法,底层调用com.mysql.cj.ClientPreparedQueryBindings#setBinaryStream(int, java.io.InputStream, int)方法。将二进制流设置到bindValues数组中,bindValues数组代表数据库的字段。

(2).在mabtis调用org.apache.ibatis.executor.statement.PreparedStatementH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值