Mysql Spatial Extension。如何检查Linestring是否包含一个点?

时间:2012-11-29 09:35:34

标签: mysql spatial spatial-index

我正在尝试确定Linestring是否有Point .... f.e。

SET ls = geomfromtext('LINESTRING(1 0,3 0)');
SET p = geomfromtext('POINT(2 0)');

如果我CONTAINS(ls,p)我是真的。但是没有点(2 0)在行

我需要完全包含。它有什么功能吗?

2 个答案:

答案 0 :(得分:0)

请您查看this article

上的以下参考资料
  • SQLFIDDLE

    SET @ls = 'LineString(1 0,3 0)';

    SET @xs = geomfromtext(@ls);

    SET @p = geomfromtext('POINT(2 0)');

    SELECT MBRWithin(@xs,@p);

抱歉,我给出了错误的链接。

结果

MBRWITHIN(@XS,@P)
0

看着你的第1 0,3 0 - >行它上面有2 0点。

enter image description here

答案 1 :(得分:0)

我尝试了文档中的所有功能,而不是他们做我需要的。 F.E.

SELECT ASTEXT(path) FROM paths WHERE INTERSECTS(path, GEOMFROMTEXT('POINT(604 0)'))

给出“错误”的结果

LINESTRING(572 0,600 0,601 0,602 0,603 0,604 0,605 0,606 0,607 0,608 0,402 0)
LINESTRING(402 0,609 0,610 0,611 0,612 0,613 0,614 0,615 0,616 0,617 0,618 0,619 0,620 0,621 0,622 0,623 0)
LINESTRING(359 0,449 0,801 0,422 0,802 0,803 0,498 0)
LINESTRING(572 0,795 0,796 0,797 0,798 0,799 0,800 0,345 0,359 0)
LINESTRING(792 0,768 0,793 0,794 0,572 0)
LINESTRING(342 0,904 0,905 0,906 0)
LINESTRING(912 0,914 0,915 0,916 0,341 0)
LINESTRING(344 0,917 0,918 0,919 0,920 0,800 0)
LINESTRING(918 0,922 0,923 0,924 0,925 0,926 0,927 0,343 0)
LINESTRING(940 0,947 0,948 0,949 0,604 0)

MBRWITHIN给出相同的结果

我写了一个函数,但它非常慢:

FUNCTION `IDIL`(`id` INT, `line` LINESTRING) RETURNS INT(1)
    NO SQL
    DETERMINISTIC
BEGIN
DECLARE n INT DEFAULT 0; 
DECLARE p1X INT(20); 
DECLARE p1Y INT(20); 
DECLARE p1 POINT; 
DECLARE i INT DEFAULT 0; 
DECLARE result INT(1) DEFAULT 0; 
SET n = NUMPOINTS(line); 
WHILE i<n DO 
    SET p1 = POINTN(line, (i+1)); 
    SET p1X = X(p1); 
    SET p1Y = Y(p1); 
    IF p1X=id OR p1Y=id THEN RETURN 1; END IF; 
    SET i = i + 1; 
END WHILE; 
RETURN result; 
    END$$