什么是点?

问题描述 投票:1回答:1

[我正在尝试使用空间数据类型,与其他编程主题相比,我发现它在互联网上没有得到那么广泛的理解。

我有一个表,其中包含地图上的对象。理论上,坐标在任何方向上都从0,0变为无穷大。在地图上的一点上不能有超过1个对象,因此我按如下方式设计表格:

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;

到目前为止,我可以使用空间扩展提供的各种几何函数来选择对象,但是我不太了解Point的内容,为什么它长25个字节?令人惊讶的是,几乎没有任何地方记录它。我在另一个项目中发现了一些旧代码,该代码曾用于获取二进制点并在我的应用程序逻辑中提取坐标(出于某种原因):

unpack('x/x/x/x/co/Lt/dlat/dlng', $point);

告诉我,前四个字节为空,然后有一个字符,一个长整数,并且坐标为双精度。我非常怀疑开头的字节实际上是未使用的,可能是我从中复制此代码的那个字节不需要它们。无论是哪种情况,我目前都可以仅通过知道坐标来选择地图上的对象:

SELECT * FROM map_objects WHERE position = ST_GeomFromText('Point(1 1)')

这又意味着,除坐标外,所有字节都可以在执行时由MySQL生成,这意味着它们无关紧要吗?将它们放在Point列中的point是什么?

另外,理论上应该可以通过提供25个二进制字节并使用equals运算符来选择一条记录,但是我的尝试实际上失败了,我只是得到了空结果,为什么呢?

mysql spatial point
1个回答
0
投票

这是well-known binary format

例如,与POINT(1 -1)对应的WKB值由21个字节的序列组成,每个序列由两个十六进制数字表示:

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

© www.soinside.com 2019 - 2024. All rights reserved.