2016-08-06 13 views
0

Ich bin völlig neu in Javascript. Ich habe ein Projekt, um ein Programm (basierend auf einer Webseite) mit Google Maps zu verbinden.Joining Search Box & Löschen von Markierungen in Google Maps API Javascript

ich habe developer.google.com gelesen und bin dabei geblieben. Bitte helfen Sie mir, wie man die Verbindung von zwei Beispielcodes Platz Suchfeld (https://developers.google.com/maps/documentation/javascript/examples/places-searchbox) und Markierung entfernen (https://developers.google.com/maps/documentation/javascript/examples/marker-remove)

dank

Update: dies ist mein Code ist (vorerst)

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
 
    <meta charset="utf-8"> 
 
    <title>Places Searchbox</title> 
 
    <style> 
 
     html, body { 
 
     height: 100%; 
 
     margin: 0; 
 
     padding: 0; 
 
     } 
 
     #map { 
 
     height: 100%; 
 
     } 
 
     .controls { 
 
     margin-top: 10px; 
 
     border: 1px solid transparent; 
 
     border-radius: 2px 0 0 2px; 
 
     box-sizing: border-box; 
 
     -moz-box-sizing: border-box; 
 
     height: 32px; 
 
     outline: none; 
 
     box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); 
 
     } 
 

 
     #pac-input { 
 
     background-color: #fff; 
 
     font-family: Roboto; 
 
     font-size: 15px; 
 
     font-weight: 300; 
 
     margin-left: 12px; 
 
     padding: 0 11px 0 13px; 
 
     text-overflow: ellipsis; 
 
     width: 300px; 
 
     } 
 

 
     #pac-input:focus { 
 
     border-color: #4d90fe; 
 
     } 
 

 
     .pac-container { 
 
     font-family: Roboto; 
 
     } 
 

 
     #type-selector { 
 
     color: #fff; 
 
     background-color: #4d90fe; 
 
     padding: 5px 11px 0px 11px; 
 
     } 
 

 
     #type-selector label { 
 
     font-family: Roboto; 
 
     font-size: 13px; 
 
     font-weight: 300; 
 
     } 
 
     #target { 
 
     width: 345px; 
 
     } 
 
\t #floating-panel { 
 
     position: absolute; 
 
     top: 10px; 
 
     left: 25%; 
 
     z-index: 5; 
 
     background-color: #fff; 
 
     padding: 5px; 
 
     border: 1px solid #999; 
 
     text-align: center; 
 
     font-family: 'Roboto','sans-serif'; 
 
     line-height: 30px; 
 
     padding-left: 10px; 
 
     } 
 
    </style> 
 
    </head> 
 
    <body> 
 
    <input id="pac-input" class="controls" type="text" placeholder="Search Box"> 
 
    <div id="floating-panel"> 
 
     <input onclick="clearMarkers();" type=button value="Hide Markerr"> 
 
     <input onclick="showMarkers();" type=button value="Show All Markerr"> 
 
     <input onclick="deleteMarkers();" type=button value="Delete Markerr"> 
 
    </div> 
 
\t <div id="map"></div> 
 
    <script> 
 
     // This example adds a search box to a map, using the Google Place Autocomplete 
 
     // feature. People can enter geographical searches. The search box will return a 
 
     // pick list containing a mix of places and predicted search terms. 
 

 
     // This example requires the Places library. Include the libraries=places 
 
     // parameter when you first load the API. For example: 
 
     // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places"> 
 

 
     function initAutocomplete() { 
 
\t \t var Markerr = []; 
 
     var map = new google.maps.Map(document.getElementById('map'), { 
 
      center: {lat: -7.266813, lng: 112.770218}, 
 
      zoom: 13, 
 
      mapTypeId: 'roadmap' 
 
     }); 
 
\t \t 
 
\t \t 
 
     // Create the search box and link it to the UI element. 
 
     var input = document.getElementById('pac-input'); 
 
     var searchBox = new google.maps.places.SearchBox(input); 
 
     map.controls[google.maps.ControlPosition.TOP_LEFT].push(input); 
 

 
     // Bias the SearchBox results towards current map's viewport. 
 
     map.addListener('bounds_changed', function() { 
 
      searchBox.setBounds(map.getBounds()); 
 
     }); 
 

 
     var markers = []; 
 
     // Listen for the event fired when the user selects a prediction and retrieve 
 
     // more details for that place. 
 
     searchBox.addListener('places_changed', function() { 
 
      var places = searchBox.getPlaces(); 
 

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

 
      // Clear out the old markers. 
 
      markers.forEach(function(marker) { 
 
      marker.setMap(null); 
 
      }); 
 
      markers = []; 
 

 
      // For each place, get the icon, name and location. 
 
      var bounds = new google.maps.LatLngBounds(); 
 
      places.forEach(function(place) { 
 
      if (!place.geometry) { 
 
       console.log("Returned place contains no geometry"); 
 
       return; 
 
      } 
 
      var icon = { 
 
       url: place.icon, 
 
       size: new google.maps.Size(71, 71), 
 
       origin: new google.maps.Point(0, 0), 
 
       anchor: new google.maps.Point(17, 34), 
 
       scaledSize: new google.maps.Size(25, 25) 
 
      }; 
 

 
      // Create a marker for each place. 
 
      markers.push(new google.maps.Marker({ 
 
       map: map, 
 
       icon: icon, 
 
       title: place.name, 
 
       position: place.geometry.location 
 
      })); 
 

 
      if (place.geometry.viewport) { 
 
       // Only geocodes have viewport. 
 
       bounds.union(place.geometry.viewport); 
 
      } else { 
 
       bounds.extend(place.geometry.location); 
 
      } 
 
      }); 
 
      map.fitBounds(bounds); 
 
     }); 
 
\t \t // ----------------------------- 
 
\t \t // This event listener will call addMarker() when the map is clicked. 
 
     map.addListener('click', function(event) { 
 
      addMarker(event.latLng); 
 
     }); 
 

 
     // Adds a marker at the center of the map. 
 
     addMarker(haightAshbury); 
 
\t \t 
 
\t \t // ********************************* 
 
     } 
 
