import sys
import time
import OSMpbfParser
def xml_escape(s_):
s_=s_.replace ("&", "&" )
s_=s_.replace ("<", "<" )
s_=s_.replace (">", ">" )
s_=s_.replace ('"', '"')
return s_
def callback_node(node):
stamp=time.strftime("%Y-%m-%dT%H:%M:%SZ",time.gmtime(node.time))
if len(node.Tags)>0:
fh.write(' \n' % (node.NodeID, node.version, stamp, node.uid, xml_escape(node.user), node.changeset, node.Lat, node.Lon))
for t in node.Tags.keys():
fh.write(' \n' % (t, xml_escape(node.Tags[t])))
fh.write(' \n')
else:
fh.write(' \n' % (node.NodeID, node.version, stamp, node.uid, xml_escape(node.user), node.changeset, node.Lat, node.Lon))
def callback_way(way):
stamp=time.strftime("%Y-%m-%dT%H:%M:%SZ",time.gmtime(way.time))
fh.write(' \n' % (way.WayID, way.version, stamp, way.uid, xml_escape(way.user), way.changeset))
for n in way.Nds:
fh.write(' \n' % (n))
for t in way.Tags.keys():
fh.write(' \n' % (t,xml_escape(way.Tags[t])))
fh.write(' \n')
def callback_relation(relation):
stamp=time.strftime("%Y-%m-%dT%H:%M:%SZ",time.gmtime(relation.time))
fh.write(' \n' % (relation.RelID, relation.version, stamp, relation.uid, xml_escape(relation.user), relation.changeset))
for m in relation.Members:
fh.write(' \n' % (m.type, m.ref, xml_escape(m.role)))
for t in relation.Tags.keys():
fh.write(' \n' % (t,xml_escape(relation.Tags[t])))
fh.write(' \n')
# First argument is *.pbf file name
pbf_filename = sys.argv[1]
# Second (optional) argument is output file
if len(sys.argv) > 2:
fh = open(sys.argv[2], 'w')
else:
fh = sys.stdout
fh.write('\n')
fh.write('\n')
OSMpbfParser.go(pbf_filename, callback_node, callback_way, callback_relation)
fh.write(' \n')
fh.close()
This script takes one mandatory and an optional argument. The mandatory argument specifies the pbf file. If the optional parameter is given, it specifies the name of the xml file into which the output is written, otherwise, the output goes to stdout:
c:\> pbf2xml.py liechtenstein-latest.osm.pbf liechtenstein.xml
Links
Source code on github
OpenStreetMap: convert an pbf to an sqlite database with Python
No comments:
Post a Comment