Hello,
I'm trying to plot GPS points onto a canvas. I'm basing my script on
the vectorplot demo. I removed drawing the axes, etc. I've tried to
modify the Plot function but haven't succeeded. Note that this is my
first python project, so I'm not sure what I'm doing...
Thanks!
Alex
SAMPLE SOURCE DATA:
GPSD,R=1
$GPGGA,195743.466,2944.4223,N,09522.1621,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7E
$GPRMC,195743.466,A,2944.4223,N,09522.1621,W,0.00,60.14,300308,,*27
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195744.466,2944.4233,N,09522.1625,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7C
$GPGSA,A,2,22,09,18,,,,,,,,,,23.4,12.1,20.0*06
$GPGSV,3,1,11,21,64,137,00,18,55,027,41,22,47,317,34,14,46,239,00*78
$GPGSV,3,2,11,09,42,081,42,06,27,223,00,24,22,136,00,03,19,285,00*7E
$GPGSV,3,3,11,19,10,314,00,32,10,284,,15,07,045,00*4A
$GPRMC,195744.466,A,2944.4233,N,09522.1625,W,0.00,60.14,300308,,*25
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195745.466,2944.4279,N,09522.1613,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*76
$GPRMC,195745.466,A,2944.4279,N,09522.1613,W,0.00,60.14,300308,,*2F
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195746.466,2944.4302,N,09522.1590,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*70
$GPRMC,195746.466,A,2944.4302,N,09522.1590,W,0.00,60.14,300308,,*29
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195747.466,2944.4268,N,09522.1604,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*72
$GPRMC,195747.466,A,2944.4268,N,09522.1604,W,0.00,60.14,300308,,*2B
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195748.466,2944.4262,N,09522.1608,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7B
$GPRMC,195748.466,A,2944.4262,N,09522.1608,W,0.00,60.14,300308,,*22
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195749.466,2944.4255,N,09522.1619,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7E
$GPGSA,A,2,22,09,18,,,,,,,,,,23.4,12.1,20.0*06
$GPGSV,3,1,11,21,64,137,00,18,55,027,41,22,47,317,34,14,46,239,00*78
$GPGSV,3,2,11,09,42,081,42,06,27,223,00,24,22,136,00,03,19,285,00*7E
$GPGSV,3,3,11,19,10,314,00,32,10,284,,15,07,045,00*4A
$GPRMC,195749.466,A,2944.4255,N,09522.1619,W,0.00,60.14,300308,,*27
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195750.466,2944.4300,N,09522.1591,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*74
$GPRMC,195750.466,A,2944.4300,N,09522.1591,W,0.00,60.14,300308,,*2D
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195751.466,2944.4274,N,09522.1582,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*75
$GPRMC,195751.466,A,2944.4274,N,09522.1582,W,0.00,60.14,300308,,*2C
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195752.466,2944.4256,N,09522.1605,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7A
$GPRMC,195752.466,A,2944.4256,N,09522.1605,W,0.00,60.14,300308,,*23
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195753.466,2944.4255,N,09522.1589,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7F
$GPRMC,195753.466,A,2944.4255,N,09522.1589,W,0.00,60.14,300308,,*26
$GPVTG,,T,,M,0.00,N,0.0,K*7E
$GPGGA,195754.466,2944.4268,N,09522.1582,W,1,03,12.1,1.8,M,-23.7,M,0.0,0000*7D
CODE:
#!/usr/bin/env python2.4
"""
A small test app that uses FloatCanvas to draw a vector plot.
"""
from time import clock
import wx
import numpy as N
import random
## import the installed version
#from wx.lib.floatcanvas import NavCanvas, FloatCanvas
## import a local version
import sys
sys.path.append("..")
from floatcanvas import NavCanvas, FloatCanvas
import os, math
def dmmm2dec(degrees,sw):
deg= math.floor(degrees/100.0) #decimal degrees
frac= ((degrees/100.0)-deg)/0.6 #decimal fraction
ret = deg+frac #positive return value
if ((sw=="S") or (sw=="W")):
ret=ret*(-1) #flip sign if south or west
return ret
raw_data = open('home_gps_nmea')
#Define origin from first point
origin = ''
while not(origin.startswith("$GPGGA")):
origin = raw_data.readline()
tokens = origin.split(",")
origin_lat = dmmm2dec(float(tokens[2]),tokens[3]) #[2] is lat in
deg+minutes, [3] is {N|S|W|E}
origin_lng = dmmm2dec(float(tokens[4]),tokens[5]) #[4] is long in
deg+minutes, [5] is {N|S|W|E}
origin_time = tokens[1][0:2]+':'+tokens[1][2:4]+':'+tokens[1][4:6]+'
UTC' ##note: change to float
#print "Origin:"+origin_time+' Long:'+str(origin_lng)+' Lat:'+str(origin_lat)
"""
for raw_data_line in raw_data:
if raw_data_line.startswith('$GPGGA'):
line = raw_data_line.split(',')
lat = dmmm2dec(float(line[2]),line[3]) #[2] is lat in
deg+minutes, [3] is {N|S|W|E}
lng = dmmm2dec(float(line[4]),line[5]) #[4] is long in
deg+minutes, [5] is {N|S|W|E}
time = line[1][0:2]+':'+line[1][2:4]+':'+line[1][4:6]+' UTC'
##note: change to float
#print time+' Y:'+str(lat-origin_lat)+' X:'+str(lng-origin_lng)
"""
class DrawFrame(wx.Frame):
def __init__(self,parent, id,title,position,size):
wx.Frame.__init__(self,parent, id,title,position, size)
## Set up the MenuBar
MenuBar = wx.MenuBar()
file_menu = wx.Menu()
item = file_menu.Append(wx.ID_ANY, "E&xit","Terminate the program")
self.Bind(wx.EVT_MENU, self.OnQuit, item)
MenuBar.Append(file_menu, "&File")
draw_menu = wx.Menu()
item = draw_menu.Append(wx.ID_ANY, "&Plot","Re-do Plot")
self.Bind(wx.EVT_MENU, self.Plot, item)
MenuBar.Append(draw_menu, "&Plot")
help_menu = wx.Menu()
item = help_menu.Append(wx.ID_ANY, "&About",
"More information About this program")
self.Bind(wx.EVT_MENU, self.OnAbout, item)
MenuBar.Append(help_menu, "&Help")
self.SetMenuBar(MenuBar)
self.CreateStatusBar()
self.SetStatusText("")
wx.EVT_CLOSE(self, self.OnCloseWindow)
# Add the Canvas
self.Canvas = NavCanvas.NavCanvas(self ,wx.ID_ANY ,(500,300),
ProjectionFun = None,
Debug = 0,
BackgroundColor = "WHITE"
).Canvas
self.Canvas.NumBetweenBlits = 1000
self.Show(True)
self.Plot()
return None
def OnAbout(self, event):
dlg = wx.MessageDialog(self, "This is a small program to demonstrate\n"
"the use of the FloatCanvas\n"
"for vector plotting",
"About Me", wx.OK | wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
def ZoomToFit(self,event):
self.Canvas.ZoomToBB()
def OnQuit(self,event):
self.Close(True)
def OnCloseWindow(self, event):
self.Destroy()
"""
def DrawAxis(self):
Canvas = self.Canvas
# Draw the Axis
# Note: the AddRectangle Parameters all have sensible
# defaults. I've put them all here explicitly, so you can see
# what the options are.
self.Canvas.AddRectangle((0, -1.1),
(2*N.pi, 2.2),
LineColor = "Black",
LineStyle = "Solid",
LineWidth = 1,
FillColor = None,
FillStyle = "Solid",
InForeground = 0)
for tic in N.arange(7):
self.Canvas.AddText("%1.1f"%tic,
(tic, -1.1),
Position = 'tc')
for tic in N.arange(-1,1.1,0.5):
self.Canvas.AddText("%1.1f"%tic,
(0,tic),
Position = 'cr')
# Add a phantom rectangle to get the bounding box right
# (the bounding box doesn't get unscaled text right)
self.Canvas.AddRectangle((-0.7, -1.5),
(7, 3),
LineColor = None)
"""
#Canvas.ZoomToBB()
#Canvas.Draw()
def Plot(self, event = None):
x =0
y =0
for raw_data_line in raw_data:
line = ''
if raw_data_line.startswith('$GPGGA'):
line = raw_data_line.split(',')
lat = dmmm2dec(float(line[2]),line[3]) #[2] is lat in
deg+minutes, [3] is {N|S|W|E}
lng = dmmm2dec(float(line[4]),line[5]) #[4] is long in
deg+minutes, [5] is {N|S|W|E}
time =
line[1][0:2]+':'+line[1][2:4]+':'+line[1][4:6]+' UTC' ##note: change
to float
#print time+' Y:'+str(lat-origin_lat)+' X:'+str(lng-origin_lng)
x = (lng-origin_lng)
y = (lat-origin_lat)
p = (x, y)
Canvas.AddPoint(p,
Diameter = 4,
Color = "Red",
InForeground = 1)
Canvas = self.Canvas
self.Canvas.ZoomToBB()
self.Canvas.Draw()
self.Canvas.ClearAll()
class DemoApp(wx.App):
"""
How the demo works:
"""
def OnInit(self):
frame = DrawFrame(None, wx.ID_ANY, "Plotting
Test",wx.DefaultPosition,wx.Size(700,400))
self.SetTopWindow(frame)
return True
if __name__ == "__main__":
app = DemoApp(0)
app.MainLoop()
_______________________________________________
FloatCanvas mailing list
[email protected]
http://mail.mithis.com/cgi-bin/mailman/listinfo/floatcanvas