我正在尝试处理空间数据类型,与其他编程主题相比,我发现它在互联网上没有得到广泛的理解。
我有一张桌子,其中包含地图上的对象。理论上,坐标在任何方向上都从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
列中包含它们的要点是什么?
从理论上讲,应该还可以通过提供25个二进制字节并使用equals运算符来选择一条记录,但是我的尝试实际上没有做到,我得到的结果只是空的,为什么?