1

我必须发现给定点是否与使用 MySQL Spatial 记录的数据库中存在的路线至少相距 500 米(或其他距离)。

我看到 MySQL Spatial 中没有类似的功能,并找到一个对我不起作用的先前答案,因为该线太大(超过 300 公里)无法逐点检查此解决方案: Find N Nearest LineString From A Point使用 MySQL 空间扩展

我什至无法创建一个缓冲区(具有给定半径的圆/多边形)来检查是否甚至触摸。


更新 - 12/7 我做到了,但 MySQL Spatial 它是不可信的接缝。我做了一个 createBuffer 函数,在给定点周围创建一个 20 点多边形,半径为米给定距离:http: //pastebin.com/xEFb8ZXi

我正在使用 QGis 测试来自这个缓冲区的给定结果,并且该功能一切正常(除了米到十进制的数值,它生成的值比预期的要小,但这不是现在的问题)。

并进行了一些相交检查,即使结果多边形不与线相交,这也是远离返回真。我只使用中心点重新进行了相同的测试,结果是一样的。我现在发现 INTERSECT 不检查 LineString 与 Point 或 Polygon,而是 LineString 的 Bounding Box,当 a 指示 Linestring BBox 外部的点时。

Intersects QUERY 其中“rota”是 Linestring 数据:

 SELECT Intersects(rota, createBuffer(GeomFromText('POINT(-19.7736 -43.7255)'),500)) 
 FROM log_viagem WHERE rota IS NOT NULL;

我现在如何信任 MySQL Spatial?还是我关于 INTERSECTS 的概念是错误的?


已解决: 我没有阅读 MySQL 5.5 版本的重要说明:

注意 目前,MySQL 并未按照规范实现这些功能。那些实现的返回与相应的基于 MBR 的函数相同的结果。

解决方案正在与服务器管理员一起更新到 5.6.1,说明中有升级

注意 MySQL 最初实现了这些函数,因此它们使用对象边界矩形并返回与相应的基于 MBR 的函数相同的结果。从 MySQL 5.6.1 开始,可以使用使用精确对象形状的相应版本。这些版本以 ST_ 前缀命名。例如, Contains() 使用对象边界矩形,而 ST_Contains() 使用对象形状。

从 MySQL 5.6.1 开始,对于已经精确的现有空间函数也有 ST_ 别名。例如,ST_IsEmpty() 是 IsEmpty() 的别名

4

0 回答 0