13

多角形のMySQL クエリでポイントを作成する必要があります。

私はすでに次の 2 つの優れたソリューションを見つけました。

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

レイキャスティングアルゴリズムのMySQL実装?

ただし、これらの関数は、1 つのポイントがポリゴン内にあるかどうかしか確認できません。PiP 部分がクエリの一部のみである必要があるクエリがあり、ポリゴン内の 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 関数を記述して各ポイントにレイキャスティング メソッドを適用します。以下の例では、ポリゴンが 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 内ではなく MBR 内にある場合)。ポリゴン)

于 2013-07-04T12:59:20.357 に答える