2016-12-02 9 views
1

Я пытаюсь запросить базу данных MySQL (версия 5.7.15), чтобы получить все местоположения, расположенные в пределах 300 метров от некоторых координат (40.7542, -73.9961 в моем случае):Расстояние в метрах между двумя промежуточными точками в запросе MySQL

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

От MySQL documentation:

ST_Distance_Sphere (g1, g2 [радиус])

Возвращает Mimimum сферическое расстояние между двумя точками и/или многоточечных точек на сфере, в метрах или NULL, если любой аргумент геометрии является NULL или пустым.

К сожалению, запрос возвращает также точки, которые находятся более чем в 300 метрах от POINT (40.7542, -73.9961), такие как:

  • POINT (40.7501, -73,9949) (~ 470 метров в режиме реального жизнь)
  • POINT (40,7498, -73,9937) (~ 530 метров в реальной жизни)
+0

точка должна быть установлена ​​таким образом, 'ТОЧКА (LNG, лат)' 'выберите st_distance_sphere (POINT (-73.9949,40.7501), POINT (-73,9961 , 40.7542)) ' дайте нам 466.9696023582369 - как и ожидалось –

+0

@MituhaSergey, но почему запрос возвращает расстояния более 300? – grim

+1

, потому что вы используете неправильную POINT. , например, 'выберите st_distance_sphere (POINT (40.7501, -73,9949), POINT (40,7542, -73,9961))' возвратит 183.3146597410617 <= 300. просто использовать правильный Args координаты точки (LNG, лат), LNG, как первый arg, lat - второй –

ответ

4

первый аргумент в точке должна быть СПГ, второй - LAT.

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

вернется 466.9696023582369, как и ожидалось, и +466,9696023582369> 300 конечно

0

Просто, чтобы сделать его более понятным для будущих людей (как я):

Mituha Сергей awnsered вопрос в комментариях к ОП. Проблема заключалась в том, что OP использовал POINT(lag, lng), когда на самом деле MySQL ожидает POINT(lng, lat).

Не уверен, что о времени OP разместившего вопрос, но на сегодняшний день официальная документация делает его немного понятнее:

Доводы геометрия должна состоять из точек, которые определяют (долгота, широта) значения координат :

  • Долгота и широта - первая и вторая координаты точки соответственно.
  • Обе координаты находятся в градусах.
  • Значения долготы должны находиться в диапазоне (-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 только, чтобы быть на безопасной стороне ха-ха :)