web-dev-qa-db-ja.com

MySQLクエリの2つの空間ポイント間のメートル単位の距離

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(40.7501、-73.9949)(実生活では約470メートル)
  • POINT(40.7498、-73.9937)(実生活では約530メートル)
9
grim

pOINTの最初の引数はLNG、2番目はLATでなければなりません。

select st_distance_sphere(POINT(-73.9949,40.7501), POINT( -73.9961,40.7542)) 

予想どおり、466.9696023582369が返され、もちろん466.9696023582369> 300が返されます。

10
Mituha Sergey

将来の人々(私のような)のためにそれを明確にするためだけに:

Mituha Sergeyは、OPに関するコメントで質問に回答しました。問題は、実際にはMySQLがPOINT(lat, lng)を予期しているのに、OPがPOINT(lng, lat)を使用していたことでした。

OPが質問を投稿した時期についてはわかりませんが、今日の時点で、公式ドキュメントにより少し明確になっています。

ジオメトリ引数は、(経度、緯度)座標値を指定するポイントで構成する必要があります。

  • 経度と緯度は、それぞれポイントの1番目と2番目の座標です。
  • 両方の座標は度単位です。
  • 経度の値は(-180、180]の範囲内である必要があります。正の値は本初子午線の東にあります。
  • 緯度の値は[-90、90]の範囲内である必要があります。正の値は赤道の北にあります。

差出人: https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html#function_st-distance-sphere

また、「無効な引数」エラーが発生した場合は、おそらくそれが原因です。安全のためにWHERE lat between -90 and 90 AND lng between -180 and 180を追加してみてください笑:)

2
g0dkar