From: <jb...@us...> - 2009-11-29 09:52:51
|
Revision: 411 http://pytrainer.svn.sourceforge.net/pytrainer/?rev=411&view=rev Author: jblance Date: 2009-11-29 09:52:42 +0000 (Sun, 29 Nov 2009) Log Message: ----------- Start of rework for Google Map rendering - experimental so far, test with --gmaps3 at startup Modified Paths: -------------- pytrainer/trunk/pytrainer/extensions/googlemaps.py pytrainer/trunk/pytrainer/gui/windowmain.py pytrainer/trunk/pytrainer/main.py Added Paths: ----------- pytrainer/trunk/glade/finish.png pytrainer/trunk/glade/start.png Added: pytrainer/trunk/glade/finish.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/finish.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Added: pytrainer/trunk/glade/start.png =================================================================== (Binary files differ) Property changes on: pytrainer/trunk/glade/start.png ___________________________________________________________________ Added: svn:mime-type + application/octet-stream Modified: pytrainer/trunk/pytrainer/extensions/googlemaps.py =================================================================== --- pytrainer/trunk/pytrainer/extensions/googlemaps.py 2009-11-29 01:30:31 UTC (rev 410) +++ pytrainer/trunk/pytrainer/extensions/googlemaps.py 2009-11-29 09:52:42 UTC (rev 411) @@ -27,7 +27,7 @@ from pytrainer.lib.fileUtils import fileUtils class Googlemaps: - def __init__(self, data_path = None, vbox = None, waypoint = None): + def __init__(self, data_path = None, vbox = None, waypoint = None, useGM3 = False): logging.debug(">>") self.data_path = data_path self.conf = checkConf() @@ -35,11 +35,18 @@ self.moz = gtkmozembed.MozEmbed() vbox.pack_start(self.moz, True, True) vbox.show_all() - self.htmlfile = "" + self.htmlfile = "%s/index.html" % (self.conf.getValue("tmpdir")) self.waypoint=waypoint + self.useGM3 = useGM3 logging.debug("<<") def drawMap(self,id_record): + '''Draw google map + create html file using Google API version?? + render using embedded Mozilla + + info at http://www.pygtk.org/pygtkmozembed/class-gtkmozembed.html + ''' logging.debug(">>") code = "googlemapsviewer" extensiondir = self.conf.getValue("extensiondir")+"/"+code @@ -48,30 +55,151 @@ points = [] levels = [] pointlist = [] - htmlfile = self.conf.getValue("tmpdir")+"/index.html" - gpxfile = self.conf.getValue("gpxdir")+"/%s.gpx" %id_record + polyline = [] + + gpxfile = "%s/%s.gpx" % (self.conf.getValue("gpxdir"), id_record) if os.path.isfile(gpxfile): gpx = Gpx(self.data_path,gpxfile) list_values = gpx.getTrackList() - for i in list_values: - pointlist.append((i[4],i[5])) - points,levels = Points.encodePoints(pointlist) - points = points.replace("\\","\\\\") - - self.createHtml(points,levels,pointlist[0]) - htmlfile = os.path.abspath(htmlfile) - logging.debug("HTML file created: "+htmlfile) - if htmlfile != self.htmlfile: - self.moz.load_url("file://"+htmlfile) + if len(list_values) > 0: + minlat, minlon = float(list_values[0][4]),float(list_values[0][5]) + maxlat=minlat + maxlon=minlon + for i in list_values: + lat, lon = float(i[4]), float(i[5]) + minlat = min(minlat, lat) + maxlat = max(maxlat, lat) + minlon = min(minlon, lon) + maxlon = max(maxlon, lon) + pointlist.append((lat,lon)) + polyline.append("new google.maps.LatLng(%s, %s)" % (lat, lon)) + logging.debug("minlat: %s, maxlat: %s" % (minlat, maxlat)) + logging.debug("minlon: %s, maxlon: %s" % (minlon, maxlon)) + points,levels = Points.encodePoints(pointlist) + points = points.replace("\\","\\\\") + if self.useGM3: + logging.debug("Using Google Maps version 3 API") + startinfo = "Start<br>TODO: Put ??? info here" + finishinfo = "End<br>TODO: Put summary info here?" + self.createHtml_api3(polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo) + else: + logging.debug("Using Google Maps version 2 API") + self.createHtml(points,levels,pointlist[0]) + else: + self.createErrorHtml() else: self.createErrorHtml() - self.moz.load_url("file://"+htmlfile) + self.moz.load_url("file://%s" % (self.htmlfile)) logging.debug("<<") + def createHtml_api3(self,polyline, minlat, minlon, maxlat, maxlon, startinfo, finishinfo): + ''' + Generate a Google maps html file using the v3 api + documentation at http://code.google.com/apis/maps/documentation/v3 + ''' + logging.debug(">>") + waypoints = self.waypoint.getAllWaypoints() + #TODO waypoints not supported in this function yet + #TODO sort polyline encoding (not supported in v3?) + #TODO check http://code.google.com/apis/maps/documentation/v3/overlays.html#Polylines for MVArray?? + content = ''' + <html> + <head> + <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> + <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> + <script type="text/javascript"> + function initialize() {\n''' + content += " var startlatlng = %s ;\n" % (polyline[0]) + content += " var centerlatlng = new google.maps.LatLng(%f, %f);\n" % ((minlat+maxlat)/2., (minlon+maxlon)/2.) + content += " var endlatlng = %s;\n" % (polyline[-1]) + content += " var swlatlng = new google.maps.LatLng(%f, %f);\n" % (minlat,minlon) + content += " var nelatlng = new google.maps.LatLng(%f, %f);\n" % (maxlat,maxlon) + content += " var startcontent = \"%s\";\n" % (startinfo) + content += " var finishcontent = \"%s\";\n" % (finishinfo) + content += " var startimageloc = \"%s/glade/start.png\";\n" % (os.path.abspath(self.data_path)) + content += " var finishimageloc = \"%s/glade/finish.png\";\n" % (os.path.abspath(self.data_path)) + content +=''' + var myOptions = { + zoom: 8, + center: centerlatlng, + scaleControl: true, + mapTypeId: google.maps.MapTypeId.ROADMAP + }; + + var startimage = new google.maps.MarkerImage(startimageloc,\n + // This marker is 32 pixels wide by 32 pixels tall. + new google.maps.Size(32, 32), + // The origin for this image is 0,0. + new google.maps.Point(0,0), + // The anchor for this image is the base of the flagpole + new google.maps.Point(16, 32));\n\n + var finishimage = new google.maps.MarkerImage(finishimageloc,\n + // This marker is 32 pixels wide by 32 pixels tall. + new google.maps.Size(32, 32), + // The origin for this image is 0,0. + new google.maps.Point(0,0), + // The anchor for this image is the base of the flagpole + new google.maps.Point(16, 32));\n + + var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); + var startmarker = new google.maps.Marker({ + position: startlatlng, + map: map, + icon: startimage, + title:"Start"}); + + var finishmarker = new google.maps.Marker({ + position: endlatlng, + icon: finishimage, + map: map, + title:"End"}); \n + + //Add an infowindows + var startinfo = new google.maps.InfoWindow({ + content: startcontent + }); + + var finishinfo = new google.maps.InfoWindow({ + content: finishcontent + }); + + google.maps.event.addListener(startmarker, 'click', function() { + startinfo.open(map,startmarker); + }); + + google.maps.event.addListener(finishmarker, 'click', function() { + finishinfo.open(map,finishmarker); + }); + + var boundsBox = new google.maps.LatLngBounds(swlatlng, nelatlng );\n + map.fitBounds(boundsBox);\n + var polylineCoordinates = [\n''' + for point in polyline: + content += " %s,\n" % (point) + content += ''' ];\n + // Add a polyline.\n + var polyline = new google.maps.Polyline({\n + path: polylineCoordinates,\n + strokeColor: \"#3333cc\",\n + strokeOpacity: 0.6,\n + strokeWeight: 5,\n + });\n + polyline.setMap(map);\n + } + + </script> + </head> + <body onload="initialize()"> + <div id="map_canvas" style="width:100%; height:100%"></div> + </body> + </html>''' + file = fileUtils(self.htmlfile,content) + file.run() + logging.debug("<<") + def createHtml(self,points,levels,init_point): logging.debug(">>") waypoints = self.waypoint.getAllWaypoints() - tmpdir = self.conf.getValue("tmpdir") content = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \n" content += " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" content += " <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\">\n" @@ -164,24 +292,20 @@ content += " <div id=\"map\" style=\"width: 520px; height: 480px\"></div>\n" content += " </body>\n" content += "</html>\n" - filename = tmpdir+"/index.html" - file = fileUtils(filename,content) + file = fileUtils(self.htmlfile,content) file.run() logging.debug("<<") def createErrorHtml(self): logging.debug(">>") - content = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \n" - content += " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n" - content += " <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\">\n" - content += """ <head>\n + content = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> +<head> <body> No Gpx Data </body> </html> - """ - tmpdir = self.conf.getValue("tmpdir") - filename = tmpdir+"/index.html" - file = fileUtils(filename,content) + ''' + file = fileUtils(self.htmlfile,content) file.run() logging.debug("<<") Modified: pytrainer/trunk/pytrainer/gui/windowmain.py =================================================================== --- pytrainer/trunk/pytrainer/gui/windowmain.py 2009-11-29 01:30:31 UTC (rev 410) +++ pytrainer/trunk/pytrainer/gui/windowmain.py 2009-11-29 09:52:42 UTC (rev 411) @@ -120,8 +120,8 @@ self.drawareamonth = MonthGraph(self.month_vbox, self.window1, self.month_combovalue,self.month_combovalue2) self.drawareayear = YearGraph(self.year_vbox, self.window1, self.year_combovalue,self.year_combovalue2) - def createMap(self,Googlemaps,waypoint): - self.googlemaps = Googlemaps(self.data_path, self.map_vbox,waypoint) + def createMap(self,Googlemaps,waypoint, useGM3): + self.googlemaps = Googlemaps(self.data_path, self.map_vbox,waypoint, useGM3) def updateSportList(self,listSport): logging.debug(">>") @@ -835,10 +835,11 @@ if self.block: self.block = False else: - #self.notebook.set_current_page(1) - #self.selected_view="day" self.parent.refreshListRecords() self.parent.refreshGraphView(self.selected_view) + if self.selected_view == "record": + self.recordview.set_current_page(0) + self.parent.refreshRecordGraphView("info") def on_calendar_changemonth(self,widget): logging.debug("--") Modified: pytrainer/trunk/pytrainer/main.py =================================================================== --- pytrainer/trunk/pytrainer/main.py 2009-11-29 01:30:31 UTC (rev 410) +++ pytrainer/trunk/pytrainer/main.py 2009-11-29 09:52:42 UTC (rev 411) @@ -59,6 +59,9 @@ from lib.system import checkConf from lib.heartrate import * + +##TODO The below should all be able to be in the __init__ section, i.e. does not need to be global + # ERROR is the default log level PATH = os.environ['HOME']+"/.pytrainer" if not os.path.exists(PATH): @@ -71,16 +74,18 @@ For more help on valid options try: %prog -h """ parser = OptionParser(usage=usage) -parser.set_defaults(log_level=logging.ERROR, validate=False) +parser.set_defaults(log_level=logging.ERROR, validate=False, gm3=False) parser.add_option("-d", "--debug", action="store_const", const=logging.DEBUG, dest="log_level", help="enable logging at debug level") parser.add_option("-i", "--info", action="store_const", const=logging.INFO, dest="log_level", help="enable logging at info level") parser.add_option("-w", "--warn", action="store_const", const=logging.WARNING, dest="log_level", help="enable logging at warning level") parser.add_option("--valid", action="store_true", dest="validate", help="enable validation of files imported by plugins (details at info or debug logging level) - note plugin must support validation") parser.add_option("--check", action="store_true", dest="check", help="triggers database (only sqlite based) and configuration file sanity checks, adding fields if necessary. Backup of database is done before any change. Details at info or debug logging level") +parser.add_option("--gmaps3", action="store_true", dest="gm3", help="EXPERIMENTAL: use Google Maps API version3 (currently slower than version 2, but includes some new functionality)") (options, args) = parser.parse_args() log_level = options.log_level validate = options.validate check = options.check +gm3 = options.gm3 # Adding rotating support to default logger with customized format rotHandler = logging.handlers.RotatingFileHandler(LOG_FILENAME, maxBytes=100000, backupCount=5) @@ -93,7 +98,7 @@ def __init__(self,filename = None, data_path = None): logging.debug('>>') self.data_path = data_path - self.version ="1.6.0.9_svn#410" + self.version ="1.6.0.9_svn#411" self.date = Date() main_dir = os.path.realpath(os.path.dirname(__file__)) #why? sys.path.insert(0, main_dir) #why? @@ -104,6 +109,7 @@ self.log_level = log_level self.validate = validate self.check = check + self.gm3 = gm3 self.windowmain = None logging.debug('checking configuration...') @@ -140,7 +146,7 @@ self.loadPlugins() self.loadExtensions() self.windowmain.createGraphs(RecordGraph,DayGraph,WeekGraph, MonthGraph,YearGraph,HeartRateGraph) - self.windowmain.createMap(Googlemaps,self.waypoint) + self.windowmain.createMap(Googlemaps,self.waypoint, self.gm3) self.windowmain.createWaypointEditor(WaypointEditor,self.waypoint) self.windowmain.on_calendar_selected(None) self.refreshMainSportList() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |