[OSM-dev] planet_osm2txt with planet-060818?

Dean Earley dean at earlsoft.co.uk
Mon Aug 21 13:37:42 BST 2006


>>> Was anyone successfull with 
>>> ./utils/osm-pdf-atlas/planet_osm2txt.pl planet-060818-a.osm.bz2 
>>> Any hints on how to do this on a machine with only 2GB of Memory?
>>> 
>> 
>> I guess the parsers will need to be rewritten to use SAX now rather
>> than the DOM (read all and iterate) method. I happily parsed a
>> 2.6GB planet.osm in about 2 minutes using MSXML (in VB)
> 
> Would you mind sharing so more info on this approach. I'd be
> interested in taking a look at some of the data in the planet file.

Basically, it is an event based parser that keeps as little in memory as 
necessary.

It notifies my code whenever a complete tag (start of and end of) has 
been found and any textual content.

This is a sample of the VB code I used:

Private Sub IVBSAXContentHandler_startElement(strNamespaceURI As String, 
strLocalName As String, strQName As String, ByVal attributes As 
MSXML2.IVBSAXAttributes)
Dim ID As Long

Dim Lat As Long
Dim Lon As Long

Dim ToNode As Long
Dim FromNode As Long

Static LastID As Long
Static LastType As String

   Select Case strLocalName
   Case "osm"
   Case "node"
     ID = Val(attributes.getValueFromName("", "id"))
     Lat = Val(attributes.getValueFromName("", "lat")) * 100000
     Lon = Val(attributes.getValueFromName("", "lon")) * 100000

     DB.Execute "INSERT INTO node (ID, Latitude, Longitude) VALUES (" & 
CStr(ID) & ", " & CStr(Lat) & ", " & CStr(Lon) & ");"

     LastType = "node"
     LastID = ID

   Case "segment"
     ID = Val(attributes.getValueFromName("", "id"))
     ToNode = Val(attributes.getValueFromName("", "to"))
     FromNode = Val(attributes.getValueFromName("", "from"))

     DB.Execute "INSERT INTO segment (ID, 'To', 'From') VALUES (" & 
CStr(ID) & ", " & CStr(ToNode) & ", " & CStr(FromNode) & ");"

     LastType = "segment"
     LastID = ID

   Case "way"
     ID = Val(attributes.getValueFromName("", "id"))

     DB.Execute "INSERT INTO way (ID) VALUES (" & CStr(ID) & ");"

     LastType = "way"
     LastID = ID

   Case "seg"
     DB.Execute "INSERT INTO waysegments (WayID, SegmentID) VALUES (" & 
CStr(LastID) & ", " & attributes.getValueFromName("", "id") & ");"

   Case "tag"
     DB.Execute "INSERT INTO tags (ID, Parent, Key, Value) VALUES (" & 
CStr(LastID) & ", """ & LastType & """, """ & 
Replace(attributes.getValueFromName("", "k"), """", "\""") & """, """ & 
Replace(attributes.getValueFromName("", "v"), """", "\""") & """);"

   Case Else
     'Stop on unrecognised tags
     Stop
   End Select
End Sub

It does require a syntactically valid XML file and unfortunately, this 
never completed as I ran out of disk space for the target db :)

/me runs off to his flame proof bunker...

-- 
Dean Earley, Dee (dean at earlsoft.co.uk)

irc:    irc://irc.blitzed.org/
web:    http://personal.earlsoft.co.uk
phone:  +44 (0)780 8369596




More information about the dev mailing list