MultiLine是由多个线段组成的几何对象,在GIS中通常用于表示复杂路径、网络或管道等线状地物,例如公路、铁路、河流等。MultiLine可以通过对每个线段的起点和终点进行连接而形成一个连续的路径或网络。在空间分析和处理过程中,可以使用MultiLine来计算路径长度、方向、交通流量等信息。在MySQL 8.0中,MultiLine是由多个LineString对象组合而成的,每个LineString都是由多个点构成的有序列表,并且相邻两个点之间构成一条线段。

在mysql中的存储格式
头部(Header):
SRID
字节顺序(Byte Order):表示二进制数据的字节顺序,通常为大端序(Big Endian)或小端序(Little Endian)。
类型标识符(Type Identifier):标识几何对象的类型,对于多点(MULTILINESTRING)来说,它的值是十进制5。
线数量(Number of Lines):表示线的数量
第0条线的字节顺序
第0条线的类型标识符
第0条线的点数量
第0条线 第0个点x
第0条线 第0个点y
第0条线 第1个点x
第0条线 第个点y
....
第1条线的字节顺序
第1条线的类型标识符
第1条线的点数量
第1条线 第0个点x
第1条线 第0个点y
第1条线 第1个点x
第1条线 第个点y
...

两条线段,每条线段3个点
MULTILINESTRING((120 36.1, 120 36.2, 120 36.3), (121 36.1, 121 36.2, 121 36.3))
byte[127]
00 00 00 00, 01, 05 00 00 00, 02 00 00 00,
01, 02 00 00 00, 03 00 00 00, 00 00 00 00 00 00 5E 40(x), CD CC CC CC CC 0C 42 40(y), 00 00 00 00 00 00 5E 40, 9A 99 99 99 99 19 42 40, 00 00 00 00 00 00 5E 40, 66 66 66 66 66 26 42 40,
01, 02 00 00 00, 03 00 00 00, 00 00 00 00 00 40 5E 40(x), CD CC CC CC CC 0C 42 40(y), 00 00 00 00 00 40 5E 40, 9A 99 99 99 99 19 42 40, 00 00 00 00 00 40 5E 40, 66 66 66 66 66 26 42 40

component        size(起-止)   decimal       hex
SRID              4(0-3)       0            00 00 00 00
Byte order        1(4-4)       1            01
WKB type          4(5-8)       5            05 00 00 00
line count       4(9-12)       2            02 00 00 00
Byte order      1(13-13)       1            01(第0条)
WKB type        4(14-17)       1(line)      02 00 00 00(好像也没别的值可选,有点多余)
point count     4(18-21)       3            03 00 00 00(第0条线段3个点)
X(经度)          8(22-29)      120           00 00 00 00 00 00 5E 40
Y(纬度)          8(30-37)      36.1          CD CC CC CC CC 0C 42 40
X(经度)          8(38-45)      120           00 00 00 00 00 00 5E 40
Y(纬度)          8(46-53)      36.2          9A 99 99 99 99 19 42 40
X(经度)          8(54-61)      120           00 00 00 00 00 00 5E 40
Y(纬度)          8(62-69)      36.3          66 66 66 66 66 26 42 40
Byte order      1(70-70)       1            01(第1条)
WKB type        4(71-74)       1(line)      02 00 00 00(好像也没别的值可选,有点多余)
point count     4(75-79)       3            03 00 00 00(第0条线段3个点)
X(经度)          8(80-87)      121           00 00 00 00 00 40 5E 40
Y(纬度)          8(88-95)      36.1          CD CC CC CC CC 0C 42 40
X(经度)          8(96-103)     121           00 00 00 00 00 40 5E 40
Y(纬度)          8(104-111)    36.2          9A 99 99 99 99 19 42 40
X(经度)          8(112-119)    121           00 00 00 00 00 40 5E 40
Y(纬度)          8(120-127)    36.3          66 66 66 66 66 26 42 

Java解析以上结构,为了便于理解我们逐个字节解析(实际应用中不会这样解析,具体参考最后的源码)


boolean bigEndian = (bytes[4] == 0x00);
//线数量
int index = 9;
int line_count = NumberUtil.byte2int(bytes, index, 4, bigEndian);
index+=4;
List<Line> lines = new ArrayList<>();
for(int l=0; l<line_count; l++){
	//跳过 byte order(1位)和 WKB type(4位)
	index += 5;
	//当前线段点数量
	int point_count = NumberUtil.byte2int(bytes, index, 4, bigEndian);
	index += 4;
	List<Point> points = new ArrayList<>();
	for(int p=0; p<point_count; p++){
		double x = NumberUtil.byte2double(bytes, index);
		index+=8;
		double y = NumberUtil.byte2double(bytes, index);
		index+=8;
		Point point = new Point(x, y);
		points.add(point);
	}
	Line line = new Line(points);
	lines.add(line);
}
MultiLine multiLine = new MultiLine(lines);

源码参考:http://gitee.com/anyline/anyline/blob/master/anyline-data-jdbc-dialect/anyline-data-jdbc-mysql/src/main/java/org/anyline/data/jdbc/mysql/MySQLGeometryAdapter.java