【问题标题】:MySQL LineString intersections with Linestring or PolygonMySQL LineString 与 Linestring 或 Polygon 的交集
【发布时间】:2013-04-18 22:24:02
【问题描述】:

我的 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 中的点是否在多边形内,但我想知道是否有其他方法可以做到这一点?

不幸的是,MySQL Great Circle intersection (do two roads cross?) 中提供的解决方案对我没有帮助..

【问题讨论】:

    标签: php mysql polygon spatial


    【解决方案1】:

    来自 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)do 相交。如果您改用ST_Intersects(前提是您有 MySQL 5.6.1 或更高版本),那么它将按预期返回 false。这些函数可以与点、线和多边形一起使用 - 所以也应该解决您的“线相交多边形”查询(如果需要, ST_Crosses 也存在)。

    【讨论】:

    • 是的,幸运的是,新版本支持 ST_ 前缀。我已经修复了一段时间,但忘记了这里的线程。 :) 感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2019-12-04
    • 1970-01-01
    相关资源
    最近更新 更多