function initialize() {
"use strict";
var map = new google.maps.Map(document.getElementById('map-canvas'), {
center: new google.maps.LatLng(-37.8176108, 145.0422631),
zoom: 1
}),
field = document.getElementById('address'),
form = field.form,
marker = new google.maps.Marker(),
info = new google.maps.InfoWindow(),
//I use this object later to hide previously added markers
mvc = new google.maps.MVCObject(),
geocoder = new google.maps.Geocoder(),
service = new google.maps.places.PlacesService(map);
//use the field as control when you want to
map.controls[google.maps.ControlPosition.TOP_CENTER].push(form);
google.maps.event.addListener(marker, 'click', function() {
google.maps.event.trigger(info, 'open', this);
});
//this will open the infowindow for a clicked marker
//the infowindow-content will be retrieved from the
//content-property of the marker
google.maps.event.addListener(info, 'open', function(marker) {
this.setContent(marker.get('content'));
this.open(marker.getMap(), marker);
});
marker.bindTo('map', mvc, 'map');
//this separates the geocoding/places-search from the map-creation
//it will be executed when the form will be submitted
//(e.g. by hitting ENTER in the address-field)
google.maps.event.addDomListener(form, 'submit', function(e) {
if (e) e.preventDefault();
//this hides all markers and the infowindow
mvc.set('map', null);
if (field.value.match(/\S+/)) {
geocoder.geocode({
'address': field.value
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
mvc.set('map', map);
if (results[0].geometry.viewport) {
map.fitBounds(results[0].geometry.viewport);
} else {
map.setCenter(results[0].geometry.location);
}
marker.setValues({
position: results[0].geometry.location,
content: results[0].formatted_address
});
service.nearbySearch({
location: results[0].geometry.location,
radius: 1000,
types: ['train_station', 'bus_station', 'subway_station', 'transit_station']
}, function(places, status) {
if (status == google.maps.places.PlacesServiceStatus.OK) {
//will be used later to set the viewport
//so that it contains all markers
var b = new google.maps.LatLngBounds();
places.forEach(function(place, i) {
var m = new google.maps.Marker({
position: place.geometry.location,
icon: 'http://labs.google.com/ridefinder/images/mm_20_yellow.png',
content: place.name
});
b.extend(place.geometry.location);
m.bindTo('map', mvc, 'map');
google.maps.event.addListener(m, 'map_changed', function() {
if (!this.getMap()) this.unbindAll();
});
google.maps.event.addListener(m, 'click', function() {
google.maps.event.trigger(info, 'open', this);
});
});
if (places.length > 1) {
map.fitBounds(b);
}
} else {
alert('NearbySearch was not successful for the following reason: ' + status);
}
});
} else {
alert('Geocoding was not successful for the following reason: ' + status);
}
});
}
return false;
});
//trigger form-submit for the initial search
google.maps.event.trigger(form, 'submit');
}
google.maps.event.addDomListener(window, 'load', initialize);
html,
body,
#map-canvas {
height: 100%;
margin: 0;
padding: 0;
}
#address {
width: 300px;
}
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?libraries=places&v=3">
</script>
<div id="map-canvas"></div>
<form>
<input id="address" value="21 Elphin Grove, Hawthorn VIC 3122, Australia" placeholder="insert an address and hit ENTER" title="insert an address and hit ENTER"/>
</form>
谢谢莫尔博士。它的工作原理是我想要的。 – NanoStar