wubderschönen guten morgen...
entschuldigt, wenn dieses thread nicht in der richtigen sparte ist, ich dachte allerdings, dass algorithmen und optimierung schon mal zutrifft.. =)
sooo, nun zu meinem anliegen:
vor kurzem bin ich auf die datenbank
OpenStreetMap aufmerksam geworden.
ich hatte mir vorher schon einen kleinen A* pathfinder zusammengebastelt, der dann auch ganz gut funktionierte.
jtzt habe ich mir als ziel gesetzt, ein "echtes" navigationssystem zu basteln, bzw. eigentlich zu programmieren...!
ich bekomme die rohdaten als *osm files, diese beinhalten aber nur xml... so weit, so gut, ich benutze als parser den JvSimpleXML von den Jedis. das einlesen der daten geht auch ganz gut, allerdings höchstens nur für eine stadt...
die datei meiner stadt (bielefeld) ist ca. 4,8 MB groß. das bekommt er in ca. 4-5 sekunden hin. allerdings ist ganz deutschland 2,7 GB groß und selbst NRW allein 450 MB....!!!
...Out Of Memory ...!
und selbst wenns gehen würde, müsste man wahrscheinlich echt lange warten...
ich poste auch einfach mal den code von einem selbstgeschriebenem programm, das die datei nochmal splitten und vereinfachen soll... allerdings muss dieses ja auch mit den riesigen osm dateien was anfangen lönnen...:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53:
| procedure TfrmCreator.btnCreateClick(Sender: TObject); var MapFS:TFileStream; i,y:Integer; ThisItem,NewElem,NewWPElem:TJvSimpleXMLElem; begin btnCreate.Enabled:=False;
MapFS:=TFileStream.Create('input/'+edtInput.Text,fmOpenRead); XML.LoadFromStream(MapFS); MapFS.Destroy;
for i:=0 to pred(XML.Root.Items.Count) do begin ThisItem:=XML.Root.Items.Item[i];
if ThisItem.Name='node' then begin NewElem:=XMLWaypoints.Root.Items.Add(ThisItem.Properties.ItemNamed['id'].Value); NewElem.Items.Add('X',ThisItem.Properties.ItemNamed['lon'].Value); NewElem.Items.Add('Y',ThisItem.Properties.ItemNamed['lat'].Value); XMLWaypoints.Root.Items.Add(NewElem); end else if ThisItem.Name='way' then begin NewElem:=XMLStreets.Root.Items.Add(ThisItem.Properties.ItemNamed['id'].Value);
NewWPElem:=NewElem.Items.Add('waypoints'); for y:=0 to pred(ThisItem.Items.Count) do begin if ThisItem.Items.Item[y].Name='nd' then NewWPElem.Items.Add('wp',ThisItem.Items.Item[y].Properties.ItemNamed['ref'].Value) else if (ThisItem.Items.Item[y].Name='tag') AND (ThisItem.Items.Item[y].Properties.ItemNamed['k'].Value='name') then NewElem.Items.Add('name',UTF8ToAnsi(ThisItem.Items.Item[y].Properties.ItemNamed['v'].Value)) else if (ThisItem.Items.Item[y].Name='tag') AND (ThisItem.Items.Item[y].Properties.ItemNamed['k'].Value='highway') then NewElem.Items.Add('type',ThisItem.Items.Item[y].Properties.ItemNamed['v'].Value); end; TRY if (NewElem.Items.ItemNamed['name'].Value<>'') OR (NewElem.Items.ItemNamed['type'].Value<>'') then XMLStreets.Root.Items.Add(NewElem); EXCEPT END; end; end;
XMLWaypoints.SaveToFile('output/Waypoints.xml'); XMLStreets.SaveToFile('output/Streets.xml');
btnCreate.Enabled:=True; end; |
nun natürlich meine frage:
wie bewältige, bzw. lese ich diese verdammt großen dateien (aus), ohne gleich die ganze datei einzulesen. gibts vielleicht irgendwelche xml komponenten, die mit so etwas fertig werden?
ich bedanke mich schon einmel (auch fürs lesen

) und hoffe, es kann mir vielleicht jemand weiterhelfen...
lieben gruß
myribo