2

この質問は、Mysql 地理空間拡張の専門家向けです。

次のクエリは、私が期待している結果ではありません。

create database test_db;

use test_db;

create table test_table (g polygon not null);

insert into test_table (g) values (geomfromtext('Polygon((0 5,5 10,7 8,2 3,0 5))'));
insert into test_table (g) values (geomfromtext('Polygon((2 3,7  8,9 6,4 1,2 3))'));

select

X(PointN(ExteriorRing(g),1)), Y(PointN(ExteriorRing(g),1)),
X(PointN(ExteriorRing(g),2)), Y(PointN(ExteriorRing(g),2)),
X(PointN(ExteriorRing(g),3)), Y(PointN(ExteriorRing(g),3)),
X(PointN(ExteriorRing(g),4)), Y(PointN(ExteriorRing(g),4))

from test_table where MBRContains(g,GeomFromText('Point(3 6)'));

基本的に、2 つのポリゴンを作成し、MBRContains を使用して、ポイントが 2 つのポリゴンのいずれか内にあるかどうかを判断しようとしています。

驚いたことに、両方のポリゴンが返されます! ポイント 3,6 は、最初に挿入されたポリゴンにのみ存在する必要があります。

両方の多角形が傾いていることに注意してください (多角形を紙に描いてみるとわかります)

MySql が両方のポリゴンを返すのはなぜですか? MySql Community Edition 5.1 を使用しています。

4

1 に答える 1

2

更新: この回答が MySQL によって廃止されたことを願っています: http://forge.mysql.com/wiki/GIS_Functions ! 古い MBRContains 実装の参照として残しますが、変更を説明する新しい回答は歓迎され、この上で「受け入れられる」必要があります。

時代遅れの答えを始める

ポリゴン自体ではなく、(必然的に)最小の境界矩形を使用しています。クエリの目的で、比較される形状は次と同等です。

'POLYGON(0 2,0 10,7 10,7 2,0 2)'

最初の形状と:

'POLYGON(2 1,9 1,9 9,2 9,2 1)'

第二に。(3,6) は両方にあります。

MBR は推定の大まかな方法​​であり、min(x) と max(x) に垂直線、max(y) と min(y) に水平線があるように長方形を描いてください。これらの形状はデータベースが計算しやすいため、MySQL はすべての多角形関数をサポートしているわけではありません。(領域はい、ラインストリングは一般的にはい、containsまだありません。詳細はこちら。) 現時点でより正確な地理空間ジオメトリが必要な場合、オープンソース側での最良の選択はPostGISです。

于 2009-07-16T01:25:05.253 に答える