2015-02-27 4 views
-1

У меня есть маркер, вызывающий маркер на месте. Найдите наряду с захватом его getDetails на карте google v3. Внутри Place Поиск:getDetails, но не может удалить

<!DOCTYPE html> 
<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    <meta charset="utf-8"> 
    <style> 

     html, body, #map-canvas { 
     height: 100%; 
     margin: 0px; 
     padding: 0px; 
     width: 1500px; 
     margin-left: auto; 
     margin-right: auto; 
     } 

    </style> 
    <title>Places search box</title> 

    <script type='text/javascript' src='sortable/ext/jquery-1.9.1.js'></script> 
    <script type="text/javascript" src="sortable/ext/jquery-ui.js"></script> 


    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&signed_in=true&libraries=places"></script> 

    <script> 
    var markers = []; 

    var map; 

    var marker; 

function initialize() { 

    var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 

    //CAN REVIEW FOR CURRENT LOCATION 
    var mapOptions = { 
     zoom: 8, 
     mapTypeId: 'roadmap' 
    }; 

    var defaultBounds = new google.maps.LatLngBounds(
     new google.maps.LatLng(0, 0)); 
    map.fitBounds(defaultBounds); 

    // Create the search box and link it to the UI element. 
    var input = /** @type {HTMLInputElement} */(
     document.getElementById('pac-input')); 
    map.controls[google.maps.ControlPosition.TOP_LEFT].push(input); 

    var searchBox = new google.maps.places.SearchBox(
    /** @type {HTMLInputElement} */(input)); 

    // [START region_getplaces] 
    // Listen for the event fired when the user selects an item from the 
    // pick list. Retrieve the matching places for that item. 
    google.maps.event.addListener(searchBox, 'places_changed', function() { 
     var places = searchBox.getPlaces(); 

     //Taking input into array 
     var item = document.getElementById("pac-input"); 

    if (places.length == 0) { 
     return; 
    } 

    //for (var i = 0, marker; marker = markers[i]; i++) { 
    google.maps.Map.prototype.clearMarkers = function() { 
    for (var i = 0; i < this.markers.length; i++) { 
     this.markers[i].setMap(null); 

     map.setZoom(8); 

    } 
    this.markers = new Array(); 
    markers.length = 0; 
    } 
    // For each place, get the icon, place name, and location. 
    markers = []; 

    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0, place; place = places[i]; i++) { 

     // Create a marker for each place. 

     var marker = new google.maps.Marker({ 
      place_id: place.place_id 
     }); 


     //Infowindow 
     var infowindow = new google.maps.InfoWindow({ 
       //content: content 
      }); 

     //Details Services 
     var request = { 
      placeId: marker.place_id 
     }; 

     service = new google.maps.places.PlacesService(map); 

     service.getDetails(request, function(place, status) { 
      if (status == google.maps.places.PlacesServiceStatus.OK) { 
       var marker = new google.maps.Marker({ 
       map: map, 
       position: place.geometry.location 
       }); 
       google.maps.event.addListener(marker, 'click', function() { 

       infowindow.setContent(place.name); 

       infowindow.open(map, this); 
       }); 
      } 
      }); 

     markers.push(marker); 
     //searchmarkers.push(marker); 

     bounds.extend(place.geometry.location); 
    } 

    map.fitBounds(bounds); 
    //map.fitBounds(places[0].geometry.viewport); 
    map.setZoom(12); 
    }); 
// [END region_getplaces] 
} 


google.maps.event.addDomListener(window, 'load', initialize); 
    </script> 
    </head> 
    <body> 
     <input id="pac-input" class="controls" type="text" placeholder="Search Box"> 

    <div id="map-canvas" class="dropit" style="float:left;width:70%;height:100%;"></div> 

    </body> 
</html> 

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

Я удалил markers.push(marker);, и он все еще как-то добавляет маркер и не может быть удален.

Предложения?

EDIT:

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

Пожалуйста, помогите удалить все маркеры ...

EDIT 2:

Благодаря geocodezip. Пожалуйста, используйте скрипт, который он создал для отладки ... по-прежнему не может заставить его работать. http://jsfiddle.net/dw7moor5/

Обратите внимание, что поиск двух разных вещей и остатков по-прежнему будет отображаться.

+0

