[FOSS-GPS] Converting (foxtrot) gpx to osm

Joshua Judson Rosen rozzin at geekspace.com
Sat Jan 5 00:47:44 PST 2013


David Bannon <dbannon at internode.on.net> writes:
>
> Guys, FoxtrotGPS now saves its tracks as GPX rather than its own private
> log format. Thats a good thing, GPX format is well know.
>
> But it makes the convert2gpx script a bit useless. I submit a few logs
> to OpenStreetMap and quite liked the old convert2gpx, it made the
> process just a touch quicker. So I wrote a small python script to do the
> same thing but starting with a gpx log. It also sets a few default
> settings in the resulting OSM file.
>
> Like Markus's original, it depends on gpsbabel but otherwise should work
> with most standard python installs.

I'm a little confused by this: can't gpsbabel do *all* of the work,
here, if you invoke it with "-o osm" rather than "-o csv"?

I do have to admit, now, that I've still never contributed a trace to
OSM..., so I'm just looking at gpsbabel's man page--shamefully, I have
no idea whether "gpsbabel -o osm" actually writes out everything
exactly as needed.


> Its attached if you are interested.
>
> Any license that works for you ...
>
> David
>
> #! /usr/bin/python
>
> # Simple script to convert GPX logs to OpenSteetMap for easy importation.
> # Sets some basic defaults to speed up the process a bit.
> # Author David Bannon but borrows heavily from a perl script by Markus Bauer
> import sys, os, datetime, subprocess
> import argparse
>
> TagHighway = "\t\t<tag k='highway' v='road' />\n"
> TagSurface = "\t\t<tag k='surface' v='unpaved' />\n"
> TagTracktype = "\t\t<tag k='tracktype' v='grade3' />\n"
> Tag4wd_only = "\t\t<tag k='4wd_only' v='yes' />\n"
> TagLanes = "\t\t<tag k='lanes' v='1' />\n"
> TagSource = "\t\t<tag k='source' v='survey' />\n"
> TagName = "\t\t<tag k='name' v='no name yet' />\n"
> HDOP = "10"
> 	# hdop is a measure of how accurate GPS might be, smaller the better.
> 	# Markus used 3.1 but I found that walking tracks with overhead trees 
> 	# can easily generate tracks in the 6 range. 
> 	# http://wiki.openstreetmap.org/wiki/Converting_NMEA_to_GPX suggests 10
> 	# If you are really careless you can describe HDOP as a multiplier to the
> 	# intrinsic error of the full hardware chain, typically 5 to 8 metres.
> 	# So, again, very careless, HDOP of 10 means an uncertainty of 50 to 80 metres.
>
> def Header():
> 	return "<?xml version='1.0' encoding='UTF-8'?>\n<osm version='0.5' generator='JOSM'>\n";
>
> def TrackTags():		# Useful for all unsealed roads
> 	return TagName + TagHighway + TagTracktype + TagSurface + TagLanes + TagSource
>
> def RoadTags():			# default tag set
> 	return TagName + TagHighway + TagSource
>
> def Footer():
> 	return "\t</way> \n</osm> \n";
>
>
> def WriteOSM(InFile):
> 	Count = 1;
> 	OF =open(InFile+'.osm', 'w')
> 	OF.write(Header())
> 	IF = open(InFile + '.csv')
> 	for Line in IF:
> 		Pos = Line.split(', ')
> 		Node = "\t<node id='-" + str(Count) + "' visible='true' lat='" + Pos[0] + "' lon='" + Pos[1] + "' />\n"
> 		OF.write(Node)
> 		Count = Count + 1
> 	OF.write("\t<way id='-" + str(Count) + "' action='modify' visible='true'>\n")
> 	for WLine in range(1, Count):
> 		Way = "\t\t<nd ref='-" + str(WLine) + "' />\n"
> 		OF.write(Way);
> 	if args.TRACK:
> 		OF.write(TrackTags())
> 	else:
> 		OF.write(RoadTags())
> 	IF.close
> 	OF.write(Footer())
> 	OF.close
> 	os.unlink(InFile + '.csv')
> 	return Count
>
> def HowManyPoints(FileName):
> 	Count = 0
> 	BadCount = 0
> 	IF = open(FileName)		
> 	for Line in IF:
> 		Count = Count + Line.count("<hdop>") # careful, this is case sensitive !
> 		# print "CNT", Count, Line
> 		HDOPs = Line.split('<hdop>')
> 		for i in HDOPs:
> 			try:
> 				# print "testing ", i, i[:3]
> 				if 10.0 < float(i[:i.find('<')]):
> 					BadCount = BadCount+1
> 			except ValueError:
> 				continue	
> 	IF.close
> 	return Count, BadCount
> 		
> # -------- ------------------------
> # -------- Main Function ----------
> # ---------------------------------
>
> # use = " %prog [ option ]."
>
> parser = argparse.ArgumentParser(description='convert gpx logs to OSM files')
> parser.add_argument('-v', dest='VERBOSE', action='store_true', help='be verbose')
> parser.add_argument('-t', dest='TRACK', action='store_true', help='treat it as a track')
> parser.add_argument('FileList', metavar='gpxfile', nargs='+', help='some gpx file')
> args = parser.parse_args()
>
> for Infile in args.FileList:
> 	Base,ext = os.path.splitext(Infile)
> 	Points, BadPoints = HowManyPoints(Infile)
> 	if BadPoints*2 > Points:
> 		print "Warning,", Infile, " has excessive points with poor HDOP"
> 	if args.VERBOSE:
> 		print Infile, Points, "points logged", BadPoints, "with excessive HDOP",
> 	Cmd = 'gpsbabel', '-i', 'gpx', '-f', Infile, '-x', 'simplify,error=0.003k', '-x', 'discard,hdop='+HDOP, '-o', 'csv', '-F', Base+'.csv'
> 	try:
> 		Pipe = subprocess.Popen(Cmd, stdout=subprocess.PIPE)
> 	except OSError:
> 		print "Looks like you do not have gpsbabel installed, or maybe not in your path."
> 		print "Please make gpsbabel available and try again."
> 		sys.exit()
> 	Lines = Pipe.communicate()[0]
> 	if len(Lines) > 0:
> 		print 'Something bad happened, beats me !'
> 		print Lines
> 		sys.exit()
> 	if args.VERBOSE:
> 		print WriteOSM(Base),
> 		print " nodes saved"
> 	else:
> 		WriteOSM(Base) 
>
>
> _______________________________________________
> This message is sent to you from FOSS-GPS at lists.osgeo.org mailing list.
> Visit http://lists.osgeo.org/mailman/listinfo/foss-gps to manage your subscription
> For more information, check http://wiki.osgeo.org/wiki/FOSS-GPS

-- 
"Don't be afraid to ask (λf.((λx.xx) (λr.f(rr))))."


More information about the FOSS-GPS mailing list