【问题标题】:What is a Point?什么是点?
【发布时间】:2020-04-07 16:10:10
【问题描述】:

我正在尝试使用空间数据类型,与其他编程主题相比,我发现这些类型在互联网上的理解并不那么广泛。

我有一张表,其中包含地图上的对象。理论上,坐标在任何方向上从 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运算符来选择记录,但我的尝试实际上失败了,我只是返回空结果,这是为什么?

【问题讨论】:

  • 你真的在问 MySQL Point 类型的值是如何编码的吗?
  • @LightnessRaceswithMonica 本质上。我和很多其他人一样,可能还不够熟练,无法深入挖掘如此复杂程序的源头。我花了很长时间搜索这个信息,但我找不到它,问有什么害处?我想了解我正在使用的工具的工作原理,我相信这就是区分好工程师和坏工程师的原因。
  • @LightnessRaceswithMonica 我只是假设你的语气似乎很嘲讽,我很抱歉。
  • 哦,对不起,我实际上可以看到它是如何阅读的。我的意思是“不是问Point是什么,而是实际上问它是如何工作的”......而不是“你诚实地问这个问题吗?你怎么了? ?” ;)

标签: mysql spatial point


【解决方案1】:

这是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

【讨论】:

  • 但这似乎是多余的?明明列是Point 类型,为什么每个点都需要包含4个字节表示它是一个点?
  • @php_nub_qq 我同意。我认为这样做是因为 Point 是 Geometry 的子类而不是类型。
  • 但在 DDL 中它说 point 就好像它是一种类型。如果所有这些类型基本上都被视为单个 geometry 类型,那将是有意义的,但是为什么要单独将它们定义为类型。只是随机的想法。
  • @php_nub_qq 您可以尝试在dba.stackexchange.com 询问类和类型之间的区别。我不知道为什么 MySQL 选择有类来给出一个好的答案。
  • @php_nub_qq wkb 不是 mysql 格式。它由开放地理空间联盟定义,是一个 ISO 标准。 Mysql 只是按照标准的规范来实现它。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2016-03-26
  • 2014-03-01
  • 2015-02-07
相关资源
最近更新 更多