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

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

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

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

Что я делаю не так?

ADDENDUM

Я добавил журналы и дополнительную переменную для захвата границ карты после переход сделан (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 ]

9 голосов
/ 16 мая 2011

ОК, так что после долгих споров выясняется, что проблема в том, что границы карты не совпадают с границами карты после 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 );
}

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

0 голосов
/ 14 мая 2011

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

...