Настройка окна просмотра Google Maps для автоматического размещения панели для расположения (n) маркеров в разных местах

Подход, который я использовал до сих пор, был следующим:

function addMarker( query ) {
    var geocoder = new google.maps.Geocoder();
    var afterGeocode = $.Deferred();

    // Geocode 'query' which is the address of a location.
    geocoder.geocode( 
            { address: query }, 
            function( results, status ){

                    if( status === 'OK' ){
                        afterGeocode.resolve( results ); // Activate deferred.
                    }
            }
    );

    afterGeocode.then( function( results ){
        var mOptions = {
            position: results[0].geometry.location,
            map: map
        }

        // Create and drop in marker.
        var marker = new google.maps.Marker( mOptions );
        marker.setAnimation( google.maps.Animation.DROP );      

        var current_bounds = map.getBounds(); // Get current bounds of map
        // use the extend() function of the latlngbounds object
        // to incorporate the location of the marker
        var new_bounds = current_bounds.extend( results[0].geometry.location );
        map.fitBounds( new_bounds ); // fit the map to those bounds
    }); 
}

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

Что я делаю неправильно?

ДОПОЛНЕНИЕ

Я добавил журналы и дополнительную переменную для захвата границ карты после перехода (new_new_bounds)

current_bounds = // Map bounds before anything is done.
    {-112.39575760000002, 33.60691883366427},
    {-112.39295444655761, 33.639099}

new_bounds = // From after the extend
    {-112.39295444655761, 33.60691883366427}, 
    {-112.39575760000002, 33.639099}

new_new_bounds = // From after the fitbounds
    {-112.33942438265382, 33.588697452015374},
    {-112.44928766390382, 33.657309727063996}

person dclowd9901    schedule 13.05.2011    source источник
comment
Что new_bounds говорит, что его границы после расширения?   -  person Ryan Olds    schedule 14.05.2011
comment
Похоже, изменение границ с (x1,y1),(x2,y2) → (x2,y1),(x1,y2) вызывает проблему. Я не на 100%, но я бы начал с этого.   -  person Ryan Olds    schedule 14.05.2011
comment
Во-первых, убедитесь, что это не ошибка, передав current_bounds в fitBounds и посмотрев, перемещается ли представление.   -  person Ryan Olds    schedule 14.05.2011


Ответы (2)


Итак, после долгих споров выяснилось, что проблема заключалась в том, что границы карты не совпадают с границами карты после fitBounds(). Что происходит (я полагаю), так это то, что Google берет границы, заданные вами в методе fitBounds(), а затем дополнит их. Каждый раз, когда вы отправляете текущие границы в fitBounds(), вы не будете соответствовать границам (x, y), вы будете соответствовать границам (x + m, y + m), где m = произвольное поле.

Тем не менее, лучший подход был следующим:

var current_bounds = map.getBounds();
var marker_pos = marker.getPosition();

if( !current_bounds.contains( marker_pos ) ){

    var new_bounds = current_bounds.extend( marker_pos );
    map.fitBounds( new_bounds );
}

Таким образом, карта будет соответствовать границам только в том случае, если размещенный маркер выходит за пределы текущей карты. Надеюсь, это поможет любому, кто столкнулся с этой проблемой.

person dclowd9901    schedule 16.05.2011

Возможное объяснение состоит в том, что вы случайно поместили новый маркер в разрыв z-кривой. Z-кривая рекурсивно делит карту на 4 меньших плитки, но это также причина, по которой между плитками есть промежутки. Лучшим способом было бы использовать кривую Гильберта или кривую Мура для картографических приложений. Существует запатентованный алгоритм поиска, покрывающий эту проблему, я думаю, что он называется запросом многомерного диапазона в quadtrees. Вы хотите найти блог Ника по пространственному индексу hilbert curce quadtree.

person Gigamegs    schedule 13.05.2011
comment
Мне немного трудно понять ваш ответ. Я просто использую стандартную библиотеку, предоставляемую v3 API. Запрос — это просто адрес или часть адреса. - person dclowd9901; 14.05.2011
comment
dclowd, я исправил свой ответ! - person Gigamegs; 14.05.2011