Настройка окна просмотра 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}

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

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

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

Другие вопросы по тегам