什么是积分?
What is a Point?
我正在尝试使用空间数据类型,我发现与其他编程主题相比,这些类型在 Internet 上并没有被广泛理解。
我有一个 table,其中包含地图上的对象。理论上,坐标在任何方向上从 0,0 到无穷大。地图上的一个点不能有超过 1 个对象,所以我设计了 table 这样的:
CREATE TABLE `map_objects` (
`name` varchar(255) DEFAULT NULL,
`position` point NOT NULL,
`type` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`position`(25)),
SPATIAL KEY `position_2` (`position`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
到目前为止一切顺利,我可以使用空间扩展提供的各种几何函数 select 个对象,但我不太明白 Point
里面的内容,为什么是 25 个字节长的?令人惊讶的是,几乎没有任何地方记录它。我发现了一些我在另一个项目中使用的旧代码,我曾在其中获取二进制点并在我的应用程序逻辑中提取坐标(出于某种原因):
unpack('x/x/x/x/co/Lt/dlat/dlng', $point);
这告诉我前四个字节是空的,然后是一个字符,一个长整型和坐标的双精度数。我非常怀疑开头的字节实际上没有被使用,可能是我从中复制这段代码的那个字节不需要它们。不管是什么情况,我目前只需要知道坐标就可以 select 地图上的一个对象:
SELECT * FROM map_objects WHERE position = ST_GeomFromText('Point(1 1)')
这反过来应该是说除了坐标之外的所有字节在执行的时候都可以被MySQL生成,也就是说它们是无意义的?将它们放在 Point
列中有什么 点?
此外,理论上应该可以通过提供 25 个二进制字节并使用等于运算符来 select 一条记录,但我的尝试实际上失败了,我只得到空结果,为什么那?
For example, a WKB value that corresponds to POINT(1 -1)
consists of this sequence of 21 bytes, each represented by two hexadecimal digits:
0101000000000000000000F03F000000000000F0BF
Component | Size | Value
Byte order | 1 byte | 01
WKB type | 4 bytes | 01000000
X coordinate | 8 bytes | 000000000000F03F
Y coordinate | 8 bytes | 000000000000F0BF
大多数起始字节表明几何对象是 Point
。
我正在尝试使用空间数据类型,我发现与其他编程主题相比,这些类型在 Internet 上并没有被广泛理解。
我有一个 table,其中包含地图上的对象。理论上,坐标在任何方向上从 0,0 到无穷大。地图上的一个点不能有超过 1 个对象,所以我设计了 table 这样的:
CREATE TABLE `map_objects` (
`name` varchar(255) DEFAULT NULL,
`position` point NOT NULL,
`type` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`position`(25)),
SPATIAL KEY `position_2` (`position`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
到目前为止一切顺利,我可以使用空间扩展提供的各种几何函数 select 个对象,但我不太明白 Point
里面的内容,为什么是 25 个字节长的?令人惊讶的是,几乎没有任何地方记录它。我发现了一些我在另一个项目中使用的旧代码,我曾在其中获取二进制点并在我的应用程序逻辑中提取坐标(出于某种原因):
unpack('x/x/x/x/co/Lt/dlat/dlng', $point);
这告诉我前四个字节是空的,然后是一个字符,一个长整型和坐标的双精度数。我非常怀疑开头的字节实际上没有被使用,可能是我从中复制这段代码的那个字节不需要它们。不管是什么情况,我目前只需要知道坐标就可以 select 地图上的一个对象:
SELECT * FROM map_objects WHERE position = ST_GeomFromText('Point(1 1)')
这反过来应该是说除了坐标之外的所有字节在执行的时候都可以被MySQL生成,也就是说它们是无意义的?将它们放在 Point
列中有什么 点?
此外,理论上应该可以通过提供 25 个二进制字节并使用等于运算符来 select 一条记录,但我的尝试实际上失败了,我只得到空结果,为什么那?
For example, a WKB value that corresponds to
POINT(1 -1)
consists of this sequence of 21 bytes, each represented by two hexadecimal digits:0101000000000000000000F03F000000000000F0BF
Component | Size | Value Byte order | 1 byte | 01 WKB type | 4 bytes | 01000000 X coordinate | 8 bytes | 000000000000F03F Y coordinate | 8 bytes | 000000000000F0BF
大多数起始字节表明几何对象是 Point
。