2

の空間テーブルがあり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、タイプはGeometryogr2ogrからインポートされています。

4

1 に答える 1