Получите все записи из базы данных MySQL, которые находятся в Картах Google .getBounds?

Ok У меня есть база данных с примерно 1800 строк, каждая из которых имеет столбцы lat и long , что я пытаюсь сделать, это запрос к Google Maps V3 .getBounds . Результат – это что-то вроде ((33.564398518424134, -79.38014701875002), (35.375726155241175, -76.08424858125002)) То, что я хочу сделать, – это получить каждую запись, чьи lat и lng в базе данных находятся в пределах этих границ. Какие-либо предложения?

Im думает, что мне придется экстраполировать другие 2 угла карты, так как .getBounds содержит только 2 точки (2 угла карты, я полагаю), и я хотел бы быть в пределах 4 очков. Если бы я сделал это, у меня получилось бы что-то вроде … Теперь исправьте меня, если я ошибаюсь, но это должно быть NW, NE, SW, SE углы карты, в lat-lng.

 33.564398518424134, -79.38014701875002 33.564398518424134, -76.08424858125002 35.375726155241175, -79.38014701875002 35.375726155241175, -76.08424858125002 

Итак, если у меня есть эти данные, как бы я построил запрос, чтобы получить строки, находящиеся в этих координатах? Таблица называется tilistings – столбцы lat и lng … также, если есть более простой способ, или я просто сумасшедший с моей методологией, пожалуйста, не стесняйтесь, дайте мне знать.

благодаря

если из Google: ((a, b), (c, d))

SELECT * FROM tilistings WHERE lat > a AND lat < c AND lng > b AND lng < d

Все предыдущие ответы работают только на 1/4 мира!

Ответ W3t Tr3y был близок, но у него была ошибка (дополнительная «<»).

Все они работают только в США, потому что они находятся в северном полушарии. Они не работают в южном полушарии, ни в восточных странах (право на зеленый).

Вот простое решение без функций или сложных вещей.

буквы – это результат в том порядке, в котором вы их получите, из map.getBounds () ie swlat, swlng, nelat, nelng = a, b, c, d.

 SELECT * FROM tilistings WHERE (CASE WHEN a < c THEN lat BETWEEN a AND c ELSE lat BETWEEN c AND a END) AND (CASE WHEN b < d THEN lng BETWEEN b AND d ELSE lng BETWEEN d AND b END) 

или другое решение с и / или (вы можете проверить его на скорость, я не знаю, как запустить его более одного раза в WorkBench)

 SELECT * FROM tilistings WHERE (a < c AND lat BETWEEN a AND c) OR (c < a AND lat BETWEEN c AND a) AND (b < d AND lng BETWEEN b AND d) OR (d < b AND lng BETWEEN d AND b) 

Теперь вы можете отобразить весь мир 🙂 Я надеюсь, что кто-то может отметить вышеупомянутые ответы как неправильные, потому что они заставляют нас терять много времени для миллионов таких людей, как я. Интересно, как они получают так много голосов, когда они на самом деле не работают!

PS: Шансы вашего пикселя пикселя карты, соответствующие точному значению десяти десятичных значений координат, в два раза меньше, чем шансы пропустить целую 3/4 мира!

Я не использовал API Google, но я понимаю, что если вы получите ((33.564398518424134, -79.38014701875002), (35.375726155241175, -76.08424858125002)) обратно из вызова getBounds, тогда (33.564398518424134, -79.38014701875002) находится юго-западный угол и (35.375726155241175 , -76.08424858125002) – северо-восток. Я говорю, что, как я думаю, они возвращают северо-восток и юго-западные углы, и я предполагаю, что точки – это широта, долгота.

Если это правильно, тогда запрос Бэнси будет работать. Обычно использование BETWEEN более эффективно.

 SELECT * FROM tilistings WHERE lat BETWEEN a AND c AND lng between b AND d 

Я сейчас опаздываю на комментарий, но, возможно, это будет полезно для кого-то. sergio unswer не совсем корректен, запрос для всего мира должен выглядеть немного по-другому, если я не ошибаюсь, что-то вроде этого:

