diff options
Diffstat (limited to 'api_gmaps.js')
-rwxr-xr-x | api_gmaps.js | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/api_gmaps.js b/api_gmaps.js new file mode 100755 index 0000000..d4132ce --- /dev/null +++ b/api_gmaps.js @@ -0,0 +1,173 @@ +/* phpTrackme + * + * Copyright(C) 2013 Bartek Fabiszewski (www.fabiszewski.net) + * + * This is free software; you can redistribute it and/or modify it under + * the terms of the GNU Library 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 Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +// google maps +var map; +var polies = new Array(); +var markers = new Array(); +var popups = new Array(); +var polyOptions; +var mapOptions; +var loadedAPI = 'gmaps'; +function init() { +google.maps.visualRefresh = true; + polyOptions = { + strokeColor: '#FF0000', + strokeOpacity: 1.0, + strokeWeight: 2 + } + mapOptions = { + center: new google.maps.LatLng(52.23, 21.01), + zoom: 8, + mapTypeId: google.maps.MapTypeId.ROADMAP, + scaleControl: true + }; + map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); +} + +function displayTrack(xml,update) { + altitudes.length = 0; + var totalMeters = 0; + var totalSeconds = 0; + // init polyline + var poly = new google.maps.Polyline(polyOptions); + poly.setMap(map); + var path = poly.getPath(); + var latlngbounds = new google.maps.LatLngBounds( ); + var positions = xml.getElementsByTagName('position'); + var posLen = positions.length; + for (var i=0; i<posLen; i++) { + var p = parsePosition(positions[i]); + totalMeters += p.distance; + totalSeconds += p.seconds; + p['totalMeters'] = totalMeters; + p['totalSeconds'] = totalSeconds; + p['coordinates'] = new google.maps.LatLng(p.latitude,p.longitude); + // set marker + setMarker(p,i,posLen); + // update polyline + path.push(p.coordinates); + latlngbounds.extend(p.coordinates); + // save altitudes for chart + altitudes[i] = p.altitude; + } + if (update) { + map.fitBounds(latlngbounds); + if (i==1) { + // only one point, zoom out + zListener = + google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) { + if (this.getZoom()){ + this.setZoom(15); + } + }); + setTimeout(function(){google.maps.event.removeListener(zListener)}, 2000); + } + } + latestTime = p.dateoccured; + polies.push(poly); + + updateSummary(p.dateoccured,totalMeters,totalSeconds); + if (p.tid!=trackid) { + trackid=p.tid; + setTrack(trackid); + } + if (document.getElementById('bottom').style.display=='block') { + // update altitudes chart + chart.clearChart(); + displayChart(); + } +} + +function clearMap(){ + if (polies){ + for (var i=0; i<polies.length; i++){ + polies[i].setMap(null); + } + } + if (markers){ + for (var i=0; i<markers.length; i++){ + google.maps.event.removeListener(popups[i].listener); + popups[i].setMap(null); + markers[i].setMap(null); + } + } + markers.length = 0; + polies.length = 0; + popups.lentgth = 0; +} + +var popup; +function setMarker(p,i,posLen) { + // marker + var marker = new google.maps.Marker( { + map: map, + position: p.coordinates, + title: p.dateoccured + }); + if (latest==1) { marker.setIcon('http://maps.google.com/mapfiles/dd-end.png') } + else if (i==0) { marker.setIcon('http://maps.google.com/mapfiles/marker_greenA.png') } + else if (i==posLen-1) { marker.setIcon('http://maps.google.com/mapfiles/markerB.png') } + else { marker.setIcon('http://labs.google.com/ridefinder/images/mm_20_gray.png') } + // popup + var content = '<div id="popup">'+ + '<div id="pheader">'+lang_user+': '+p.username.toUpperCase()+'<br />'+lang_track+': '+p.trackname.toUpperCase()+ + '</div>'+ + '<div id="pbody">'+ + '<div id="pleft"><b>'+lang_time+':</b> '+p.dateoccured+'<br />'+ + ((p.speed != null)?'<b>'+lang_speed+':</b> '+(p.speed.toKmH()*factor_kmh)+' '+unit_kmh+'<br />':'')+ + ((p.altitude != null)?'<b>'+lang_altitude+':</b> '+(p.altitude*factor_m).toFixed()+' '+unit_m+'<br />':'')+'</div>'+ + ((latest==0)? + ('<div id="pright"><b>'+lang_ttime+':</b> '+p.totalSeconds.toHMS()+'<br />'+ + '<b>'+lang_aspeed+':</b> '+((p.totalSeconds>0)?((p.totalMeters/p.totalSeconds).toKmH()*factor_kmh).toFixed():0)+' '+unit_kmh+'<br />'+ + '<b>'+lang_tdistance+':</b> '+(p.totalMeters.toKm()*factor_km).toFixed(2)+' '+unit_km+'<br />'+'</div>'):'')+ + '<div id="pfooter">'+lang_point+' '+(i+1)+' '+lang_of+' '+(posLen)+'</div>'+ + '</div></div>'; + popup = new google.maps.InfoWindow(); + popup.listener = google.maps.event.addListener(marker, 'click', (function(marker,content) { + return function() { + popup.setContent(content); + popup.open(map, marker); + if (document.getElementById('bottom').style.display=='block') { + chart.setSelection([{row:i,column:null}]); + } + } + })(marker,content)); + markers.push(marker); + popups.push(popup); +} + +function addChartEvent(chart) { + google.visualization.events.addListener(chart, 'select', function() { + if (popup) {popup.close(); clearTimeout(altTimeout);} + var selection = chart.getSelection()[0]; + if (selection) { + var id = selection.row; + var icon = markers[id].getIcon(); + markers[id].setIcon('http://maps.google.com/mapfiles/marker_orange.png'); + //var contentString = '<div style="width:40px; height:20px;padding:10px">'+Math.round(altitudes[id]*factor_m)+' '+unit_m+'</div>'; + //popup = new google.maps.InfoWindow({ + // content: contentString + //}); + //popup.open(map,markers[id]); + //altTimeout = setTimeout(function() { if (popup) {popup.close();} },2000); + altTimeout = setTimeout(function() { markers[id].setIcon(icon); },2000); + } + }); +} |