13

我需要在多边形MySQL 查询中指出一点。

我已经找到了这两个很好的解决方案:

http://forums.mysql.com/read.php?23,286574,286574

光线投射算法的MySQL实现?

但是这些函数只能检查一个点是否在多边形内。我有一个查询,其中画中画部分应该只是查询的一部分,并检查多边形内的 x 点。

像这样的东西:

$points = list/array/whatever of points in language of favour

SELECT d.name
FROM data AS d
WHERE d.name LIKE %red%
// just bla bla

// how to do this ?
AND $points INSIDE d.polygon
AND myWithin( $points, d.polygo ) // or

更新

我用这样的MBR函数进行了尝试:

SET @g1 = GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GeomFromText('Point(13.497834 52.540489)');
SELECT MBRContains(@g1,@g2);

G2 不应该在 G1 内,但MBR说它是。

4

3 回答 3

2

所以实际上你的问题是你如何将相同的函数应用于多个值,并且只有当所有对函数的调用都返回 true 时才返回 true。这不是很难。

如果是我,我会将点(以及可选的多边形 - 示例中未显示)放入表中,然后编写一个 MySQL 函数以将光线投射方法应用于每个点 - 如果任何一个交互返回 false,则返回 false,然后返回 true。在下面的示例中,我假设多边形是从 yourpolygon 中获取并由主键标识的,而点由外键标识(使用 zarun 的 mywithin 函数):

 DECLARE FUNCTION allwithin(
     pointSetKey INT) 
 RETURNS INT(1)  
 BEGIN 

 DECLARE current POINT;

 DECLARE check CURSOR FOR SELECT p.point
     FROM yourpoints p
     WHERE p.set=pointSetKey;

 OPEN check;

 nextPoint: LOOP

    FETCH check INTO current;

    IF (0=mywithin(current, yourpolygon)) THEN
         RETURN 0;
    END IF;

 END LOOP;

 RETURN 1;

 END;

 INSERT INTO yourpoints (pointsetkey, point)
 VALUES (
      128,
      GeomFromText('Point(13.497834 52.540489)')
 ),
 (
      128,
      GeomFromText('Point(13.6 52.1)')
 ),
 ....
 ;

 SELECT allwithin(128
 , GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))')
 );

或者...

 SELECT COUNT(*)
 FROM yourpoints p
 WHERE p.set=128
 AND mywithin(p.point
      , GeomFromText('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))')
      );

将为您提供不在多边形内的点数(当您只想知道是否没有点在外面时,这是相当昂贵的)。

于 2013-01-18T15:11:04.833 回答
1

如果你这样做怎么办

SET @g1 = GEOMFROMTEXT('Polygon((13.43971 52.55757,13.41293 52.49825,13.53378 52.49574, 13.43971 52.55757))');
SET @g2 = GEOMFROMTEXT('Point(13.497834 52.540489)');
SELECT  ST_Contains(@g1,@g2);

而不是 MBRContains?据我了解 MySQL 空间文档。MBR* 函数是最小边界矩形函数,因此它会显示您的点是否在几何体上的最小矩形内,但不在几何体本身内(如果它是不规则多边形并且点在 MBR 内而不是在多边形)

于 2013-07-04T12:59:20.357 回答
0

在我看来如下:您需要测试多个点是否在多边形中。如果都是,那么它们的凸包也是如此。找出它们的凸包(基本上:顺时针或逆时针排列它们),这将创建一个多边形。现在测试新多边形是否在 d.polygon 内。

于 2013-07-13T20:35:19.470 回答