SELECT * FROM tilistings WHERE (sw_lat < ne_lat AND lat BETWEEN sw_lat AND ne_lat) OR (sw_lat > ne_lat AND (lat BETWEEN sw_lat AND 180 OR lat BETWEEN -180 AND ne_lat)) (sw_lon < ne_lon AND lon BETWEEN sw_lon AND ne_lon) OR (sw_lon > ne_lon AND (lon BETWEEN sw_lon AND 180 OR lon BETWEEN -180 AND ne_lon))

Это работает для меня:

 $condition1 = $a < $c ? "lat > $a AND lat < $c" : "lat > $a OR lat < $c"; $condition2 = $b < $d ? "lon > $b AND lon < $d" : "lon > $d OR lon < $b"; $q = "SELECT * FROM tilistings WHERE ( $condition1 ) AND ( $condition2 )"; 

Мы можем найти результат между Maps.getBounds northEast и southWest latitude и northEast и southWest longitude, используя следующий запрос.

Поисковый запрос должен быть между northEast.latitude AND southWest.latitude AND northEast.longitude AND southWest.longitude

 $nelat=$_GET['nelat']-0.5; $nelng=$_GET['nelng']-0.5; $swlat=$_GET['swlat']-0.5; $swlng=$_GET['swlng']-0.5; $sql ="SELECT * FROM tablename where (CASE WHEN ".$nelat." < ".$swlat." THEN s.latitude BETWEEN ".$nelat." AND ".$swlat." ELSE s.latitude BETWEEN ".$swlat." AND ".$nelat." END) AND (CASE WHEN ".$nelng." < ".$swlng." THEN s.longitude BETWEEN ".$nelng." AND ".$swlng." ELSE s.longitude BETWEEN ".$swlng." AND ".$nelng." END)"; 

Взгляните на новые пространственные данные и функции, доступные в MySQL 5.7, теперь также для InnoDB.

Используя приведенные выше примеры, для таблицы с 1 mio-записями требуется около 1 с для получения местоположений в пределах определенной ограничивающей рамки.

С ST_Within () и ST_MakeEnvelope () и правильным пространственным индексом я получаю результат меньше 0.01 секунд.

Немного упрощенная версия ответа Владимира отлично работает для меня.

Принимая площадь, связанную коробкой с южным краем (юг), западным краем (запад), северным краем (север) и восточным краем (восток). Они могут быть получены из Google Map .getBounds, которые обеспечивают юго-западный угол и северо-восточный угол – вам нужны только два угла, поскольку они полностью описывают квадратную ограничительную рамку.

В этом примере наша таблица базы данных называется местоположениями и содержит столбец для широты и долготы.

 SELECT * FROM locations WHERE (latitude BETWEEN south AND north) AND ((west < east AND longitude BETWEEN west AND east) OR (west > east AND (longitude BETWEEN west AND 180 OR longitude BETWEEN -180 AND east))) 

Это основано на том факте, что нам нужно учитывать только пересечение 180 / -180 долготной линии в качестве особого случая, т. Е. Когда западная долгота является более высокой, чем восточная долгота. В любом случае, когда мы не пересекаем эту линию, западная долгота всегда будет меньше восточной долготы.

Что касается широты, южный край всегда будет более низким значением, чем северная широта, поскольку нет концепции обертывания вокруг полюсов. Например, для покрытия области над северным полюсом мы просто имеем все долготы (т. Е. От -180 до 180) и широту от южной границы до +90.

Я не уверен, что приведенное выше утверждение верно. Во-первых, я считаю, что углы – это нелат, nelng, swlat, swlng, как указано выше, «swlat, swlng, nwlat, nwlng». Во-вторых, я считаю, что nelat всегда будет выше, чем swlat окна (если окно не покрывает один из географических полюсов, который я не уверен, возможно даже с картами google).

Наконец, если окно закрывает международную линию дат (приблизительно +/- 180lng), то есть d <b, то, безусловно, это должно быть «NOT BETWEEN b AND d». Может быть, кто-то с большим количеством специальных знаний может подтвердить?