MySQL LineString与Linestring或Polygon交叉

时间:2012-03-08 12:16:37

标签: php mysql polygon spatial

我的mySQL空间函数有问题。我的目标是找出LINESTRING对象是否正在通过POLYGON对象。确定我已尝试使用两个LINESTRING对象来确定它们是否交叉。

SET @ls='LINESTRING (0 0, 1 1, 2 2, 3 3)'; -- original linestring
SET @lp='LINESTRING (0 1, 1 2, 2 3, 3 4)'; -- parallel linestring
SET @lx='LINESTRING (0 3, 1 2, 2 1, 3 0)'; -- crossed linestring

我尝试了几个功能来实现我的目标:

SELECT crosses(GeomFromText(@ls), GeomFromText(@lx)); -- crossing linestrings
returns 0;

SELECT intersects(GeomFromText(@ls), GeomFromText(@lp)); -- parallel linestrings
returns 1;

SELECT overlaps(GeomFromText(@ls), GeomFromText(@lp)); -- parallel linestrings
returns 1;

我明白这是边界比较的问题,但是有没有办法(或功能,或简单的解决方案)如何实现我的目标?其他可能性是检查LINESTRING中的POINT是否在POLYGON中,但我想知道是否还有另一种方法可以做到这一点?

MySQL Great Circle intersection (do two roads cross?)中提供的

解决方案不幸地帮助了我..

1 个答案:

答案 0 :(得分:3)

来自5.6.1中 'Functions That Test Spatial Relationships Between Geometries' 的MySQL文档:

  

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

     

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

的别名

例如,您的intersects函数返回true,因为两个形状的最小边界矩形(MBR)相交。如果您使用ST_Intersects代替(如果您拥有MySQL 5.6.1或更高版本),那么它将按预期返回false。这些函数可以与点,线和多边形一起使用 - 因此,如果需要,也可以解决“线交叉多边形”查询(ST_Crosses也存在)。