MySql 地理空間のバグ..?
-
16-09-2019 - |
質問
この質問は、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 を使用して Point が 2 つのポリゴンのいずれか内にあるかどうかを判断しようとしています。
驚くべきことに、両方のポリゴンが返されます。ポイント 3、6 は、最初に挿入されたポリゴンにのみ存在する必要があります。
両方の多角形が傾いていることに注意してください (紙に多角形を描くと、それがわかります)。
MySql はなぜ両方のポリゴンを返すのでしょうか?MySql Community Edition 5.1 を使用しています。
解決
アップデート:この回答が 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)'
2番目に。(3,6) は両方にあります。
MBR は大まかな推定方法であり、min(x) と max(x) に垂直線、max(y) と min(y) に水平線がある四角形をイメージします。これらの形状はデータベースでの計算が容易ですが、MySQL はすべてのポリゴン関数をサポートしているわけではありません。(エリアはあり、ラインストリングは一般的にあり、 contains
まだ。さらに詳しく ここ。)。現時点でより正確な地理空間ジオメトリが必要な場合、オープンソース側での最良の選択は次のとおりです。 ポストGIS.