Source code of a graphical tool for drawing and computing distances over Google maps.
Run Tool | index.html | main.css | formatters.js | geoCircle.js | geoCode.js | geo.js | index.js | mapControls.js | tableManager.js | util.js | wayPoint.js | wayPointsManager.js
// Copyright 2006-2008 (c) Paul Demers <paul@acscdg.com> // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License along // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA., or visit one // of the links here: // http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt // http://www.acscdg.com/LICENSE.txt ////////////////////////////////////////////////////////////////// // // map drawing and distance tools. // Web site with this code running: http://www.acscdg.com/ // Way point object. Manages a single way point. // Dependency on other modules: // geo.js (for EarthVector) // formatters.js // Google maps (for geo point object). // needs access to the document root. // //// Renders a way point into an HTML TR element. function wayPointToElement(distanceUnits) { var trElement = document.createElement("tr"); // Allow different formats for odd and even rows, for example to shade them // differently for legibility. The classes are defined in a CSS file. var isEven = (Math.round(this.pointNumber / 2) * 2) == this.pointNumber; if (isEven) trElement.className = "ptsroweven"; else trElement.className = "ptsrowodd"; var tdElement; var distanceMultiplier = getDistanceMultiplier(distanceUnits); tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(this.courseNumber.toString())); tdElement.className = "numcol"; trElement.appendChild(tdElement); // 0 tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(this.pointNumber.toString())); tdElement.className = "numcol"; trElement.appendChild(tdElement); // 1 tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(myLatToString(this.point))); tdElement.className = "llcol"; trElement.appendChild(tdElement); // 2 tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(myLngToString(this.point))); tdElement.className = "llcol"; trElement.appendChild(tdElement); // 3 var distanceString; var azimuthString; if (this.vectorFromLastPoint == null) { distanceString = " "; azimuthString = " "; totalDistanceString = " "; } else { distanceString = formatFloat(this.vectorFromLastPoint.distanceNM * distanceMultiplier); azimuthString = (Math.round(this.vectorFromLastPoint.azimuthDegrees)).toString(); totalDistanceString = formatFloat(this.totalDistanceNM * distanceMultiplier); } tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(distanceString)); // distance tdElement.className = "distcol"; trElement.appendChild(tdElement); // 4 tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(azimuthString)); // Azimuth deg. tdElement.className = "distcol"; trElement.appendChild(tdElement); // 5 tdElement = document.createElement("td"); tdElement.appendChild(document.createTextNode(totalDistanceString)); // Total distance. tdElement.className = "distcol"; trElement.appendChild(tdElement); // 6 return trElement; } // //// Updates an existing TR element, faster then drawing new. function wayPointUpdateElement(distanceUnits) { // Replace the lat, lng, az., and dists from a trElement with those from // this waypoint. used for fast redraws of the table. // child 0 is course number. // child 1 is point number. var tdElement = this.tableRowElement.childNodes[2]; // lat. tdElement.replaceChild(document.createTextNode(myLatToString(this.point)), tdElement.childNodes[0]); tdElement = this.tableRowElement.childNodes[3]; // lng. tdElement.replaceChild(document.createTextNode(myLngToString(this.point)), tdElement.childNodes[0]); // since this is assumed to be the same point number, // if vectorFromLastPoint was null before, then it's still null now, so no need to replace spaces. if (this.vectorFromLastPoint != null) { var distanceMultiplier = getDistanceMultiplier(distanceUnits); tdElement = this.tableRowElement.childNodes[4]; // dist tdElement.replaceChild(document.createTextNode( formatFloat(this.vectorFromLastPoint.distanceNM * distanceMultiplier)), tdElement.childNodes[0]); tdElement = this.tableRowElement.childNodes[5]; // azimuth tdElement.replaceChild(document.createTextNode( Math.round(this.vectorFromLastPoint.azimuthDegrees)), tdElement.childNodes[0]); tdElement = this.tableRowElement.childNodes[6]; // total dist. tdElement.replaceChild(document.createTextNode( formatFloat(this.totalDistanceNM * distanceMultiplier)), tdElement.childNodes[0]); } return this.tableRowElement; } // //// function wayPointUpdate(map, point, distanceUnits) { if (this.courseLine != null) { map.removeOverlay(this.courseLine); this.courseLine = null; } // TODO: Check that point is really different. this.point = point; if (this.lastWayPoint != null) { var bestCourse = new BestCourse(this.lastWayPoint.point, point); this.vectorFromLastPoint = bestCourse.getVector(); this.totalDistanceNM = this.lastWayPoint.totalDistanceNM + this.vectorFromLastPoint.distanceNM; this.courseLine = bestCourse.getLine(); map.addOverlay(this.courseLine); } else { this.totalDistanceNM = 0; this.vectorFromLastPoint = null; // courseLine set to null, above. } if (this.tableRowElement != null) this.updateElement(distanceUnits); else this.tableRowElement = this.toElement(distanceUnits); } // //// function WayPoint(map, courseNumber, pointNumber, point, lastWayPoint, distanceUnits) { this.toElement = wayPointToElement; this.updateElement = wayPointUpdateElement; this.update = wayPointUpdate; this.courseNumber = courseNumber; this.pointNumber = pointNumber; this.lastWayPoint = lastWayPoint; this.name = pointNumber.toString(); this.update(map, point, distanceUnits); }