MULTIPOINT是MySQL中的一种几何类型,用于表示多个二维点的集合。一个MULTIPOINT对象可以包含多个POINT对象,每个POINT对象都有自己的坐标值。

WKT格式 MULTIPOINT((0, 0), (1, 1), (2, 3))


MULTIPOINT和LINESTRING虽然都是由多个点组成,但有着不同的特点和用途。
MULTIPOINT表示多个二维点的集合,每个点都是一个独立的对象,可以通过坐标值来描述其位置。而LINESTRING则表示由多个点组成的线段,这些点在空间上按照一定顺序连接起来,形成了一个连续的路径。
因此,MULTIPOINT和LINESTRING之间最大的区别在于它们所表示的空间对象不同。MULTIPOINT只是一组离散的点,没有任何连续性;而LINESTRING则是一条有方向、有长度、有起点和终点的线段。
在实际应用中,我们通常会使用LINESTRING来表示道路、河流等线性地物要素;而使用MULTIPOINT来表示商店、酒店等离散地物要素。同时,在进行空间查询时,也需要根据具体需求选择合适的几何类型进行查询操作。

其WKT格式类似
 LINESTRING(1 2, 5 6, 7 9) 
 MULTIPOINT((0, 0), (1, 1), (2, 3)) 也可以按LINESTRING格式写MULTIPOINT(0 0, 1 1, 2 2)
WKB格式可以通过头部标识来区分 
在mysql中的存储格式
头部(Header):
SRID
字节顺序(Byte Order):表示二进制数据的字节顺序,通常为大端序(Big Endian)或小端序(Little Endian)。
类型标识符(Type Identifier):标识几何对象的类型,对于多点(MULTIPOINT)来说,它的值是十进制4。
点数量(Number of Rings):表示Point的数量
第0个点的字节顺序
第0个点的类型标识符
第0个点的X
第0个点的Y
第1个点的字节顺序
第1个点的类型标识符
第1个点的X
第1个点的Y

MULTIPOINT(30 20, 25 25, 55 85)
byte[76]
00 00 00 00, 01, 04 00 00 00, 03 00 00 00,
(01, 01 00 00 00, 00 00 00 00 00 00 3E 40, 00 00 00 00 00 00 34 40),
(01, 01 00 00 00, 00 00 00 00 00 00 39 40, 00 00 00 00 00 00 39 40),
(01, 01 00 00 00, 00 00 00 00 00 80 4B 40, 00 00 00 00 00 40 55 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)       4(MultiPoint)04 00 00 00
points count     4(9-12)       3            03 00 00 00
Byte order      1(13-13)       1            01
WKB type        4(14-17)       1(point)     01 00 00 00(好像也没别的值可选,有点多余)
X(经度)          8(18-25)      30            00 00 00 00 00 00 3E 40
Y(纬度)          8(26-33)      20            00 00 00 00 00 00 34 40
Byte order      1(34-34)       1            01
WKB type        4(35-38)       1(point)     01 00 00 00
X(经度)          8(39-46)      25            00 00 00 00 00 00 39 40
Y(纬度)          8(47-54)      25            00 00 00 00 00 00 39 40
Byte order      1(55-55)       1            01
WKB type        4(56-59)       1(point)     01 00 00 00
X(经度)          8(60-67)      55            00 00 00 00 00 80 4B 40
Y(纬度)          8(68-75)      85            00 00 00 00 00 40 55 40
Java解析以上结构,为了便于理解我们逐个字节解析(实际应用中不会这样解析,具体参考最后的源码)
boolean bigEndian = (bytes[4] == 0x00);
//点数量
int index = 9;
int count = NumberUtil.byte2int(bytes, index, 4, bigEndian);
index+=4;
List<Point> points = new ArrayList<>();
for(int i=0; i<count; i++){
	//跳过 byte order(1位)和 WKB type(4位)
	index += 5;
	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);
}
MultiPoint multiPoint = new MultiPoint(points);

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