MySQLデータベース(バージョン5.7.15)にクエリを実行して、いくつかの座標(40.7542、私の場合は-73.9961)から300メートル以内にあるすべての場所を取得しようとしています。
SELECT *
FROM location
WHERE st_distance_sphere(latlng, POINT(40.7542, -73.9961)) <= 300
MySQLドキュメント から:
ST_Distance_Sphere(g1、g2 [、radius])
メートルで、球上の2点および/または複数点間の最小球距離を返します。ジオメトリ引数がNULLまたは空の場合はNULLを返します。
残念ながら、クエリは次のようにPOINT(40.7542、-73.9961)から300メートル以上離れたポイントも返します。
pOINTの最初の引数はLNG、2番目はLATでなければなりません。
select st_distance_sphere(POINT(-73.9949,40.7501), POINT( -73.9961,40.7542))
予想どおり、466.9696023582369が返され、もちろん466.9696023582369> 300が返されます。
将来の人々(私のような)のためにそれを明確にするためだけに:
Mituha Sergeyは、OPに関するコメントで質問に回答しました。問題は、実際にはMySQLがPOINT(lat, lng)
を予期しているのに、OPがPOINT(lng, lat)
を使用していたことでした。
OPが質問を投稿した時期についてはわかりませんが、今日の時点で、公式ドキュメントにより少し明確になっています。
ジオメトリ引数は、(経度、緯度)座標値を指定するポイントで構成する必要があります。
- 経度と緯度は、それぞれポイントの1番目と2番目の座標です。
- 両方の座標は度単位です。
- 経度の値は(-180、180]の範囲内である必要があります。正の値は本初子午線の東にあります。
- 緯度の値は[-90、90]の範囲内である必要があります。正の値は赤道の北にあります。
また、「無効な引数」エラーが発生した場合は、おそらくそれが原因です。安全のためにWHERE lat between -90 and 90 AND lng between -180 and 180
を追加してみてください笑:)