установить уровень масштабирования при удалении маркера - PullRequest
4 голосов
/ 27 апреля 2010

с использованием javascript google-maps api

У меня в данный момент есть настройка для удаления создателя, которую я настроил, когда добавляю местоположение, например,

  function addLocation(map,location) {
      var point = new GLatLng(location.lat, location.lon);
      var marker = new GMarker(point);
      map.addOverlay(marker);
      bounds.extend(marker.getPoint());

      $('<a href="#" class="closebutton">').click(function(e){
        e.preventDefault();
        $(this).parent().remove();
        map.removeOverlay(marker);
        map.closeInfoWindow();
    }).prependTo($('<li>'+location.label+'</li>').click(function() {
            showMessage(marker, location.label,map);    
      }).appendTo("#list"));
      GEvent.addListener(marker, "click", function() {
        showMessage(marker, location.label,map);
      });
  }

тогда у меня есть функция, которая устанавливает уровень масштабирования

 function zoomToBounds(map) {
     map.setCenter(bounds.getCenter());
     map.setZoom(map.getBoundsZoomLevel(bounds) - 1);
 }

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

Теперь, если я поставлю вызов zoomToBounds сразу после

  map.removeOverlay(marker);

тогда он не двигается, он остается на том же уровне увеличения

так что я хочу знать, есть ли способ установить уровень масштабирования после удаления маркера ??

1 Ответ

4 голосов
/ 27 апреля 2010

Привет - это, безусловно, то, что вы можете сделать с помощью Google Maps API.

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

Для этого я бы предложил сохранить какое-то хранилище данных всех точек, которые использует GMarkers.

Используя GEvent Listeners, вы также можете привязать функцию zoomToBounds к событию, когда GMarker удаляется.

Вот фрагмент кода того, о чем я говорю:

var bounds = new GLatLngBounds();
var points = {};

function createMarker(location)
{
     /*Create Our Marker*/
     var point = new GLatLng(location.lat,location.lon);
     var marker = new GMarker(point);

     /*Add an additional identifier to the Marker*/
     marker.myMarkerName = 'uniqueNameToIDMarkerPointLater';

     /*Store the point used by this Marker in the points object*/
     points[marker.myMarkerName] = point;

     /*Create an event that triggers after the marker is removed to call zoomToBounds*/
     GEvent.addListener(marker,"remove",function()
     {
          /*Passes the marker's ID to zoomToBounds*/
          zoomToBounds(this.myMarkerName);    
     };

     /*Add the new point to the existing bounds calculation*/
     bounds.extend(point);      

     /*Draws the Marker on the Map*/     
     map.addOverlay(marker);                  
}

function zoomToBounds(name)
{
     /*Remove the Point from the Point Data Store*/
     points[name]=null;

     /*Create a new Bounds object*/
     bounds = new GLatLngBounds();

     /*Iterate through all our points and build our new GLatLngBounds object*/
     for (var point in points)
     {
          if (points[point]!=null)
          {
               bounds.extend(points[point]);
          }
     }

     /*Calculate the Position and Zoom of the Map*/
     map.setCenter(bounds.getCenter());
     map.setZoom(map.getBoundsZoomLevel(bounds)-1);
}

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

Я также создал действующий пример этого расположенного здесь .

Не стесняйтесь использовать исходный код для всего, что вам нужно - дайте мне знать, как вы справляетесь с ним, или если у вас есть какие-либо вопросы!

Вот код без комментариев:

var bounds = new GLatLngBounds();
var points = {};

function createMarker(location)
{
     var point = new GLatLng(location.lat,location.lon);
     var marker = new GMarker(point);
     marker.myMarkerName = 'uniqueNameToIDMarkerPointLater';
     points[marker.myMarkerName] = point;
     GEvent.addListener(marker,"remove",function()
     {
          zoomToBounds(this.myMarkerName);    
     };
     bounds.extend(point);        
     map.addOverlay(marker);                  
}

function zoomToBounds(name)
{
     points[name]=null;
     bounds = new GLatLngBounds();
     for (var point in points)
     {
          if (points[point]!=null)
          {
               bounds.extend(points[point]);
          }
     }
     map.setCenter(bounds.getCenter());
     map.setZoom(map.getBoundsZoomLevel(bounds)-1);
}
...