10

MySQL 5.5 で、いくつかの境界を保持するテーブル (municipal_border) を作成しました。

CREATE TABLE `municipal_border` (
  `boundary` polygon NOT NULL,
  `municipalID` int(10) NOT NULL,
) ENGINE=InnoDB

フィールド MunicipalID は一意ではありません。

以下のコードを使用して、ポイントがポリゴンに属しているかどうかをテストしています。

set @r = (SELECT municipal_border.boundary FROM municipal_border WHERE municipalID=9001);
set @p = GeomFromText('POINT(24.1621 41.0548)');
select if(contains(@r, @p), 'yes', 'no');

最初のステートメント set @r = ... は 1 行だけを返します。私はそれをテスト用に特別に選択しました。それはうまく機能します。

私がやりたいことは、テーブル全体を検索し (つまり、SQL の質問から WHERE 部分を削除して)、ポイントがどのポリゴンにあるかを見つけることです。

4

2 に答える 2

22

一晩寝た後、次の解決策を見つけました。

set @p = GeomFromText('POINT(23.923739342824817 38.224714465253733)');
select municipalID FROM ecovis.municipal_border
where ST_Contains(municipal_border.boundary, @p);

ST_ プレフィックス機能が実装されているMySQL 5.6.1 で動作しています。私は古典的なアプローチ(X線アルゴリズム)からの測定はしていませんが、それはかなり速いと思います. 2700 個のポリゴンでポイントを見つけるのに 0.17 秒かかり、一部のポリゴンには 1,500 個をはるかに超えるポイントがあります。

于 2013-03-28T13:46:44.890 に答える