2016-12-02 2 views
1

Ich versuche, eine MySQL-Datenbank (Version 5.7.15) abzufragen, um alle Orte, die sich innerhalb von 300 Metern von einigen Koordinaten befinden (40.7542, -73.9961 in meinem Fall):Abstand in Metern zwischen zwei Spacial Points in MySQL Abfrage

SELECT * 
FROM location 
WHERE st_distance_sphere(latlng, POINT(40.7542, -73.9961)) <= 300 

Von MySQL documentation:

ST_Distance_Sphere (g1, g2 [, radius])

Gibt den mimimum sphärischen Abstand zwischen zwei Punkten und/oder Multipoints auf einer Kugel, in Meter, oder NULL, wenn Geometrie Argument ist NULL oder leer.

Leider ist die Abfrage gibt auch Punkte, die von POINT mehr als 300 Meter entfernt sind (40,7542, -73,9961) wie:

  • POINT (40,7501, -73,9949) (~ 470 Meter in Echt Leben)
  • POINT (40,7498, -73,9937) (~ 530 Meter im wirklichen Leben)
+0

Punkt muss auf diese Weise 'POINT (lng, lat)' 'select st_distance_sphere (POINT (-73.9949,40.7501) POINT eingestellt werden (-73,9961 , 40.7542)) ' geben Sie uns 466.9696023582369 - wie erwartet –

+0

@MituhaSergey, aber warum ist die Abfrage Entfernungen größer als 300 zurückgeben? – grim

+1

, weil Sie einen falschen POINT verwenden. zum Beispiel 'wählen st_distance_sphere (POINT (40,7501, -73,9949), POINT (40,7542, -73,9961))' kehren 183,3146597410617 <= 300 gerade richtig args Positionen POINT (lng, lat) verwenden, lng als erster arg, lat - als zweiter –

Antwort

4

ersten arg an POINT LNG sein muss, zweite - LAT.

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

wird 466,9696023582369 zurückkehren, wie erwartet, und 466,9696023582369> 300 natürlich

0

Nur um es für zukünftige Menschen klar zu machen (wie ich):

Mituha Sergey hat die Frage in den Kommentaren awnsered auf die Operation. Das Problem war, dass OP POINT(lag, lng) verwendete, während MySQL tatsächlich POINT(lng, lat) erwartet.

Nicht sicher über die Zeit, OP die Frage gestellt, aber ab heute die offizielle Dokumentation macht es etwas deutlicher:

Die Geometrie Argumente Punkte bestehen sollte, die (Länge, Breite) angeben Koordinatenwerte :

  • Längen- und Breitengrad sind die erste bzw. die zweite Koordinate des Punktes.
  • Beide Koordinaten sind in Grad angegeben.
  • Längenangaben müssen im Bereich (-180, 180] liegen. Positive Werte liegen östlich des Nullmeridians.
  • Breitengrade müssen im Bereich [-90, 90] liegen. Positive Werte liegen nördlich des Äquators .

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

Und wenn Sie aus diesem Grund immer "ungültige Argumente" Fehler, es ist wahrscheinlich.Versuchen Sie, WHERE lat between -90 and 90 AND lng between -180 and 180 nur um auf der sicheren Seite haha ​​:)

Verwandte Themen