130 lines
4.2 KiB
JavaScript
130 lines
4.2 KiB
JavaScript
|
var localSearch = new GlocalSearch();
|
||
|
var routePoints = new Array(0);
|
||
|
var routeMarkers = new Array(0);
|
||
|
var lineWidth = 1;
|
||
|
var lineColor = '#ff0066';
|
||
|
var routePath;
|
||
|
var map = new google.maps.Map(document.getElementById("map_canvas"), {
|
||
|
zoom: 1,
|
||
|
center: new google.maps.LatLng(0, 0),
|
||
|
mapTypeId: google.maps.MapTypeId.ROADMAP,
|
||
|
draggableCursor: 'crosshair',
|
||
|
mapTypeControlOptions: {
|
||
|
style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
|
||
|
}
|
||
|
});
|
||
|
google.maps.event.addListener(map, 'click', function (event) {
|
||
|
clickatpoint(event.latLng);
|
||
|
});
|
||
|
|
||
|
function clickatpoint(point) {
|
||
|
routePoints.push(point);
|
||
|
var marker = placeMarker(point, routePoints.length);
|
||
|
routeMarkers.push(marker);
|
||
|
if (!(routePath == undefined)) {
|
||
|
routePath.setMap(null);
|
||
|
}
|
||
|
routePath = getRoutePath();
|
||
|
routePath.setMap(map);
|
||
|
updateDisplay();
|
||
|
}
|
||
|
function getRoutePath() {
|
||
|
var routePath = new google.maps.Polyline({
|
||
|
path: routePoints,
|
||
|
strokeColor: lineColor,
|
||
|
strokeOpacity: 1.0,
|
||
|
strokeWeight: lineWidth,
|
||
|
geodesic: true
|
||
|
});
|
||
|
return routePath;
|
||
|
}
|
||
|
function clearMap() {
|
||
|
if (routeMarkers) {
|
||
|
for (i in routeMarkers) {
|
||
|
routeMarkers[i].setMap(null);
|
||
|
}
|
||
|
}
|
||
|
routePoints = new Array(0);
|
||
|
routeMarkers = new Array(0);
|
||
|
if (!(routePath == undefined)) {
|
||
|
routePath.setMap(null);
|
||
|
}
|
||
|
document.getElementById("distance").value = "0.000";
|
||
|
}
|
||
|
function ftn_quickfind(address) {
|
||
|
localSearch.setSearchCompleteCallback(null, function () {
|
||
|
if (localSearch.results[0]) {
|
||
|
clickatpoint(new google.maps.LatLng(localSearch.results[0].lat,
|
||
|
localSearch.results[0].lng));
|
||
|
}
|
||
|
});
|
||
|
localSearch.execute(address);
|
||
|
}
|
||
|
function placeMarker(location, number) {
|
||
|
var image = new google.maps.MarkerImage('http://www.daftlogic.com/images/gmmarkersv3/stripes.png', new google.maps.Size(20, 34), new google.maps.Point(0, 0), new google.maps.Point(9, 33));
|
||
|
var shadow = new google.maps.MarkerImage('http://www.daftlogic.com/images/gmmarkersv3/shadow.png', new google.maps.Size(28, 22), new google.maps.Point(0, 0), new google.maps.Point(1, 22));
|
||
|
var text = "(" + (number) + ")" + location;
|
||
|
var marker = new google.maps.Marker({
|
||
|
position: location,
|
||
|
map: map,
|
||
|
shadow: shadow,
|
||
|
icon: image,
|
||
|
title: text,
|
||
|
draggable: true
|
||
|
});
|
||
|
google.maps.event.addListener(marker, 'dragend', function (event) {
|
||
|
routePoints[number - 1] = event.latLng;
|
||
|
routePath.setMap(null);
|
||
|
routePath = getRoutePath();
|
||
|
routePath.setMap(map);
|
||
|
updateDisplay();
|
||
|
});
|
||
|
return marker;
|
||
|
}
|
||
|
function clearLastLeg() {
|
||
|
if (routePoints.length < 2) return;
|
||
|
routeMarkers[routeMarkers.length - 1].setMap(null);
|
||
|
if (!(routePath == undefined)) {
|
||
|
routePath.setMap(null);
|
||
|
}
|
||
|
routePoints.pop();
|
||
|
routeMarkers.pop();
|
||
|
routePath = getRoutePath();
|
||
|
routePath.setMap(map);
|
||
|
updateDisplay();
|
||
|
}
|
||
|
function greatcircle(lat1, lon1, lat2, lon2) {
|
||
|
var ra = Math.PI / 180;
|
||
|
var f = Math.cos(lat1 * ra) * Math.cos(lat2 * ra);
|
||
|
f *= Math.pow(Math.sin((lon1 * ra - lon2 * ra) / 2), 2);
|
||
|
f += Math.pow(Math.sin((lat1 * ra - lat2 * ra) / 2), 2);
|
||
|
f = 6372802 * 2 * Math.asin(Math.sqrt(f)); // geometric mean
|
||
|
// read: http://math.wikia.com/index.php?title=Elliptical_great-circle_radius_average
|
||
|
// http://en.wikipedia.org/w/index.php?title=Talk:Earth/Archive_7&oldid=256964396#Mean_radius
|
||
|
return f;
|
||
|
}
|
||
|
function updateDisplay() {
|
||
|
var a = routePath.getPath(),
|
||
|
len = a.getLength(),
|
||
|
dist = 0;
|
||
|
for (var i = 0; i < len - 1; i++) {
|
||
|
var pos1 = a.getAt(i);
|
||
|
var pos2 = a.getAt(i+1);
|
||
|
dist += greatcircle(pos1.lat(), pos1.lng(), pos2.lat(), pos2.lng());
|
||
|
}
|
||
|
document.getElementById("distance").value = dist.toFixed();
|
||
|
}
|
||
|
|
||
|
function submitenter(myfield, e) {
|
||
|
var keycode;
|
||
|
if (window.event) keycode = window.event.keyCode;
|
||
|
else if (e) keycode = e.which;
|
||
|
else return true;
|
||
|
if (keycode == 13) {
|
||
|
ftn_quickfind(myfield.value);
|
||
|
return false;
|
||
|
} else {
|
||
|
return true;
|
||
|
}
|
||
|
}
|