の空間テーブルがありpolygons
ます。MySQL 空間テーブル内にあるものを効率的にpolygon
見つけようとしています。lat/lng point
ST_Within
が利用可能であることはわかっていますがMySQL 5.6
、私のバージョンはこれよりも前のものであるため、自由に使える2つの機能を組み合わせて、個別よりも効率的/正確なものにしています。
これらは、MySQL フォーラムの投稿からのネイティブMBRWITHIN
関数とカスタムGISWithinです。MBRWITHIN は通常、1 つしかないはずのポイントに対して約 2 行を提供しますが、高速です。GISWithin は正しい行を提供しますが、非常に遅いです。
だから私は次のようなクエリを書こうとしています:
最初に、クイック MBRWITHIN 関数を使用して、ポイントを含む可能性のあるいくつかの行を選択します。
次に、現在 9000 行ではなく約 2 行で動作している低速の GISWithin を使用して、このリストを 1 つの正しい行に絞り込みます。
私はあらゆる種類のサブクエリを試しました
SET @x = -0.3578;
SET @y = 51.477;
SET @point = CONCAT('POINT(',@x,' ',@y,')');
SELECT * FROM
(SELECT `geometry` FROM world_borders WHERE MBRWITHIN( @point , `geometry` )) AS TT
WHERE GISWithin(GeomFromText(@point), `geometry`);
と
SELECT * FROM world_borders WHERE GISWithin(GeomFromText(@point), `geometry`) IN (SELECT ogr_fid FROM world_borders WHERE MBRWITHIN( @point , `geometry` ));
エラーメッセージを取得するためだけに
#1416 - Cannot get geometry object from data you send to the GEOMETRY field
そのようなクエリや関数を書く方法を知っている人はいますか?
私のテーブルのポリゴンフィールドは呼び出されgeometry
、タイプはGeometry
ogr2ogrからインポートされています。