Чтобы ответить на пункт 3:
Вам необходимо добавить прослушиватель для связанных изменений:
google.maps.event.addListener(map, 'bounds_changed', function() {
displayInfo(distanceWidget,map);
});
Обратите внимание, что я добавил параметр карты в ваш метод displayInfo, который теперь выглядит следующим образомthis:
function displayInfo(widget, map) {
var info = document.getElementById('info');
info.innerHTML = 'Position: ' + widget.get('position') + '<br />' + 'Distance: ' + widget.get('distance') + '<br />' + 'Bounds: ' + widget.get('bounds') +'<br/>Map bounds: '+ map.getBounds();
}
С этим изменением вы увидите, что вы можете определить, когда границы вашего distanceWidget превышают границы карты, и принять необходимые меры для уменьшения диаметра вашего виджета.
Мой форк (который включает в себя измененные выше) вашего превосходного jsFiddle находится здесь: http://jsfiddle.net/bhofmann/AT8uz/