GoogleMapController.js
Summary
Garmin.MapController Overlays tracks and waypoint data on Google maps.
Version: 1.0
Author: Jason Holmes jason.holmes.at.garmin.com
, Bobby Yang bobby.yang.at.garmin.com
if (Garmin == undefined) var Garmin = {};
Garmin.MapController = function(mapString){};
Garmin.MapController = Class.create();
Garmin.MapController.prototype = {
initialize: function(mapString) {
this.mapElement = $(mapString);
this.usePositionMarker = true;
this.polylines = new Array();
this.markers = new Array();
this.tracks = new Array();
this.markerIndex = 0;
this.timeToCheck = false;
try {
this.map = new GMap2( $(mapString) );
this.map.addControl(new GSmallMapControl());
this.map.addControl(new GMapTypeControl());
new GKeyboardHandler(this.map);
} catch (e) {
alert("WARNING: application will not function properly with missing Google script element or invalid Google map key. Error: "+e);
}
window.onUnload = "GUnload()";
},
centerAndScale: function(lat, lon, scale) {
scale = (scale == null ? 13 : scale);
this.map.setCenter(new GLatLng(lat, lon), scale);
},
drawTrack: function(series, color) {
color = (color == null ? "#ff0000" : color);
var drawAt = Math.ceil(series.getSamplesLength()/300);
var drawnPoints = new Array();
try {
for(var h = 0; h < series.getSamplesLength(); h += drawAt) {
drawnPoints.push(this.createNearestValidLocationPoint(series, h, -1));
}
drawnPoints.push(this.createNearestValidLocationPoint(series, series.getSamplesLength()-1, -1));
} catch( e ) {
alert("GoogleMapControl.drawTrack: " + e.message);
}
if (drawnPoints.length > 0) {
var polyline = new GPolyline(drawnPoints, color, 2, .8)
try {
this.centerAndScale(drawnPoints[0].lat(), drawnPoints[0].lng());
this.map.addOverlay( polyline );
this.addStartFinishMarkers(series);
this.bounds = this.findAZoomLevel(drawnPoints);
this.setOnBounds( this.bounds );
} catch(e){ alert("GoogleMapControl.drawTrack, IE error on map.addOverlay("+polyline+") err: "+e); }
}
},
createNearestValidLocationPoint: function(series, index, incDirection) {
var sample = series.findNearestValidLocationSample(index, -1);
if (sample != null) {
var sampleLat = sample.getMeasurement(Garmin.Sample.MEASUREMENT_KEYS.latitude).getValue();
var sampleLon = sample.getMeasurement(Garmin.Sample.MEASUREMENT_KEYS.longitude).getValue();
return new GLatLng(sampleLat, sampleLon);
} else {
throw new Error("No valid location point in series.");
}
},
drawWaypoint: function(series) {
var sample = series.getSample(0);
this.centerAndScale(sample.getLatitude(), sample.getLongitude(), 15);
this.addMarker(sample.getLatitude(), sample.getLongitude());
},
findAZoomLevel: function(points) {
var bounds = new GLatLngBounds(points[0], points[0]);
for(var i=1; i<points.length-1; i+=3) {
bounds.extend(points[i]);
}
return bounds;
},
sizeAndSetOnBounds: function() {
this.map.checkResize();
this.setOnBounds( this.bounds );
},
setOnBounds: function(bounds) {
this.map.setCenter( this.bounds.getCenter(), this.map.getBoundsZoomLevel(this.bounds) );
},
addMarker: function(latitude, longitude) {
this.addMarkerWithIcon(latitude, longitude, Garmin.MapIcons.getRedIcon());
},
addMarkerWithIcon: function(latitude, longitude, icon) {
var gMarker = new GMarker(new GLatLng(latitude, longitude), icon);
this.markers.push(gMarker);
this.map.addOverlay(gMarker);
},
addStartFinishMarkers: function(series) {
var firstSample = series.getFirstValidLocationSample();
var lastSample = series.getLastValidLocationSample();
this.addMarkerWithIcon(firstSample.getLatitude(), firstSample.getLongitude(), Garmin.MapIcons.getGreenIcon());
this.addMarkerWithIcon(lastSample.getLatitude(), lastSample.getLongitude(), Garmin.MapIcons.getRedIcon());
},
toString: function() {
return "Google Based Map Controller, managing " + this.tracks.length + " track(s)";
}
};
Garmin.MapIcons = function(){};
Garmin.MapIcons = {
getRedIcon: function() {
var icon = new GIcon();
icon.image = "http://trail.motionbased.com/trail/site/images/marker_red.png";
return Garmin.MapIcons._applyShadowAndStuff(icon);
},
getGreenIcon: function() {
var icon = new GIcon();
icon.image = "http://trail.motionbased.com/trail/site/images/marker_green.png";
return Garmin.MapIcons._applyShadowAndStuff(icon);
},
getBaseIcon: function() {
var baseIcon = new GIcon();
baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
baseIcon.iconSize = new GSize(20, 34);
baseIcon.shadowSize = new GSize(37, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);
baseIcon.infoShadowAnchor = new GPoint(18, 25);
return baseIcon;
},
_applyShadowAndStuff: function(icon) {
icon.iconSize = new GSize(12, 20);
icon.shadow = "http://trail.motionbased.com/trail/site/images/marker_shadow.png";
icon.shadowSize = new GSize(22, 20);
icon.iconAnchor = new GPoint(6, 20);
icon.infoWindowAnchor = new GPoint(5, 1);
return icon;
}
}
Documentation generated by
JSDoc on Wed Apr 9 16:12:40 2008