GarminGpsDataStructures.js
Summary
Garmin.DeviceControl A mostly deprecated library of GPS track and waypoint data structures along with parsing tools.
Version: 1.0
Author: Developer developer.connect.at.garmin.com
if (Garmin == undefined) var Garmin = {};
Garmin.WayPoint = function(lat, lng, elev, name, addrdetails, desc, sym, type, cmt){};
Garmin.WayPoint = Class.create();
Garmin.WayPoint.prototype = {
initialize: function(lat, lng, elev, name, addrdetails, desc, sym, type, cmt) {
this.lat = lat;
this.lng = lng;
this.name = name;
this.addrdetails = addrdetails;
if( this.addrdetails ) {
this._initSubArea();
}
this.elev = elev;
this.desc = desc;
this.sym = sym;
this.type = type;
this.cmt = cmt;
this.date = null;
},
_initSubArea: function() {
if( this.addrdetails.Country ) {
this.country = this.addrdetails.Country.CountryNameCode;
if (this.addrdetails.Country.AdministrativeArea) {
this.state = this.addrdetails.Country.AdministrativeArea.AdministrativeAreaName;
if( this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea ) {
if( this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) {
this.city = this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
if( this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare ) {
this.streetaddr = this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
}
if( this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode ) {
this.zip = this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
}
} else {
this.city = this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName;
if( this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Thoroughfare ) {
this.streetaddr = this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.Thoroughfare.ThoroughfareName;
}
if( this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.PostalCode ) {
this.zip = this.addrdetails.Country.AdministrativeArea.SubAdministrativeArea.PostalCode.PostalCodeNumber;
}
}
} else {
if( this.addrdetails.Country.AdministrativeArea.Locality) {
this.city = this.addrdetails.Country.AdministrativeArea.Locality.LocalityName;
if( this.addrdetails.Country.AdministrativeArea.Locality.Thoroughfare ) {
this.streetaddr = this.addrdetails.Country.AdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
}
if( this.addrdetails.Country.AdministrativeArea.Locality.PostalCode ) {
this.zip = this.addrdetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
}
} else {
this.city = this.addrdetails.Country.AdministrativeArea.SubAdministrativeAreaName;
if( this.addrdetails.Country.AdministrativeArea.Thoroughfare ) {
this.streetaddr = this.addrdetails.Country.AdministrativeArea.Thoroughfare.ThoroughfareName;
}
if( this.addrdetails.Country.AdministrativeArea.PostalCode ) {
this.zip = this.addrdetails.Country.AdministrativeArea.PostalCode.PostalCodeNumber;
}
}
}
}
}
},
getSymbol: function() {
return this.sym;
},
getType: function() {
return this.type;
},
getName: function() {
return this.name;
},
getAddress: function() {
return (this.addrdetails != null) ? "<gpxx:Address><gpxx:StreetAddress>"
+ this.getStreetAddr() + "</gpxx:StreetAddress><gpxx:City>"
+ this.getCity() + "</gpxx:City><gpxx:State>"
+ this.getState() + "</gpxx:State><gpxx:PostalCode>"
+ this.getZip() + "</gpxx:PostalCode></gpxx:Address>" : null;
},
getCountry: function() {
return this.country;
},
getState: function() {
return this.state;
},
getCity: function() {
return this.city;
},
getStreetAddr: function() {
return this.streetaddr;
},
getZip: function() {
return this.zip;
},
getDescription: function() {
return this.desc;
},
getLat: function() {
return this.lat;
},
getLng: function() {
return this.lng;
},
getElev: function() {
return this.elev;
},
getComment: function() {
return this.cmt;
},
getDate: function() {
return this.date;
},
toString: function() {
return "Waypoint: (" + this.getLat() + ", " + this.getLng() + ")";
}
};
Garmin.TrackPoint = function(){};
Garmin.TrackPoint = Class.create();
Garmin.TrackPoint.prototype = {
initialize: function() {
this.measurements = null;
this.date = null;
},
getMeasurement: function(context) {
var meas = this.measurements[context];
if(meas == undefined) {
meas = null;
}
return meas;
},
isValidLocation: function() {
return ( (this.getLat() != "null") && (this.getLat() != null) && (this.getLng() != "null") && (this.getLng() != null));
},
getLat: function() {
var meas = this.getMeasurement( "latitude" );
if(meas == null) {
return null;
} else {
return meas.value;
}
},
getLng: function() {
var meas = this.getMeasurement( "longitude" );
if(meas == null) {
return null;
} else {
return meas.value;
}
},
getElev: function() {
var meas = this.getMeasurement( "elevation" );
if(meas == null) {
return null;
} else {
return meas.value;
}
},
getDate: function() {
return this.date;
},
toString: function() {
return "TrackPoint Point: (" + this.getLat() + ", " + this.getLng() + ")";
}
};
Garmin.TrackSegment = function(){};
Garmin.TrackSegment = Class.create();
Garmin.TrackSegment.prototype = {
initialize: function() {
this.points = new Array();
},
addTrackPoint: function(trackPointObject) {
this.points.push(trackPointObject);
},
findNearestValidLocationPoint: function(index, incDirection) {
if( this.getPoint( index ).isValidLocation() ) {
return this.getPoint( index );
} else if( index >= this.getLength() ) {
return this.findNearestValidLocationPoint(this.getLength()-1, -1);
} else {
return this.findNearestValidLocationPoint(index+incDirection, incDirection);
}
},
getPoint: function(index) {
index = Math.floor(index);
if(index >= this.getLength()) {
return this.getEnd();
}
if(index <= 0) {
return this.getStart();
}
return this.points[index];
},
getStart: function() {
return this.points[0];
},
getEnd: function() {
return this.points[this.getLength()-1];
},
getStartLat: function() {
return this.getStart().getLat();
},
getStartLng: function() {
return this.getStart().getLng();
},
getStartDate: function() {
return this.getStart().getDate();
},
getEndDate: function() {
return this.getEnd().getDate();
},
getDuration: function() {
return this.getStartDate().getDurationTo(this.getEndDate());
},
getLength: function() {
return this.points.length;
},
toString: function() {
return "Track Segment w/ " + this.getLength() + " points.";
}
};
Garmin.Track = function(){};
Garmin.Track = Class.create();
Garmin.Track.prototype = {
initialize: function() {
this.segments = new Array();
},
addSegment: function(trackSegment) {
this.segments.push(trackSegment);
},
getSegment: function(index) {
index = Math.floor(index);
if(index >= this.getLastSegment()) {
return this.getEnd();
}
if(index <= 0) {
return this.getFirstSegment();
}
return this.segments[index];
},
getFirstSegment: function() {
return this.segments[0];
},
getLastSegment: function() {
return this.segments[this.getNumSegments()-1];
},
getNumSegments: function() {
return this.segments.length;
},
getStart: function() {
return this.getFirstSegment().getStart();
},
getStartLat: function() {
return this.getFirstSegment().getStartLat();
},
getStartLng: function() {
return this.getFirstSegment().getStartLng();
},
getStartDate: function() {
return this.getFirstSegment().getStartDate();
},
getEnd: function() {
return this.getLastSegment().getEnd();
},
getEndDate: function() {
return this.getLastSegment().getEndDate();
},
getDuration: function() {
return this.getStartDate().getDurationTo(this.getEndDate());
},
getLength: function() {
var length = 0;
for( var i=0; i < this.segments.length; i++ ) {
length += this.segments[i].getLength();
}
return length;
},
isDrawable: function() {
return (this.getStartDate() != null);
},
toString: function() {
return "Track w/ " + this.getNumSegments() + " segments.";
}
};
Garmin.GpsDataFactory = function(){};
Garmin.GpsDataFactory = Class.create();
Garmin.GpsDataFactory.prototype = {
initialize: function() {
this.tracks = new Array();
this.waypoints = new Array();
},
getTracks: function() {
return this.tracks;
},
getWaypoints: function() {
return this.waypoints;
},
parseGpxString: function(gpxString) {
var gpxDocument = Garmin.XmlConverter.toDocument(gpxString);
this.parseGpxDocument(gpxDocument);
},
parseGpxDocument: function(gpxDocument) {
this.parseGpxTracks(gpxDocument);
this.parseGpxWaypoints(gpxDocument);
},
parseGpxTracks: function(gpxDocument) {
var tracks = new Array();
var trackNodes = gpxDocument.getElementsByTagName("trk");
for( var i=0; i < trackNodes.length; i++ ) {
var trk = new Garmin.Track();
var trackSegments = trackNodes[i].getElementsByTagName("trkseg");
for( var j=0; j < trackSegments.length; j++ ) {
var trkseg = new Garmin.TrackSegment();
var trackPoints = trackSegments[j].getElementsByTagName("trkpt");
for( var k=0; k < trackPoints.length; k++ ) {
var trkpt = new Garmin.TrackPoint();
var lat = trackPoints[k].getAttribute("lat");
var lng = trackPoints[k].getAttribute("lon");
var eleElement = trackPoints[k].getElementsByTagName("ele");
var ele = (eleElement.length > 0) ? eleElement[0].childNodes[0].nodeValue : null;
var timeNodes = trackPoints[k].getElementsByTagName("time");
if(timeNodes.length > 0) {
var time = timeNodes[0].childNodes[0].nodeValue;
trkpt.date = (new Garmin.DateTimeFormat()).parseXsdDateTime(time);
}
trkpt.measurements = {
latitude: {
value: lat,
context: "latitude"
},
longitude: {
value: lng,
context: "longitude"
},
elevation: {
value: ele,
context: "feet"
}
};
trkseg.addTrackPoint(trkpt);
}
trk.addSegment(trkseg);
}
tracks.push(trk);
}
this.tracks = tracks;
return tracks;
},
parseGpxWaypoint: function(waypointNode) {
var lat = waypointNode.getAttribute("lat");
var lng = waypointNode.getAttribute("lon");
var name = this._tagValue(waypointNode,"name");
var desc = this._tagValue(waypointNode,"desc");
var ele = this._tagValue(waypointNode,"ele");
var sym = this._tagValue(waypointNode,"sym");
var type = this._tagValue(waypointNode,"type");
var cmt = this._tagValue(waypointNode,"cmt");
var wpt = new Garmin.WayPoint(lat, lng, ele, name, null, desc, sym, type, cmt);
return wpt;
},
parseGpxWaypoints: function(gpxDocument) {
var waypoints = new Array();
var waypointNodes = gpxDocument.getElementsByTagName("wpt");
for( var i=0; i < waypointNodes.length; i++ ) {
var waypointNode = waypointNodes[i];
var wpt = this.parseGpxWaypoint(waypointNode);
waypoints.push(wpt);
}
this.waypoints = waypoints;
return waypoints;
},
produceGpxString: function(tracks, waypoints) {
gpxString = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>";
gpxString += "<gpx xmlns=\"http:
if(tracks != null) {
for( var i=0; i < tracks.length; i++ ) {
gpxString += this.produceTrackGpxString(tracks[i]);
}
}
if(waypoints != null) {
for( var i=0; i < waypoints.length; i++ ) {
gpxString += this.produceWaypointGpxString(waypoints[i]);
}
}
gpxString += "</gpx>";
return gpxString;
},
produceTrackGpxString: function(track) {
gpxString = "<trk>";
for( var i=0; i < track.getNumSegments(); i++ ) {
var segment = track.getSegment(i);
gpxString += "<trkseg>";
for(var j=0; j < segment.getLength(); j++) {
var point = segment.getPoint(j);
gpxString += "<trkpt lat=\"" + point.getLat() + "\" lon=\"" + point.getLng() + "\">";
if(point.getElev()) {
gpxString += "<ele>" + point.getElev() + "</ele>";
}
if(point.getDate()) {
gpxString += "<time>" + point.getDate().getXsdString() + "</time>";
}
gpxString += "</trkpt>";
}
gpxString += "</trkseg>";
}
gpxString += "</trk>";
return gpxString;
},
produceWaypointGpxString: function(waypoint) {
gpxString = "<wpt lat=\"" + waypoint.getLat() + "\" lon=\"" + waypoint.getLng() + "\">";
if(waypoint.getElev()) {
gpxString += "<ele>" + waypoint.getElev() + "</ele>";
}
if(waypoint.getName()) {
gpxString += "<name>" + waypoint.getName() + "</name>";
}
if(waypoint.getComment()) {
gpxString += "<cmt>" + waypoint.getComment() + "</cmt>";
}
if(waypoint.getDescription()) {
gpxString += "<desc>" + waypoint.getDescription() + "</desc>";
}
if(waypoint.getSymbol()) {
gpxString += "<sym>" + waypoint.getSymbol() + "</sym>";
}
if(waypoint.getAddress()) {
gpxString += "<extensions><gpxx:WaypointExtension>" + waypoint.getAddress() + "</gpxx:WaypointExtension></extensions>";
}
if(waypoint.getType()) {
gpxString += "<type>" + waypoint.getType() + "</type>";
}
gpxString += "</wpt>";
return gpxString;
},
_tagValue: function(parentNode, tagName) {
var subNode = parentNode.getElementsByTagName(tagName);
return subNode.length > 0 ? subNode[0].childNodes[0].nodeValue : null;
},
toString: function() {
return "GpsDataFactory.";
}
};
Documentation generated by
JSDoc on Wed Apr 9 16:12:40 2008