364 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			364 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
| var travelMode, unitSystem;
 | |
| 
 | |
| GMaps.prototype.getRoutes = function(options) {
 | |
|   switch (options.travelMode) {
 | |
|     case 'bicycling':
 | |
|       travelMode = google.maps.TravelMode.BICYCLING;
 | |
|       break;
 | |
|     case 'transit':
 | |
|       travelMode = google.maps.TravelMode.TRANSIT;
 | |
|       break;
 | |
|     case 'driving':
 | |
|       travelMode = google.maps.TravelMode.DRIVING;
 | |
|       break;
 | |
|     default:
 | |
|       travelMode = google.maps.TravelMode.WALKING;
 | |
|       break;
 | |
|   }
 | |
| 
 | |
|   if (options.unitSystem === 'imperial') {
 | |
|     unitSystem = google.maps.UnitSystem.IMPERIAL;
 | |
|   }
 | |
|   else {
 | |
|     unitSystem = google.maps.UnitSystem.METRIC;
 | |
|   }
 | |
| 
 | |
|   var base_options = {
 | |
|         avoidHighways: false,
 | |
|         avoidTolls: false,
 | |
|         optimizeWaypoints: false,
 | |
|         waypoints: []
 | |
|       },
 | |
|       request_options =  extend_object(base_options, options);
 | |
| 
 | |
|   request_options.origin = /string/.test(typeof options.origin) ? options.origin : new google.maps.LatLng(options.origin[0], options.origin[1]);
 | |
|   request_options.destination = /string/.test(typeof options.destination) ? options.destination : new google.maps.LatLng(options.destination[0], options.destination[1]);
 | |
|   request_options.travelMode = travelMode;
 | |
|   request_options.unitSystem = unitSystem;
 | |
| 
 | |
|   delete request_options.callback;
 | |
|   delete request_options.error;
 | |
| 
 | |
|   var self = this,
 | |
|       routes = [],
 | |
|       service = new google.maps.DirectionsService();
 | |
| 
 | |
|   service.route(request_options, function(result, status) {
 | |
|     if (status === google.maps.DirectionsStatus.OK) {
 | |
|       for (var r in result.routes) {
 | |
|         if (result.routes.hasOwnProperty(r)) {
 | |
|           routes.push(result.routes[r]);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       if (options.callback) {
 | |
|         options.callback(routes, result, status);
 | |
|       }
 | |
|     }
 | |
|     else {
 | |
|       if (options.error) {
 | |
|         options.error(result, status);
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| };
 | |
| 
 | |
| GMaps.prototype.removeRoutes = function() {
 | |
|   this.routes.length = 0;
 | |
| };
 | |
| 
 | |
| GMaps.prototype.getElevations = function(options) {
 | |
|   options = extend_object({
 | |
|     locations: [],
 | |
|     path : false,
 | |
|     samples : 256
 | |
|   }, options);
 | |
| 
 | |
|   if (options.locations.length > 0) {
 | |
|     if (options.locations[0].length > 0) {
 | |
|       options.locations = array_flat(array_map([options.locations], arrayToLatLng,  false));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   var callback = options.callback;
 | |
|   delete options.callback;
 | |
| 
 | |
|   var service = new google.maps.ElevationService();
 | |
| 
 | |
|   //location request
 | |
|   if (!options.path) {
 | |
|     delete options.path;
 | |
|     delete options.samples;
 | |
| 
 | |
|     service.getElevationForLocations(options, function(result, status) {
 | |
|       if (callback && typeof(callback) === "function") {
 | |
|         callback(result, status);
 | |
|       }
 | |
|     });
 | |
|   //path request
 | |
|   } else {
 | |
|     var pathRequest = {
 | |
|       path : options.locations,
 | |
|       samples : options.samples
 | |
|     };
 | |
| 
 | |
|     service.getElevationAlongPath(pathRequest, function(result, status) {
 | |
|      if (callback && typeof(callback) === "function") {
 | |
|         callback(result, status);
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| };
 | |
| 
 | |
| GMaps.prototype.cleanRoute = GMaps.prototype.removePolylines;
 | |
| 
 | |
| GMaps.prototype.renderRoute = function(options, renderOptions) {
 | |
|   var self = this,
 | |
|       panel = ((typeof renderOptions.panel === 'string') ? document.getElementById(renderOptions.panel.replace('#', '')) : renderOptions.panel),
 | |
|       display;
 | |
| 
 | |
|   renderOptions.panel = panel;
 | |
|   renderOptions = extend_object({
 | |
|     map: this.map
 | |
|   }, renderOptions);
 | |
|   display = new google.maps.DirectionsRenderer(renderOptions);
 | |
| 
 | |
|   this.getRoutes({
 | |
|     origin: options.origin,
 | |
|     destination: options.destination,
 | |
|     travelMode: options.travelMode,
 | |
|     waypoints: options.waypoints,
 | |
|     unitSystem: options.unitSystem,
 | |
|     error: options.error,
 | |
|     avoidHighways: options.avoidHighways,
 | |
|     avoidTolls: options.avoidTolls,
 | |
|     optimizeWaypoints: options.optimizeWaypoints,
 | |
|     callback: function(routes, response, status) {
 | |
|       if (status === google.maps.DirectionsStatus.OK) {
 | |
|         display.setDirections(response);
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| };
 | |
| 
 | |
| GMaps.prototype.drawRoute = function(options) {
 | |
|   var self = this;
 | |
| 
 | |
|   this.getRoutes({
 | |
|     origin: options.origin,
 | |
|     destination: options.destination,
 | |
|     travelMode: options.travelMode,
 | |
|     waypoints: options.waypoints,
 | |
|     unitSystem: options.unitSystem,
 | |
|     error: options.error,
 | |
|     avoidHighways: options.avoidHighways,
 | |
|     avoidTolls: options.avoidTolls,
 | |
|     optimizeWaypoints: options.optimizeWaypoints,
 | |
|     callback: function(routes) {
 | |
|       if (routes.length > 0) {
 | |
|         var polyline_options = {
 | |
|           path: routes[routes.length - 1].overview_path,
 | |
|           strokeColor: options.strokeColor,
 | |
|           strokeOpacity: options.strokeOpacity,
 | |
|           strokeWeight: options.strokeWeight
 | |
|         };
 | |
| 
 | |
|         if (options.hasOwnProperty("icons")) {
 | |
|           polyline_options.icons = options.icons;
 | |
|         }
 | |
| 
 | |
|         self.drawPolyline(polyline_options);
 | |
| 
 | |
|         if (options.callback) {
 | |
|           options.callback(routes[routes.length - 1]);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| };
 | |
| 
 | |
| GMaps.prototype.travelRoute = function(options) {
 | |
|   if (options.origin && options.destination) {
 | |
|     this.getRoutes({
 | |
|       origin: options.origin,
 | |
|       destination: options.destination,
 | |
|       travelMode: options.travelMode,
 | |
|       waypoints : options.waypoints,
 | |
|       unitSystem: options.unitSystem,
 | |
|       error: options.error,
 | |
|       callback: function(e) {
 | |
|         //start callback
 | |
|         if (e.length > 0 && options.start) {
 | |
|           options.start(e[e.length - 1]);
 | |
|         }
 | |
| 
 | |
|         //step callback
 | |
|         if (e.length > 0 && options.step) {
 | |
|           var route = e[e.length - 1];
 | |
|           if (route.legs.length > 0) {
 | |
|             var steps = route.legs[0].steps;
 | |
|             for (var i = 0, step; step = steps[i]; i++) {
 | |
|               step.step_number = i;
 | |
|               options.step(step, (route.legs[0].steps.length - 1));
 | |
|             }
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         //end callback
 | |
|         if (e.length > 0 && options.end) {
 | |
|            options.end(e[e.length - 1]);
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   else if (options.route) {
 | |
|     if (options.route.legs.length > 0) {
 | |
|       var steps = options.route.legs[0].steps;
 | |
|       for (var i = 0, step; step = steps[i]; i++) {
 | |
|         step.step_number = i;
 | |
|         options.step(step);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| GMaps.prototype.drawSteppedRoute = function(options) {
 | |
|   var self = this;
 | |
| 
 | |
|   if (options.origin && options.destination) {
 | |
|     this.getRoutes({
 | |
|       origin: options.origin,
 | |
|       destination: options.destination,
 | |
|       travelMode: options.travelMode,
 | |
|       waypoints : options.waypoints,
 | |
|       error: options.error,
 | |
|       callback: function(e) {
 | |
|         //start callback
 | |
|         if (e.length > 0 && options.start) {
 | |
|           options.start(e[e.length - 1]);
 | |
|         }
 | |
| 
 | |
|         //step callback
 | |
|         if (e.length > 0 && options.step) {
 | |
|           var route = e[e.length - 1];
 | |
|           if (route.legs.length > 0) {
 | |
|             var steps = route.legs[0].steps;
 | |
|             for (var i = 0, step; step = steps[i]; i++) {
 | |
|               step.step_number = i;
 | |
|               var polyline_options = {
 | |
|                 path: step.path,
 | |
|                 strokeColor: options.strokeColor,
 | |
|                 strokeOpacity: options.strokeOpacity,
 | |
|                 strokeWeight: options.strokeWeight
 | |
|               };
 | |
| 
 | |
|               if (options.hasOwnProperty("icons")) {
 | |
|                 polyline_options.icons = options.icons;
 | |
|               }
 | |
| 
 | |
|               self.drawPolyline(polyline_options);
 | |
|               options.step(step, (route.legs[0].steps.length - 1));
 | |
|             }
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         //end callback
 | |
|         if (e.length > 0 && options.end) {
 | |
|            options.end(e[e.length - 1]);
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
|   else if (options.route) {
 | |
|     if (options.route.legs.length > 0) {
 | |
|       var steps = options.route.legs[0].steps;
 | |
|       for (var i = 0, step; step = steps[i]; i++) {
 | |
|         step.step_number = i;
 | |
|         var polyline_options = {
 | |
|           path: step.path,
 | |
|           strokeColor: options.strokeColor,
 | |
|           strokeOpacity: options.strokeOpacity,
 | |
|           strokeWeight: options.strokeWeight
 | |
|         };
 | |
| 
 | |
|         if (options.hasOwnProperty("icons")) {
 | |
|           polyline_options.icons = options.icons;
 | |
|         }
 | |
| 
 | |
|         self.drawPolyline(polyline_options);
 | |
|         options.step(step);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| GMaps.Route = function(options) {
 | |
|   this.origin = options.origin;
 | |
|   this.destination = options.destination;
 | |
|   this.waypoints = options.waypoints;
 | |
| 
 | |
|   this.map = options.map;
 | |
|   this.route = options.route;
 | |
|   this.step_count = 0;
 | |
|   this.steps = this.route.legs[0].steps;
 | |
|   this.steps_length = this.steps.length;
 | |
| 
 | |
|   var polyline_options = {
 | |
|     path: new google.maps.MVCArray(),
 | |
|     strokeColor: options.strokeColor,
 | |
|     strokeOpacity: options.strokeOpacity,
 | |
|     strokeWeight: options.strokeWeight
 | |
|   };
 | |
| 
 | |
|   if (options.hasOwnProperty("icons")) {
 | |
|     polyline_options.icons = options.icons;
 | |
|   }
 | |
| 
 | |
|   this.polyline = this.map.drawPolyline(polyline_options).getPath();
 | |
| };
 | |
| 
 | |
| GMaps.Route.prototype.getRoute = function(options) {
 | |
|   var self = this;
 | |
| 
 | |
|   this.map.getRoutes({
 | |
|     origin : this.origin,
 | |
|     destination : this.destination,
 | |
|     travelMode : options.travelMode,
 | |
|     waypoints : this.waypoints || [],
 | |
|     error: options.error,
 | |
|     callback : function() {
 | |
|       self.route = e[0];
 | |
| 
 | |
|       if (options.callback) {
 | |
|         options.callback.call(self);
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| };
 | |
| 
 | |
| GMaps.Route.prototype.back = function() {
 | |
|   if (this.step_count > 0) {
 | |
|     this.step_count--;
 | |
|     var path = this.route.legs[0].steps[this.step_count].path;
 | |
| 
 | |
|     for (var p in path){
 | |
|       if (path.hasOwnProperty(p)){
 | |
|         this.polyline.pop();
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| };
 | |
| 
 | |
| GMaps.Route.prototype.forward = function() {
 | |
|   if (this.step_count < this.steps_length) {
 | |
|     var path = this.route.legs[0].steps[this.step_count].path;
 | |
| 
 | |
|     for (var p in path){
 | |
|       if (path.hasOwnProperty(p)){
 | |
|         this.polyline.push(path[p]);
 | |
|       }
 | |
|     }
 | |
|     this.step_count++;
 | |
|   }
 | |
| };
 |