\t \t // Adds a marker to the map and push to the array. 
 
     function addMarker(location) { 
 
     var marker = new google.maps.Marker({ 
 
      position: location, 
 
      map: map 
 
     }); 
 
     Markerr.push(marker); 
 
     } 
 

 
     // Sets the map on all Markerr in the array. 
 
     function setMapOnAll(map) { 
 
     for (var i = 0; i < Markerr.length; i++) { 
 
      Markerr[i].setMap(map); 
 
     } 
 
     } 
 

 
     // Removes the Markerr from the map, but keeps them in the array. 
 
     function clearMarkers() { 
 
     setMapOnAll(null); 
 
     } 
 

 
     // Shows any Markerr currently in the array. 
 
     function showMarkers() { 
 
     setMapOnAll(map); 
 
     } 
 

 
     // Deletes all Markerr in the array by removing references to them. 
 
     function deleteMarkers() { 
 
     clearMarkers(); 
 
     Markerr = []; 
 
     } 
 
    </script> 
 
    <script src="https://maps.googleapis.com/maps/api/js?key=[API]&libraries=places&callback=initAutocomplete" 
 
     async defer></script> 
 
    </body> 
 
</html>

+0

Ich erhalte einen Javascript-Fehler mit dem entsandten Code: 'Uncaught Reference: haightAshbury nicht – geocodezip

+0

defined' thankyou @geocodezip für deine Antwort. Eigentlich bin ich mir nicht sicher, ob ich im richtigen wat bin (während ich es code). Sie können mir helfen, den Code in https://developers.google.com/maps/documentation/javascript/examples/places-searchbox und https://developers.google.com/maps/documentation/javascript/examples/marker einzugeben -Löschen ? Danke –

Antwort

2

Sie haben Fehler in der geposteten Javascript.

  1. Uncaught ReferenceError: haightAshbury is not defined
  2. Uncaught ReferenceError: Markerr is not defined
  3. ...

Das Hauptproblem ist, dass die markers Array und die map Variable sind nicht im globalen Bereich, wenn diejenigen auf den globalen Bereich bewegt werden und die Verweise auf die Markerr Array entfernt (oder geändert zu markers), funktionieren die Tasten (oder zumindest tun, was ich erwarte).

proof of concept fiddle

Code-Schnipsel:

// global variables 
 
var markers = []; 
 
var map; 
 
