Подтвердить что ты не робот

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

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

Мне кажется, что мне пришлось бы экстраполировать остальные 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... также, если есть более простой способ, или я просто сумасшедший в своей методологии, пожалуйста, не стесняйтесь, дайте мне знать.

Спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

буквы - это результат в том порядке, в котором вы их получите, из map.getBounds() i.e 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 мира!

Ответ 3

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

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

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

Ответ 4

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

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))

Ответ 5

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

$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 )";

Ответ 6

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

Поисковый запрос должен быть между northEast.latitude AND southWest.latitude И northEast.longitude И 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)";

Ответ 7

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

Взяв область, связанную ящиком с южным краем (юг), западным краем (запад), северным краем (север) и восточным краем (восток). Они могут быть получены из 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.

Ответ 8

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

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

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

Ответ 9

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

Наконец, если окно закрывает международную линию дат (приблизительно +/- 180lng), то есть d < b тогда, конечно, это должно быть "НЕ МЕЖДУ b И d". Может быть, кто-то с большим количеством специальных знаний может подтвердить?