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 40Java解析以上结构,为了便于理解我们逐个字节解析(实际应用中不会这样解析,具体参考最后的源码)
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);
源码参考: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