function initAutocomplete() { 
 
    // initialize the global map variable 
 
    map = new google.maps.Map(document.getElementById('map'), { 
 
    center: { 
 
     lat: -7.266813, 
 
     lng: 112.770218 
 
    }, 
 
    zoom: 13, 
 
    mapTypeId: 'roadmap' 
 
    }); 
 

 

 
    // Create the search box and link it to the UI element. 
 
    var input = document.getElementById('pac-input'); 
 
    var searchBox = new google.maps.places.SearchBox(input); 
 
    var floatBox = document.getElementById('floating-panel'); map.controls[google.maps.ControlPosition.TOP_LEFT].push(floatBox); 
 

 
    // Bias the SearchBox results towards current map's viewport. 
 
    map.addListener('bounds_changed', function() { 
 
    searchBox.setBounds(map.getBounds()); 
 
    }); 
 

 
    
 
    // Listen for the event fired when the user selects a prediction and retrieve 
 
    // more details for that place. 
 
    searchBox.addListener('places_changed', function() { 
 
    var places = searchBox.getPlaces(); 
 

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

 
    // Clear out the old markers. 
 
    markers.forEach(function(marker) { 
 
     marker.setMap(null); 
 
    }); 
 
    markers = []; 
 

 
    // For each place, get the icon, name and location. 
 
    var bounds = new google.maps.LatLngBounds(); 
 
    places.forEach(function(place) { 
 
     if (!place.geometry) { 
 
     console.log("Returned place contains no geometry"); 
 
     return; 
 
     } 
 
     var icon = { 
 
     url: place.icon, 
 
     size: new google.maps.Size(71, 71), 
 
     origin: new google.maps.Point(0, 0), 
 
     anchor: new google.maps.Point(17, 34), 
 
     scaledSize: new google.maps.Size(25, 25) 
 
     }; 
 

 
     // Create a marker for each place. 
 
     markers.push(new google.maps.Marker({ 
 
     map: map, 
 
     icon: icon, 
 
     title: place.name, 
 
     position: place.geometry.location 
 
     })); 
 

 
     if (place.geometry.viewport) { 
 
     // Only geocodes have viewport. 
 
     bounds.union(place.geometry.viewport); 
 
     } else { 
 
     bounds.extend(place.geometry.location); 
 
     } 
 
    }); 
 
    map.fitBounds(bounds); 
 
    }); 
 
    // ----------------------------- 
 
    // This event listener will call addMarker() when the map is clicked. 
 
    map.addListener('click', function(event) { 
 
    addMarker(event.latLng); 
 
    }); 
 

 
    // Adds a marker at the center of the map. 
 
    // addMarker(haightAshbury); 
 

 
    // ********************************* 
 
} 
 
// Adds a marker to the map and push to the array. 
 

 
function addMarker(location) { 
 
    var marker = new google.maps.Marker({ 
 
    position: location, 
 
    map: map 
 
    }); 
 
    markers.push(marker); 
 
} 
 

 
// Sets the map on all Markerr in the array. 
 
function setMapOnAll(map) { 
 
    for (var i = 0; i < markers.length; i++) { 
 
    markers[i].setMap(map); 
 
    } 
 
} 
 

 
// Removes the Markerr from the map, but keeps them in the array. 
 
function clearMarkers() { 
 
    setMapOnAll(null); 
 
} 
 

 
// Shows any Markerr currently in the array. 
 
function showMarkers() { 
 
    setMapOnAll(map); 
 
} 
 

 
// Deletes all Markerr in the array by removing references to them. 
 
function deleteMarkers() { 
 
    clearMarkers(); 
 
    markers = []; 
 
} 
 
google.maps.event.addDomListener(window, "load", initAutocomplete);
html, 
 
body { 
 
    height: 100%; 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
#map { 
 
    height: 100%; 
 
} 
 

 
.controls { 
 
    margin-top: 10px; 
 
    border: 1px solid transparent; 
 
    border-radius: 2px 0 0 2px; 
 
    box-sizing: border-box; 
 
    -moz-box-sizing: border-box; 
 
    height: 32px; 
 
    outline: none; 
 
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); 
 
} 
 

 
#pac-input { 
 
    background-color: #fff; 
 
    font-family: Roboto; 
 
    font-size: 15px; 
 
    font-weight: 300; 
 
    margin-left: 12px; 
 
    padding: 0 11px 0 13px; 
 
    text-overflow: ellipsis; 
 
    width: 300px; 
 
} 
 

 
#pac-input:focus { 
 
    border-color: #4d90fe; 
 
} 
 

 
.pac-container { 
 
    font-family: Roboto; 
 
} 
 

 
#type-selector { 
 
    color: #fff; 
 
    background-color: #4d90fe; 
 
    padding: 5px 11px 0px 11px; 
 
} 
 

 
#type-selector label { 
 
    font-family: Roboto; 
 
    font-size: 13px; 
 
    font-weight: 300; 
 
} 
 

 
#target { 
 
    width: 345px; 
 
} 
 

 
#floating-panel { 
 
    position: absolute; 
 
    top: 10px; 
 
    left: 25%; 
 
    z-index: 5; 
 
    background-color: #fff; 
 
    padding: 5px; 
 
    border: 1px solid #999; 
 
    text-align: center; 
 
    font-family: 'Roboto', 'sans-serif'; 
 
    line-height: 30px; 
 
    padding-left: 10px; 
 
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script> 
 
<div id="floating-panel"> 
 
<input id="pac-input" class="controls" type="text" placeholder="Search Box" /><br> 
 
    <input onclick="clearMarkers();" type=button value="Hide Markerr"> 
 
    <input onclick="showMarkers();" type=button value="Show All Markerr"> 
 
    <input onclick="deleteMarkers();" type=button value="Delete Markerr"> 
 
</div> 
 
<div id="map"></div>

+0

Vielen Dank @geocodezip Ich habe es selbst versucht, und passen Sie es an meine Struktur. es ist wirklich Arbeit. Nochmals vielen Dank –

+0

Wenn dies Ihre Frage beantwortet, [akzeptieren Sie es] (http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work) – geocodezip