Загрузка маркеров из базы данных для видимой области - PullRequest
3 голосов
/ 28 января 2012

Я пытаюсь загрузить маркеры (собственно оверлей) из моей базы данных, которая содержит значения lat и lng каждого маркера. Я хотел бы загрузить только маркеры в текущей видимой области карты Google.

Что я делаю, так это то, что получаю границы карты и вычисляю максимальные и минимальные значения широты и долготы. Каждый раз, когда я перетаскиваю или изменяю масштаб, я отправляю эти границы, используя ajax, а затем извлекаю нужные маркеры из своей базы данных, используя SQL-запрос, который выглядит следующим образом:

    AND lat BETWEEN :minLat AND :maxLat
    AND lng BETWEEN :minLng AND :maxLng

Это работает нормально ... за исключением случаев, когда я в настоящее время смотрю между 2 повторными мирами карты Google.

enter image description here

Запрос sql больше не будет работать с этими границами карты (sw и ne), потому что каждая граница принадлежит их соответствующим мирам. Тогда я не буду получать какие-либо маркеры.

Пример: Австралия составляет около lng = 150, и в этом случае я бы minLng = 25 (sw) и maxLng = 0 (ne) ... очевидно, 150 не между 0 и 25, даже если я смотрю на Австралию прямо сейчас.

Я не видел ни одного вопроса по этой конкретной проблеме ... Есть идеи, чтобы решить это? Что я делаю не так?

РЕДАКТИРОВАТЬ: Я наконец решил свою проблему ... вот что я сделал:

    // normal case
    if( $swLng < $neLng )
    {
        $ANDOR_lng = "AND";
    }
    // Case where world repeated
    else
    {
        $ANDOR_lng = "OR";
    }

    $dql = "SELECT MYSTUFF ...
            AND lat BETWEEN :latA AND :latB
            AND ( lng > :lngA ".$ANDOR_lng." lng < :lngB )";

        $parameters = array(
            'latA' => $swLat,
            'latB' => $neLat,
            'lngA' => $swLng,
            'lngB' => $neLng
        );

    }

Ответы [ 2 ]

3 голосов
/ 29 января 2012

Обычно вы ожидаете, что w (западная долгота) будет меньше, чем e (восточная долгота), то есть:

:minLng < :maxLng

Однако, но когда ограничивающий прямоугольник содержит меридиан в 180 (или -180), это не так. В этих случаях эта часть запроса никогда не может вернуть true:

( lng > :minLng AND lng < :maxLng )

Что вы могли бы сделать, это поменять местами :minLng и :maxLng, чтобы приведенное выше предположение снова стало верным:

if(:minLng > :maxLng) {
  :minLng, :maxLng = :maxLng, :minLng
}

Если вы посмотрите на карту выше, это соответствует тому, что вы делаете при ее рисовании: угол sw имеет большую долготу, чем угол ne.

Предупреждение: я не писал PHP-код годами, я не знаю, можете ли вы на самом деле a, b = b, a поменять их значения, я знаю только, что это работает в Python, но вы поняли идею.

0 голосов
/ 29 января 2012

Проблема в том, что вы используете неправильные границы. Вам нужно получить границы пикселей, а не координаты координат. Если вы получите привязку к пикселю, то я думаю, что запрос может работать, потому что такой проблемы нет.

...