MySQL GISを使用して、指定された円内にあるポイントを持つ行を検索する必要があります。擬似コードのクエリ例は次のとおりです。
select * from gistable g where isInCircle(g.point, circleCenterPT, radius)
PostGISはST_Buffer関数を介してこれを行うことができるようです。MySQL GISは同様の機能を提供しますか?
私の知る限り、バッファ関数はまだMySQLに実装されていません。
これらの関数はMySQLには実装されていません。それらは将来のリリースで表示される可能性があります。
* Buffer(g,d) Returns a geometry that represents all points whose distance from the geometry value g is less than or equal to a distance of d.
私があなたの質問を正しく理解していれば、このクエリを実行するために空間関数さえ必要ないかもしれません。「通常の」SQLクエリとユークリッド距離を使用できます。
select *
from gistable g
where SQRT(POW(circleCenterPT.x - point.x,2) + POW(circleCenterPT.y - point.y,2)) < radius
お役に立てれば。
編集: パフォーマンスは確かにこのクエリの問題になります。
MySQLの空間関数に関しては、最新のスナップショットにはBufferやDistanceなどの新しい関数が含まれているようです。あなたはそれを試してみたいかもしれません:
PostGISを使用する場合でも、ST_Buffer関数を使用する必要はありませんが、これと同等の操作を実行するST_Expand (擬似コード):
-- expand bounding box with 'units' in each direction
envelope.xmin -= units;
envelope.ymin -= units;
envelope.xmax += units;
envelope.ymax += units;
-- also Z coordinate can be expanded this way
PostGIS構文では、SQLクエリは通常次のようになります。
SELECT AsText(geom) FROM mypoints
WHERE
-- operator && triggers use of spatial index, for better performance
geom && ST_Expand(ST_GeometryFromText('POINT(10 20)', 1234), 5)
AND
-- and here is the actual filter condition
Distance(geom, ST_GeometryFromText('POINT(10 20)', 1234)) < 5
postgis-usersメーリングリストでBuffervsExpandの説明を見つけてください。
したがって、理想的には、MySQLで同様の動作を複製することです。私はMySQLのエキスパートではありませんが、ST_Expand
機能がなくても実行可能だと思います。
ST_Expand
関数を模倣する方法は次のとおりです。
CONCAT('POLYGON((',
X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, ',',
X(GeomFromText('POINT(10 20)')) + 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, ',',
X(GeomFromText('POINT(10 20)')) + 5, ' ', Y(GeomFromText('POINT(10 20)')) + 5, ',',
X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) + 5, ',',
X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, '))'
);
次に、この結果を次のようなクエリと組み合わせます。
SELECT AsText(geom) FROM mypoints
WHERE
-- AFAIK, this should trigger use of spatial index in MySQL
-- replace XXX with the of expanded point as result of CONCAT above
Intersects(geom, GeomFromText( XXX ) )
AND
-- test condition
Distance(geom, GeomFromText('POINT(10 20)')) < 5
距離関数が使用できない古いバージョンのMySQLを使用しているamercader
場合は、SQRTベースの計算の使用を使用できます。
それがあなたにいくつかのアイデアを与えることを願っています。
MySQL5.7.6以降。
ST_Distance_sphere(g1、g2 [、radius])
球上の2点および/または多点間の最小球面距離をメートル単位で返します。ジオメトリ引数がNULLまたは空の場合はNULLを返します。
計算では、球体地球と構成可能な半径を使用します。オプションのradius引数は、メートル単位で指定する必要があります。省略した場合、デフォルトの半径は6,370,986メートルです。radius引数が存在するが正ではない場合、ER_WRONG_ARGUMENTSエラーが発生します
編集:なぜ反対票を投じるのですか?
SELECT *
FROM gistable g
WHERE ST_Distance_Sphere(g.point, circleCenterPT) <= radius