Просьба [Minimal, Complete, испытана и читаемый примера] (http://stackoverflow.com/help/mcve), который демонстрирует проблему. Код, который вы опубликовали, выглядит так: _should_ работает, но зависит от того, как вы его используете, независимо от того, делает он это или нет. – geocodezip

+0

Возможный дубликат [API Карт Google v3: как удалить все маркеры?] (Http://stackoverflow.com/questions/1544739/google-maps-api-v3-how-to-remove-all-markers) – geocodezip

+0

I может удалить маркер, который создается поиском по местам, но я не могу удалить маркеры, созданные getDetails – MilkACow

ответ

0

В вашем коде были синтаксические ошибки. Рабочая версия в фрагменте кода ниже. Добавлены маркеры и рамки к объекту карты, вам не нужно это делать, но вам нужно быть последовательным.

var map; 
 

 
google.maps.Map.prototype.clearMarkers = function() { 
 
    if (this.markers && this.markers.length > 0) { 
 
    for (var i = 0; i < this.markers.length; i++) { 
 
     this.markers[i].setMap(null); 
 

 
     if (!!map) map.setZoom(8); 
 

 
    } 
 
    } 
 
    this.markers = []; 
 
    this.markers.length = 0; 
 

 
} 
 

 
function initialize() { 
 

 
    var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions); 
 

 
    //CAN REVIEW FOR CURRENT LOCATION 
 
    var mapOptions = { 
 
    zoom: 8, 
 
    mapTypeId: 'roadmap' 
 
    }; 
 

 
    var defaultBounds = new google.maps.LatLngBounds(
 
    new google.maps.LatLng(0, 0)); 
 
    map.fitBounds(defaultBounds); 
 

 
    // Create the search box and link it to the UI element. 
 
    var input = /** @type {HTMLInputElement} */ 
 
    (
 
     document.getElementById('pac-input')); 
 
    map.controls[google.maps.ControlPosition.TOP_LEFT].push(input); 
 

 
    var searchBox = new google.maps.places.SearchBox(
 
    /** @type {HTMLInputElement} */ 
 
    (input)); 
 

 
    // [START region_getplaces] 
 
    // Listen for the event fired when the user selects an item from the 
 
    // pick list. Retrieve the matching places for that item. 
 
    google.maps.event.addListener(searchBox, 'places_changed', function() { 
 
    map.clearMarkers(); 
 
    var places = searchBox.getPlaces(); 
 

 
    //Taking input into array 
 
    var item = document.getElementById("pac-input"); 
 

 
    if (places.length == 0) { 
 
     return; 
 
    } 
 

 

 
    map._bounds = new google.maps.LatLngBounds(); 
 
    for (var i = 0, place; place = places[i]; i++) { 
 

 

 
     //Infowindow 
 
     var infowindow = new google.maps.InfoWindow({ 
 
     //content: content 
 
     }); 
 

 
     //Details Services 
 
     var request = { 
 
     placeId: place.place_id 
 
     }; 
 

 
     service = new google.maps.places.PlacesService(map); 
 

 
     service.getDetails(request, function(place, status) { 
 
     if (status == google.maps.places.PlacesServiceStatus.OK) { 
 

 
      var marker = new google.maps.Marker({ 
 
      map: map, 
 
      position: place.geometry.location 
 
      }); 
 
      google.maps.event.addListener(marker, 'click', function() { 
 

 
      infowindow.setContent(place.name); 
 

 
      infowindow.open(map, this); 
 
      }); 
 
      map.markers.push(marker); 
 
      map._bounds.extend(marker.getPosition()); 
 
      map.fitBounds(map._bounds); 
 
     } 
 
     }); 
 

 

 
     //searchmarkers.push(marker); 
 

 
     map._bounds.extend(place.geometry.location); 
 
    } 
 

 
    map.fitBounds(map._bounds); 
 
    //map.fitBounds(places[0].geometry.viewport); 
 
    // map.setZoom(12); 
 
    }); 
 
    // [END region_getplaces] 
 
} 
 

 

 
google.maps.event.addDomListener(window, 'load', initialize);
html, 
 
body, 
 
#map-canvas { 
 
    height: 100%; 
 
    margin: 0px; 
 
    padding: 0px; 
 
    width: 100%; 
 
    margin-left: auto; 
 
    margin-right: auto; 
 
}
<script src="https://maps.googleapis.com/maps/api/js?sensor=false&libraries=places"></script> 
 
<input id="pac-input" class="controls" type="text" placeholder="Search Box"> 
 
<div id="map-canvas" class="dropit" ></div>

+0

Огромное вам спасибо.Некоторое время царапала мне голову ... – MilkACow

+0

У меня был другой вопрос .. относительно этого. Предположим, что я добавляю «id: i» в маркер и пытаюсь использовать onclick для удаления маркера, но на самом деле этого не делает. Так как this.id показывает последний идентификатор маркера. id фактически не добавляется к соответствующему маркеру? – MilkACow

+0

Это другой вопрос. this.id должен содержать свойство id маркера для этого прослушивателя кликов (маркер «clicked»). Трудно сказать, что происходит без полного примера. – geocodezip