我的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?)中提供的解决方案不幸地帮助了我..
答案 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
也存在)。