как получить реальные границы с картами Google, когда полностью уменьшен - PullRequest
6 голосов
/ 02 марта 2010

У меня есть карта, которая показывает точки местоположения на основе границ карты.Например, каждый раз, когда карта перемещается / масштабируется, я нахожу границы и запрашиваю местоположения, попадающие в эти границы.К сожалению, я не могу отобразить все свои местоположения, когда полностью уменьшен.Причиной этого является то, что gmaps сообщает о минимальной / максимальной длине всего, что находится на краю карты, но если вы достаточно уменьшите масштаб, вы можете получить продольный диапазон, который исключает видимые местоположения.ваша карта, так что вы видите NorthAmerica дважды, в крайнем левом и крайнем правом.Мин / макс длинны около: от -36,5625 до 170,15625.Но это почти полностью исключает Северную Америку, которая находится в диапазоне от -180 до -60.Очевидно, это неприятно, так как на самом деле вы можете видеть континент Северная Америка (дважды), но когда я запрашиваю мои местоположения в диапазоне от карт Google, Северная Америка не возвращается.

Мой код для поиска мин / максlong is:

bounds = gmap.getBounds();
min_lat = bounds.getSouthWest().lat()
max_lat = bounds.getNorthEast().lat()

Кто-нибудь сталкивался с этим и может кто-нибудь предложить обходной путь?Сверху головы я могу только взломать: проверить уровень масштабирования и жестко кодировать минимальные / максимальные латы до -180/180, если это необходимо, что, безусловно, недопустимо.

Ответы [ 3 ]

0 голосов
/ 24 марта 2010

Не могу даже представить, как этот ОГРОМНЫЙ баг все еще существует !!! Функции isFullLng и toSpan содержат ошибки, и вы не можете на них полагаться.
Мой обходной путь ошибки для этого:

var zoom = map.getZoom();
var bounds = map.getBounds();    
var span = bounds.toSpan();
var isFull = span.lng() > 277 || zoom < 2;
0 голосов
/ 22 декабря 2011

Вот мое решение, мне нужен только isFullLng (), который, очевидно, был удален из API v3:

isFullLng: function() {
        var scale = Math.pow(2, map.getZoom()),
            bounds = map.getBounds(),
            ne = bounds.getNorthEast(),
            sw = bounds.getSouthWest(),
            lat = (ne.lat() <= 0 && sw.lat() >= 0) || (ne.lat() >= 0 && sw.lat() <= 0) ? 0 : Math.min(Math.abs(ne.lat()), Math.abs(sw.lat())), // closest latitude to equator
            deg1 = new google.maps.LatLng(lat, 0),
            deg2 = new google.maps.LatLng(lat, 1),
            coord1 = map.getProjection().fromLatLngToPoint(deg1),
            coord2 = map.getProjection().fromLatLngToPoint(deg2);
        // distance for one long degree in pixels for this zoom level
        var pixelsPerLonDegree = (coord2.x - coord1.x) * scale;
        // width of map's holder should be <= 360 (deg) * pixelsPerLonDegree if full map is displayed
        var width = $this.width(); // width of map's holder div
        return pixelsPerLonDegree * 360 <= width;

    },
isFullLat: function() {
        var bounds = map.getBounds(),
            ne = bounds.getNorthEast(),
            sw = bounds.getSouthWest(),
            maxLat = 85; // max lat degree
        return ne.lat() >= maxLat && sw.lat() <= -maxLat;
    },

Таким образом, isFull может быть:

isFullLng () && isFullLat ()

Обратите внимание, что в isFullLng () требуется ширина заполнителя карты, я использую jQuery, и карта отображается в div, на который ссылается $ this, поэтому я вызываю только

$ this.width ()

Вам следует изменить это, чтобы применить это к вашей проблеме.

0 голосов
/ 03 марта 2010

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

bounds = gmap.getBounds();
var fullEarth = new GLatLngBounds(new GLatLng(-85, 180), new GLatLng(85, -180)))
var isFull = bounds.containsBounds(fullEarth);
min_lat = isFull ? -90 : bounds.getSouthWest().lat()
max_lat = isFull ? 90 : bounds.getNorthEast().lat()

min_lng = isFull ? 180 : bounds.getSouthWest().lng()
max_lng = isFull ? -180 : bounds.getNorthEast().lng()
...