x

x osm-Dateien zu einer Datei zusammenfassen?


  1. x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 09.02.2013 14:07 · [flux]

    Hallo zusammen,

    gibt es irgendwie die Möglichkeit beliebig viele .osm-Dateien aus einem Verzeichnis zu einer Großen zusammenzufassen?

    Man kann ja mit osmconvert zwei Dateien zu einer zu mergen. Aber ich hab ein Verzeichnis mit zig Dateien und möchte eine "Große" haben.

    Wäre super, wenn jemand ne Lösung hat.

    Gruß

    Jan


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Oli-Wan (Gast) · 09.02.2013 14:18 · [flux]

      Kommt darauf an, wie "schön" die Lösung sein soll. Quick-n-dirty würde ich

      (echo␣'<osm␣version="0.6">'␣;␣cat␣*.osm␣|␣egrep␣-v␣'^␣*(</?osm|<\?xml)'␣;␣echo␣'</osm>')␣|␣osmosis␣--rx␣file=-␣--sort␣--wx␣file=ziel.osm
      

      vorschlagen.

      PS. Keine Ahnung, wie sich anschließend Duplikate auswirken und wie man sie einfach wieder los wird.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 15:29 · [flux]

      Nahmd,

      jman1983 wrote:

      Wäre super, wenn jemand ne Lösung hat.

      Wenn Du auf einem Unix arbeitest und der Merger eine Datei von Standard in lesen und sein Ergebnis nach Standard-out schreiben kann, kannst Du per Script einen ellenlange Kommandozeile generiern und die dann ausführen lassen.

      Das nutzt auch eventuell vorhandene Prozessorkerne optimal 🙂

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 15:31 · [flux]

      The_fine_wiki wrote:

      Merging two or more Geographical Areas

      Under certain conditions, OSM data files can be merged. If they hold objects (nodes, ways, relations) with the same id, they must have the same content. For example: If a way crosses the geographical border between two regional files, the way dataset must contain every node reference, even the references to nodes which do not lie within the borders of the regarding file. I.e., such a region must not have been cut out using the option --drop-brokenrefs. Examples for geographical merging:

      ./osmconvert austria.o5m germany.o5m switzerland.o5m -o=dach.o5m

      Du kannst ja weiterhin versuchen, nach_und_nach eine Datei zu der zuvor aus zweien zusammengemanschten Datei hinzuzufügen - so dass sie Stück-für-Stück größer wird -, evtl. gescriptet.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 17:39 · [flux]

      jman1983 wrote:

      Man kann ja mit osmconvert zwei Dateien zu einer zu mergen. Aber ich hab ein Verzeichnis mit zig Dateien und möchte eine "Große" haben.

      Wäre super, wenn jemand ne Lösung hat.

      Ich hätte da ein superhochaufwendiges™ Skript:

      #!/usr/bin/perl
      #-------------------------------------------------------------------------------
      #	$Id:␣osmmerge.pl,v␣1.7␣2013/02/11␣22:15:45␣wolf␣Exp␣$
      #-------------------------------------------------------------------------------
      #	Aufruf:
      #		perl␣osmmerge.pl␣*.osm␣>result
      #
      #	Verschmilzt␣beliebig␣viele␣OSM-Dateien.
      #	Bei␣gleichem␣Typ␣und␣gleicher␣Id␣wird␣das␣Objekt␣mit␣der␣hoechsten␣Version
      #	Sind␣auch␣die␣Versionen␣gleich,␣das␣Objekt␣aus␣der␣"linkesten"␣Datei.
      #-------------------------------------------------------------------------------
      
      use␣strict;
      use␣utf8;
      
      #-------------------------------------------------------------------------------
      #	Ausgabe␣in␣UTF-8
      #-------------------------------------------------------------------------------
      
      binmode␣STDOUT,␣':utf8';
      
      #-------------------------------------------------------------------------------
      #	Loese␣"*.ext"␣pattern␣auf␣und␣sammle␣die␣Dateinamen␣im␣array␣@name
      #-------------------------------------------------------------------------------
      
      my␣@name␣=␣();
      foreach␣my␣$arg␣(@ARGV)␣{
      
      push␣(@name,␣glob($arg));
      }
      
      #-------------------------------------------------------------------------------
      #	Zur␣Kontrolle␣zeige␣die␣Liste␣der␣Dateien.
      #-------------------------------------------------------------------------------
      
      warn␣"Bearbeite␣Dateien:␣",␣join␣(',␣',␣@name),␣".\n";
      
      #-------------------------------------------------------------------------------
      #	Diese␣Arrays␣haben␣jeweils␣einen␣Eintrag␣je␣Eingabedatei
      #-------------------------------------------------------------------------------
      
      my␣@handle;
      my␣@entry;
      my␣@osmid;
      my␣@version;
      my␣$index;
      
      #-------------------------------------------------------------------------------
      #	Je␣Eingabedatei
      #-------------------------------------------------------------------------------
      
      for␣($index=0;␣$index<@name;␣$index++)␣{
      
      #----------------------------------------------------------------------
      #	Oeffne␣die␣Datei␣und␣nehme␣als␣UTF-8␣Codierung␣an
      #----------------------------------------------------------------------
      
      my␣$handle;
      
      unless␣(open␣($handle,␣'<:utf8',␣$name[$index]))␣{
      
      #--------------------------------------------------------------
      #	Meldung␣wenn␣Oeffnen␣gescheitert
      #--------------------------------------------------------------
      
      warn␣"Kann␣Datei␣\"$name[$index]\"␣nicht␣oeffnen:␣$!\n";
      
      #--------------------------------------------------------------
      #	Und␣Abbruch.
      #	Die␣"exit"␣Zeile␣kann␣auskommentiert␣werden,␣dann
      #	werden␣fehlende␣oder␣nicht␣lesbare␣Datein␣uebersprungen.
      #--------------------------------------------------------------
      
      exit␣1;
      }
      
      #----------------------------------------------------------------------
      #	Datei␣geoeffnet.␣Lese␣das␣<?xml
      #----------------------------------------------------------------------
      
      $_␣=␣<$handle>;
      unless␣(m#<\?xml#)␣{
      
      warn␣"Datei␣\"$name[$index]\":␣in␣erster␣Zeile␣kein␣\"<?xml\".\n";
      exit␣1;
      }
      
      #----------------------------------------------------------------------
      #	Lese␣das␣<osm
      #----------------------------------------------------------------------
      
      $_␣=␣<$handle>;
      unless␣(m#<osm#)␣{
      
      warn␣"Datei␣\"$name[$index]\":␣in␣zweiter␣Zeile␣kein␣\"<osm\".\n";
      exit␣1;
      }
      
      #----------------------------------------------------------------------
      #	Speichere␣das␣Filehandle
      #----------------------------------------------------------------------
      
      $handle[$index]␣=␣$handle;
      
      #----------------------------------------------------------------------
      #	Lese␣erstes␣Objekt
      #----------------------------------------------------------------------
      
      &readEntry␣($index);
      
      #----------------------------------------------------------------------
      #	Ueberspringe␣unbekannte␣Objekte
      #----------------------------------------------------------------------
      
      while␣($entry[$index]␣!~␣/^\s*<(changeset|node|way|relation)/)␣{
      
      &readEntry␣($index);
      last␣if␣$entry[$index]␣eq␣'';
      }
      }
      
      #-------------------------------------------------------------------------------
      #	Je␣Eingabedatei␣ein␣Element␣gelesen,␣also␣startbereit.
      #-------------------------------------------------------------------------------
      
      #-------------------------------------------------------------------------------
      #	Header␣der␣Ausgabedatei
      #-------------------------------------------------------------------------------
      
      print␣"<?xml␣version='1.0'␣encoding='UTF-8'?>\n<osm␣version=\"0.6\"␣generator=\"osmmerge.pl\">\n";
      
      #-------------------------------------------------------------------------------
      #	Bearbeite␣bis␣alle␣Eingabedateien␣voll␣bearbeitet␣sind.
      #-------------------------------------------------------------------------------
      
      for(;;)␣{
      
      #-----------------------------------------------------------------------
      #	Finde␣die␣kleinste␣Id.
      #	Da␣mehrere␣Eingabedatein␣dieses␣Objekt␣enthalten␣koennen,
      #	sammle␣die␣Indizes␣dieser␣Dateien␣im␣Array␣@index.
      #-----------------------------------------------------------------------
      
      my␣@index;
      
      #-----------------------------------------------------------------------
      #	Initialisiere␣"bisher␣kleinste␣gefundene␣Id"␣auf␣sehr␣hohen␣Wert
      #-----------------------------------------------------------------------
      
      my␣$osmid␣=␣'~';
      
      #-----------------------------------------------------------------------
      #	Iteriere␣ueber␣die␣Eingabedateien:
      #-----------------------------------------------------------------------
      
      for␣($index=0;␣$index<@name;␣$index++)␣{
      
      #---------------------------------------------------------------
      #	Falls␣Objekt␣in␣Eingabedatei␣GROESSER␣ist␣als␣das␣kleinste
      #	bisher␣gefundene,␣ignoriere␣das␣Objekt
      #---------------------------------------------------------------
      
      next␣if␣$osmid[$index]␣gt␣$osmid;
      
      #---------------------------------------------------------------
      #	Falls␣Objekt␣in␣Eingabedatei␣KLEINER␣ist␣als␣das␣kleinste
      #	bisher␣gefundene,␣merke␣dessen␣Id␣und␣verwerfe␣alle␣bisher
      #	gefundenen␣Indizes.
      #---------------------------------------------------------------
      
      if␣($osmid[$index]␣lt␣$osmid)␣{
      
      $osmid␣=␣$osmid[$index];
      @index=();
      }
      
      #---------------------------------------------------------------
      #	Aspeichere␣aktuellen␣Index␣im␣Indexsammler.
      #---------------------------------------------------------------
      
      push␣(@index,␣$index);
      }
      
      #-----------------------------------------------------------------------
      #	Wenn␣kein␣Index␣gefunden,␣sind␣alle␣Dateien␣am␣Ende␣angelangt,
      #	und␣wir␣beenden␣die␣Schleife.
      #-----------------------------------------------------------------------
      
      last␣unless␣@index;
      
      #-----------------------------------------------------------------------
      #	Suche␣die␣groesste␣Version␣und␣lade␣zu␣den␣gefundenen␣Indizes
      #	das␣naechste␣Objekt␣aus␣der␣jeweiligen␣Datein.
      #
      #	version:	bisher␣gefundene␣hoechste␣Version
      #	entry:		das␣zugehoerige␣Objekt.
      #-----------------------------------------------------------------------
      
      my␣$version␣=␣-1;
      my␣$entry;
      
      #-----------------------------------------------------------------------
      #	Fuer␣alle␣Eintrage␣im␣Index:
      #-----------------------------------------------------------------------
      
      foreach␣$index␣(@index)␣{
      
      #---------------------------------------------------------------
      #	Wenn␣die␣Version␣zum␣jeweiligen␣GROESSER␣ist␣als␣die
      #	groesste␣bisher␣bekannte,␣speichere␣diese␣Version
      #	und␣den␣zugehoerigen␣XML-Text.
      #---------------------------------------------------------------
      
      if␣($version[$index]>$version)␣{
      
      $version␣=␣$version[$index];
      $entry␣=␣$entry[$index];
      }
      
      #---------------------------------------------------------------
      #	Sodann␣ueberschreibe␣das␣bearbeitete␣Element␣durch
      #	neu␣eingelesenes.
      #---------------------------------------------------------------
      
      readEntry($index);
      }
      
      #-----------------------------------------------------------------------
      #	Gebe␣den␣XML-Texte␣des␣Elementes␣mit␣der␣hoechsten␣Version␣aus.
      #-----------------------------------------------------------------------
      
      print␣$entry;
      }
      
      #-------------------------------------------------------------------------------
      #	Alle␣Eingabedateien␣bis␣zum␣Ende␣bearbeitet.␣Schliesse␣das␣"<osm>"␣ab.
      #-------------------------------------------------------------------------------
      
      print␣"</osm>\n";
      
      exit␣0;
      
      #-------------------------------------------------------------------------------
      #	Lese␣das␣naechste␣Objekt␣zu␣einem␣bestimmten␣Index
      #-------------------------------------------------------------------------------
      
      sub␣readEntry␣{
      
      #-----------------------------------------------------------------------
      #	Index␣aus␣Parameterliste
      #-----------------------------------------------------------------------
      
      my␣($index)␣=␣@_;
      
      #-----------------------------------------------------------------------
      #	Bestimme␣das␣Filehandle␣und␣lese␣die␣erste␣(oder␣einzige)␣Zeile
      #-----------------------------------------------------------------------
      
      my␣$handle␣=␣$handle[$index];
      my␣$entry␣=␣<$handle>;
      
      #-----------------------------------------------------------------------
      #	Ueberspringe␣Leerzeilen
      #-----------------------------------------------------------------------
      
      while␣($entry␣=~␣/^\s+$/)␣{␣$entry␣=␣<$handle>;␣}
      
      #-----------------------------------------------------------------------
      #	Falls␣das␣Element␣in␣der␣Zeile␣NICHT␣beendet␣ist...
      #-----------------------------------------------------------------------
      
      unless␣(($entry␣=~␣m#/>\s*$#)␣||␣($entry␣=~␣m#</\w+>\s*$#)␣||␣$entry␣eq␣'')␣{
      
      #---------------------------------------------------------------
      #	Lese␣weitere␣Zeilen
      #---------------------------------------------------------------
      
      do␣{
      $entry␣.=␣$_␣=␣<$handle>;
      }␣while␣($_␣&&␣!m#^\s*</#);
      
      #---------------------------------------------------------------
      #	bis␣das␣Ende-Element␣gefunden␣ist.
      #---------------------------------------------------------------
      }
      
      #-----------------------------------------------------------------------
      #	Speichere␣den␣XML-Code␣des␣Objektes␣unter␣dem␣angegeben␣Index.
      #-----------------------------------------------------------------------
      
      $entry[$index]=$entry;
      
      #-----------------------------------------------------------------------
      #	Ende␣der␣Datei-Marker,␣wenn␣keiner␣der␣erwarteten␣Typen␣gefunden.
      #-----------------------------------------------------------------------
      
      my␣$type␣=␣'~';
      
      #-----------------------------------------------------------------------
      #	Bestimme␣den␣Objekt-Typ␣und␣ordne␣ihm␣einen␣Kennbuchstaben␣zu.
      #	Die␣Objekte␣sind␣zuerst␣nach␣Kennbuchstaben,␣dann␣nach␣Id␣sortiert.
      #-----------------------------------------------------------------------
      
      $type␣=␣"a"␣if␣$entry␣=~␣/^\s*<changeset/;
      $type␣=␣"b"␣if␣$entry␣=~␣/^\s*<node/;
      $type␣=␣"c"␣if␣$entry␣=~␣/^\s*<way/;
      $type␣=␣"d"␣if␣$entry␣=~␣/^\s*<relation/;
      
      #-----------------------------------------------------------------------
      #	Suchen␣den␣Id-Wert␣im␣XML:␣id="###"␣oder␣id='###'
      #	Die␣Id␣kann␣auch␣negativ␣sein.
      #-----------------------------------------------------------------------
      
      my␣$id␣=␣$entry␣=~␣/id=["'](-?[1-9]\d*)["']/␣?␣$1␣*␣1.0␣:␣0;
      
      #-----------------------------------------------------------------------
      #	Ich␣hoffe,␣dass␣maxbe␣das␣hier␣nicht␣sieht.
      #-----------------------------------------------------------------------
      #	Konstruiere␣aus␣Typ␣und␣Id␣eine␣"osmid":
      #	Die␣Id␣wird␣mit␣einem␣Offset␣von␣5*10^9␣versehen,
      #	mit␣10␣Stellen␣und␣fuehrenden␣Nullen␣formatiert,
      #	und␣dann␣an␣den␣Typ␣angehaengt.
      #	Damit␣erzeugt␣ein␣Stringvergleich␣auf␣der␣"osmid"
      #	die␣gewuenschte␣Sortierreihenfolge.
      #
      #-----------------------------------------------------------------------
      
      $osmid[$index]=sprintf␣'%s-%010.0f',␣$type,␣$id␣+␣5e9;
      
      #-----------------------------------------------------------------------
      #	Suchen␣den␣Versions-Wert␣im␣XML:␣version="###"␣oder␣version='###'
      #	Der␣Versionswert␣kann␣auch␣fehlen.
      #-----------------------------------------------------------------------
      
      $version[$index]␣=␣$entry␣=~␣/version=["']([1-9]\d*)["']/␣?␣int␣$1␣:␣0;
      }
      
      #-------------------------------------------------------------------------------
      #	$Id:␣osmmerge.pl,v␣1.7␣2013/02/11␣22:15:45␣wolf␣Exp␣$
      #-------------------------------------------------------------------------------
      __END__
      

      Have fun.

      Gruß Wolf

      Edit: jetzt auch grob ungehörige Quotes und überaus ungehörige negative ids und gänzlich ungehörige fehlende Versionsnummern und Leerzeilen und Kopfzeilen und was auch immer erlaubt. Und mit ein paar Zeilen Kommentar ergänzt.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 17:49 · [flux]
      $␣perl␣../../bin/osmmerge.pl␣Oberpfalz.osm␣Mittelfranken.osm␣>␣result
      $␣cat␣result
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmmerge.pl">
      </osm>
      $
      

      Schade 🙁


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 17:51 · [flux]

      Nahmd,

      kellerma wrote:

      $␣perl␣../../bin/osmmerge.pl␣Oberpfalz.osm␣Mittelfranken.osm␣>␣result
      $␣cat␣result
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmmerge.pl">
      </osm>
      $
      

      Schade 🙁

      Da das Skript keinen XML-Parser enthält, geht es von einem ganz bestimmten Format aus.
      Zeig mal die ersten paar Zeilen von Deinen Dateien.

      Falls die Dateien eine BBox definieren → entsprechenden Kommentar im Skript beachten.

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 17:59 · [flux]
      $␣head␣Oberpfalz.osm
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version='0.6'␣upload='false'␣generator='JOSM'>
      <node␣id='-5191118'␣visible='true'␣lat='49.4648038658'␣lon='11.7813332341'␣/>
      <node␣id='-5191116'␣visible='true'␣lat='49.4650386866'␣lon='11.7815495847'␣/>
      <node␣id='-5191114'␣visible='true'␣lat='49.4653578758'␣lon='11.7818638913'␣/>
      <node␣id='-5191112'␣visible='true'␣lat='49.4661894486'␣lon='11.7822815027'␣/>
      <node␣id='-5191110'␣visible='true'␣lat='49.4663091778'␣lon='11.7823718007'␣/>
      <node␣id='-5191108'␣visible='true'␣lat='49.4664238236'␣lon='11.7825312441'␣/>
      <node␣id='-5191106'␣visible='true'␣lat='49.4664740729'␣lon='11.7827571616'␣/>
      <node␣id='-5191104'␣visible='true'␣lat='49.4664809774'␣lon='11.7828104215'␣/>
      $
      $␣head␣Fuerth.osm
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmconvert␣0.3">
      <bounds␣minlat="49.35435"␣minlon="10.68002"␣maxlat="49.54901"␣maxlon="11.02595"/>
      <node␣id="15432251"␣lat="49.4167003"␣lon="10.9858232"␣version="3"␣timestamp="2009-10-23T21:34:46Z"␣changeset="2933199"␣uid="13363"␣user="CaptainCrunch">
      <tag␣k="name"␣v="Unterasbach"/>
      <tag␣k="railway"␣v="halt"/>
      </node>
      <node␣id="15432252"␣lat="49.4169583"␣lon="10.9648829"␣version="5"␣timestamp="2009-11-14T17:08:43Z"␣changeset="3114941"␣uid="83876"␣user="BurnyB">
      <tag␣k="name"␣v="Oberasbach"/>
      <tag␣k="railway"␣v="halt"/>
      

      EDIT:
      Ok, wenn ich die bbox-Zeile rausnehme, kann ich Fürth & Nürnberg verschmelzen und stimmt mit osmconvert's merge überein:

      23284454 Feb 9 18:05 Fürth.osm
      107875070 Feb 9 18:05 Nürnberg.osm
      130660206 Feb 9 18:07 merge_osmconvert.osm
      130660202 Feb 9 18:06 result
      $ diff merge_osmconvert.osm result |head
      2c2
      < <osm version="0.6" generator="osmconvert 0.7N">


      <osm version="0.6" generator="osmmerge.pl">

      $


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 18:05 · [flux]

      Nahmd,

      kellerma wrote:

      $␣head␣Oberpfalz.osm
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version='0.6'␣upload='false'␣generator='JOSM'>
      <node␣id='-5191118'␣visible='true'␣lat='49.4648038658'␣lon='11.7813332341'␣/>
      

      Die Datei hat die falschen Quotes. Nur ["] ist gehörig, ['] ist grob ungehörig. Schäm Dich! 😛

      Gruß Wolf

      Edit: Ich hab' schnell 'ne Version gemacht, die beides frisst.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 18:19 · [flux]

      Auch mit der grob ungehörigen Version lassen sich die JOSM-Mittelfranken.osm & Oberpfalz nicht mergen:

      $␣cat␣result
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmmerge.pl">
      </osm>
      

    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 18:29 · [flux]

      Nahmd,

      kellerma wrote:

      Auch mit der grob ungehörigen Version lassen sich die JOSM-Mittelfranken.osm & Oberpfalz nicht mergen:

      $␣cat␣result
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmmerge.pl">
      </osm>
      

      Du hast negative Node-Ids. Die gibts in der OSM-Datenbank nicht.
      Werden jetzt aber auch gefressen.

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 18:37 · [flux]

      Netzwolf wrote:

      Du hast negative Node-Ids. Die gibts in der OSM-Datenbank nicht. Sollen die wirklich rein?

      Ja, das ist ganz normal:
      JOSM vergibt negative IDs für Punkte (auch Wege), die man im Editor neu erstellt hat und noch nicht hochgeladen wurden.

      EDIT:
      Auch mit der überaus ungehörigen Version klappt es nicht.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 18:43 · [flux]

      Nahmd,

      kellerma wrote:

      Netzwolf wrote:

      Du hast negative Node-Ids. Die gibts in der OSM-Datenbank nicht. Sollen die wirklich rein?

      Ja, das ist ganz normal:
      JOSM vergibt negative IDs für Punkte (auch Wege), die man im Editor neu erstellt hat und noch nicht hochgeladen wurden.

      Ok. Ich speicher schon mal aus JOSM, aber nur um das Zeug kurz danach wieder zu laden. Reingeguckt habe ich noch nie. Und wie gesagt, die negativen Zahlen geh jetzt auch. Aber nur, solange das Zeug in der Reihenfolge node, way, relation kommt und innerhalb der jeweiligen Gruppe nach ids sortiert ist: -2, -1, 1, 2, …

      .oO( und auch nur bis id=5 Milliarden. Der danach nötige Upgrade zur Pro-Version wird schweineteuer werden. )

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 19:04 · [flux]

      Netzwolf wrote:

      .oO( und auch nur bis id=5 Milliarden. Der danach nötige Upgrade zur Pro-Version wird schweineteuer werden. )

      Nö, der bug muss woanders sein (für osmconvert ist das auch in der "Lang-Versoin" kein Problem"):

      $␣cat␣n.osm
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version='0.6'␣upload='false'␣generator='JOSM'>
      <node␣id='-408038'␣visible='true'␣lat='49.1861474038'␣lon='11.0836863015'␣/>
      <node␣id='-408036'␣visible='true'␣lat='49.18607107'␣lon='11.0835941604'␣/>
      </osm>
      $␣cat␣p.osm
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version='0.6'␣upload='false'␣generator='JOSM'>
      <node␣id='-191118'␣visible='true'␣lat='49.4648038658'␣lon='11.7813332341'␣/>
      <node␣id='-191116'␣visible='true'␣lat='49.4650386866'␣lon='11.7815495847'␣/>
      </osm>
      $␣perl␣../osmmerge.pl␣n.osm␣p.osm␣>␣result
      $␣cat␣result
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmmerge.pl">
      </osm>
      $␣osmconvert␣n.osm␣p.osm␣>␣result2
      $␣cat␣result2
      <?xml␣version='1.0'␣encoding='UTF-8'?>
      <osm␣version="0.6"␣generator="osmconvert␣0.7N">
      <node␣id="-408038"␣lat="49.1861474"␣lon="11.0836863"/>
      <node␣id="-408036"␣lat="49.186071"␣lon="11.0835941"/>
      <node␣id="-191118"␣lat="49.4648038"␣lon="11.7813332"/>
      <node␣id="-191116"␣lat="49.4650386"␣lon="11.7815495"/>
      </osm>
      

    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 19:14 · [flux]

      Nahmd,

      Nö, der bug muss woanders sein (für osmconvert ist das auch in der "Lang-Versoin" kein Problem"):

      Hmpf! Jetzt fehlen die Versionsnummern.

      Code ist so geändert, dass er auch mit fehlenden Versionsnummern zurechtkommt.
      (Obwohl das langsam mit meinem Gewissen nimmer zu vereinbaren ist.)

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · kellerma (Gast) · 09.02.2013 19:27 · [flux]

      Vielen Dank für Deine Bemühungen 😄

      Das ist ja jetzt wie 1806: Mfr und Opf. glücklich vereint.

      Du kommst aus dem Rheinland?
      Aber nicht zufällig aus der Rheinpfalz, die war ja auch mal bayerisch 😉


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 09.02.2013 19:39 · [flux]

      Nahmd,

      kellerma wrote:

      Vielen Dank für Deine Bemühungen 😄

      Das ist ja jetzt wie 1806: Mfr und Opf. glücklich vereint.

      Hehe!
      Und? Schon mit 200 Dateien gleichzeitig probiert?

      .oO( darf auch 200× die gleiche sein 😛 )

      Du kommst aus dem Rheinland?

      Yepp. Bayrisch-kölsche Coproduktion.

      Aber nicht zufällig aus der Rheinpfalz, die war ja auch mal bayerisch 😉

      Nö.
      Aber ich hab immer wieder mal die Provinzler aus dem Rheintal zwischen Köln und Koblenz im Zug sitzen, die in Köln (zumindest glauben sie es) einen draufgemacht haben. Meinen Eindruck von denen verrate ich aber nur bei Anwesenheit meines Anwalts. 🤔

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Marqqs (Gast) · 10.02.2013 17:22 · [flux]

      jman1983 wrote:

      gibt es irgendwie die Möglichkeit beliebig viele .osm-Dateien aus einem Verzeichnis zu einer Großen zusammenzufassen?

      Man kann ja mit osmconvert zwei Dateien zu einer zu mergen. Aber ich hab ein Verzeichnis mit zig Dateien und möchte eine "Große" haben.

      Hallo Jan,

      zuerst einmal ist es wichtig, dass die .osm-Dateien nicht geclippt wurden, sondern auch im Grenzbereich ganze Wege enthalten – zumindest was die way-Objekte betrifft. Die zgehörigen außerhalb liegenden Knoten dürfen jeweils fehlen. Die regionalen Extrakte von geofabrik.de erfüllen diese Voraussetzung.

      Dann ist es unter Linux ganz einfach:

      ./osmconvert␣*.osm␣-o=../ausgabeverzeichnis/gesamt.osm
      

      Wie du siehst, ist es ratsam für die Ausgabe-OSM-Datei ein anderes Verzeichnis zu wählen, weil sie sonst eventuell als Eingabedatei verwendet wird. Das gäbe ein durcheinander. :-)

      Grüße
      Markus


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · HolgerJeromin (Gast) · 10.02.2013 20:48 · [flux]

      alle in josm laden (vielleicht nicht alle auf einmal) und die ebenen markieren und mergen? 🙂


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 11.02.2013 16:58 · [flux]

      Marqqs wrote:

      ./osmconvert␣*.osm␣-o=../ausgabeverzeichnis/gesamt.osm
      

      Hallo Markus,

      ja das wäre ja super, wenn der Aufrugf so einfach wäre. Nur leider bekomme ich folgende Fehlermeldung:

      osmconvert␣Error:␣could␣not␣get␣183500800␣bytes␣of␣memory.
      

      Zufällig irgendeine Idee, woran es liegen kann? Die Daten stammen übrigens alle von der Overpass-Api (Node und Way (inkl. Node))

      Gruß

      Jan


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 11.02.2013 17:08 · [flux]

      Nahmd,

      jman1983 wrote:

      osmconvert␣Error:␣could␣not␣get␣183500800␣bytes␣of␣memory.
      

      Zufällig irgendeine Idee, woran es liegen kann? Die Daten stammen übrigens alle von der Overpass-Api (Node und Way (inkl. Node))

      Sind die Objekte möglicherweise nicht nach Id sortiert?

      Dann muss ein Programm die sortieren, um die Doubletten zu finden. Und am einfachsten sortiert es sich, wenn alle Objekte im Speicher liegen. 🙂

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · mmd (Gast) · 11.02.2013 17:32 · [flux]

      jman1983 wrote:

      [
      ja das wäre ja super, wenn der Aufrugf so einfach wäre. Nur leider bekomme ich folgende Fehlermeldung:

      osmconvert␣Error:␣could␣not␣get␣183500800␣bytes␣of␣memory.
      

      Zufällig irgendeine Idee, woran es liegen kann? Die Daten stammen übrigens alle von der Overpass-Api (Node und Way (inkl. Node))

      Wieviel Speicher steht denn deinem System (bzw. deinem User) zur Verfügung? Ich hatte mal auf einer extrem eingeschränkten Cloud Testinstanz mit 400MB (!) Speicher auch Probleme und musste mit dem Parameter --hash-memory den maximal zu belegenden Speicher solange nach unten schrauben, bis es gepasst hat. Wie das funktioniert ist unter "osmconvert --help" im Abschnitt "Tuning" gut beschrieben.
      Edit: Ah, ich sehe gerade, ich hatte das für osmfilter eingesetzt, sollte aber mit osmconvert analog laufen.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 11.02.2013 18:58 · [flux]

      Hallo Netzwolf und mmd,

      Netzwolf wrote:

      ...
      Sind die Objekte möglicherweise nicht nach Id sortiert?
      ...

      Ne, daran liegt es (glaube ich) nicht, wenn ich nämlich "per hand" (osmconvert x.osm b .osm u.osm -o=xbu.osm) ausführe, klappt es problemlos.

      mmd wrote:

      Wieviel Speicher steht denn deinem System (bzw. deinem User) zur Verfügung? Ich hatte mal auf einer extrem eingeschränkten Cloud Testinstanz mit 400MB (!) Speicher auch Probleme und musste mit dem Parameter --hash-memory den maximal zu belegenden Speicher solange nach unten schrauben, bis es gepasst hat. Wie das funktioniert ist unter "osmconvert --help" im Abschnitt "Tuning" gut beschrieben.
      Edit: Ah, ich sehe gerade, ich hatte das für osmfilter eingesetzt, sollte aber mit osmconvert analog laufen.

      Also das hier ist ein Windows 7 x64 System mit 8gb Arbeitsspeicher. Also ich glaube es müsste eigentlich ausreichend sein. ( Wenn ich mir die Extrakte der GEofabrik merge (D-A-CH) klappt es ja auch und das sind eindeutig mehr Daten 😉 )

      Aber ich werde es mal probieren. Vielen Dank für den Hinweis.

      Gruß

      Jan


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · mmd (Gast) · 11.02.2013 20:03 · [flux]

      jman1983 wrote:

      Also das hier ist ein Windows 7 x64 System mit 8gb Arbeitsspeicher. Also ich glaube es müsste eigentlich ausreichend sein. ( Wenn ich mir die Extrakte der GEofabrik merge (D-A-CH) klappt es ja auch und das sind eindeutig mehr Daten 😉 )

      Kurzer Blick in http://m.m.i24.cc/osmconvert.c verrät, dass das eigentlich nicht wirklich etwas bringt. Warum?

      Pro Datei wird ein konstanter prefetch-Puffer von ~183MB angefordert, der sich auch nicht über Parameter konfigurieren lässt. Spätestens bei 10-15 OSM-Dateien dürfte dann Schluß sein, denn das Binary für Windows ist 32bit, kann also mit ganzen 8GB Speicher nicht wirklich etwas anfangen. Die Grenze dürfte irgendwo zwischen 2GB und 3GB liegen. Da hilft nur ein Aufteilen in kleinere Pakete, oder Marqqs kann das sonst irgendwie korrigieren.


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 11.02.2013 20:09 · [flux]

      Nahmd,

      mmd wrote:

      Pro Datei wird ein konstanter prefetch-Puffer von ~183MB angefordert, der sich auch nicht über Parameter konfigurieren lässt. Spätestens bei 10-15 OSM-Dateien dürfte dann Schluß sein, denn das Binary für Windows ist 32bit, kann also mit ganzen 8GB Speicher nicht wirklich etwas anfangen. Die Grenze dürfte irgendwo zwischen 2GB und 3GB liegen. Da hilft nur ein Aufteilen in kleinere Pakete, oder Marqqs kann das sonst irgendwie korrigieren.

      Oder das kleine Perlscript oben. Das liest nur jeweils ein OSM-Objekt aus den Streams und kann – solange die Kommandozeile nicht zu lang wird und das Betriebssystem Filehandles rausrückt – auch hunderte bis tausende von Dateien mergen.

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 11.02.2013 20:47 · [flux]

      Hallo Netzwolf,

      Netzwolf wrote:

      Nahmd,

      Oder das kleine Perlscript oben. Das liest nur jeweils ein OSM-Objekt aus den Streams und kann – solange die Kommandozeile nicht zu lang wird und das Betriebssystem Filehandles rausrückt – auch hunderte bis tausende von Dateien mergen.

      Gruß Wolf

      Hab ich mir mal heruntergeladen bzw. kopiert! Ich nutze "ActivePerl 5.16.2 Build 1602 (64-bit)" und jetzt bekomme ich folgende Fehlermeldung:

      file:␣*.osm␣at␣osmmerge.pl␣line␣26.
      

      Ich starte das Skript wie im Kommentarheader beschrieben.

      Oh man, ich hätte nicht gedacht, dass mein "kleines" Problem/Anliegen solche "Wellen" erzeugt!
      Vielen herzlichen Dank euch allen für die Hilfe.

      Gruß

      Jan


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 11.02.2013 21:02 · [flux]

      Nahmd.

      jman1983 wrote:

      file:␣*.osm␣at␣osmmerge.pl␣line␣26.
      

      Ich starte das Skript wie im Kommentarheader beschrieben.

      Das Windos erweitert das “*.osm” nicht zu allen Dateien mit der Endung “.osm”; das Skript bekomme das “*.osm” direkt geliefert statt eine Liste aller Datein; und kann die Datei “*.osm” natürlich nicht öffnen.

      Windows shells such as cmd.exe and Windows PowerShell do not glob, but instead rely on the called program or Cmdlet to perform globbing. (Wikipedia/en)

      Das Globbing ist jetzt eingebaut.

      Sorry + Gruß Wolf

      Edit: Futur→Perfekt


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 11.02.2013 21:40 · [flux]

      Vielen Dank für deine Mühe Netzwolf, ich stehe tief in deiner Schuld!

      Es werden jetzt die zu bearbeitenden Daten ausgegeben, allerdings ist die Zieldatei nun leer ;(


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 11.02.2013 22:01 · [flux]

      jman1983 wrote:

      Es werden jetzt die zu bearbeitenden Daten ausgegeben, allerdings ist die Zieldatei nun leer ;(

      Zeig mal die ersten paar Zeilen von einer Datei.

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 12.02.2013 17:11 · [flux]

      Hallo Netzwolf,

      sorry für die späte Antwort, aber die Arbeit hat mich abgehalten 😉

      Also ich vermute jetzt, du meinst die osm Datei. Es ist eine normale osm-Dateivon der Overpass-Api:

      <?xml␣version="1.0"␣encoding="UTF-8"?>
      <osm␣version="0.6"␣generator="Overpass␣API">
      <note>The␣data␣included␣in␣this␣document␣is␣from␣www.openstreetmap.org.␣The␣data␣is␣made␣available␣under␣ODbL.</note>
      <meta␣osm_base="2013-02-11T19:33:02Z"/>
      ...
      </osm>
      

      Gruß Jan


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · EvanE (Gast) · 12.02.2013 17:20 · [flux]

      jman1983 wrote:

      Also ich vermute jetzt, du meinst die osm Datei. Es ist eine normale osm-Dateivon der Overpass-Api:

      <?xml␣version="1.0"␣encoding="UTF-8"?>
      <osm␣version="0.6"␣generator="Overpass␣API">
      <note>The␣data␣included␣in␣this␣document␣is␣from␣www.openstreetmap.org.␣The␣data␣is␣made␣available␣under␣ODbL.</note>
      <meta␣osm_base="2013-02-11T19:33:02Z"/>
      ...
      </osm>
      

      Hallo Jan

      Eigentlich interessant wären Anfang und Ende von dem was dazwischen steht (deine "...").
      Übrigens: Hast du dir von der Overpass-API auch die Meta-Daten ausgeben lassen? Ohne die Meta-Daten (Version, User, Zeitstempel, ...) könnte das mit dem Mergen eventuell schwierig sein.

      Edbert (EvanE)


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 12.02.2013 17:27 · [flux]

      Hallo Edbert,
      oh sorry, wusste ich nicht 😉 Also dann alles:

      <?xml␣version="1.0"␣encoding="UTF-8"?>
      <osm␣version="0.6"␣generator="Overpass␣API">
      <note>The␣data␣included␣in␣this␣document␣is␣from␣www.openstreetmap.org.␣The␣data␣is␣made␣available␣under␣ODbL.</note>
      <meta␣osm_base="2013-02-11T19:33:02Z"/>
      
      <node␣id="243637686"␣lat="48.8626454"␣lon="8.2150067">
      <tag␣k="addr:city"␣v="Rastatt"/>
      <tag␣k="addr:country"␣v="DE"/>
      <tag␣k="addr:housenumber"␣v="1"/>
      <tag␣k="addr:postcode"␣v="76437"/>
      <tag␣k="addr:street"␣v="Karlsruher␣Straße"/>
      <tag␣k="amenity"␣v="fuel"/>
      <tag␣k="brand"␣v="Jet"/>
      <tag␣k="fuel:diesel"␣v="yes"/>
      <tag␣k="fuel:e10"␣v="yes"/>
      <tag␣k="fuel:octane_95"␣v="yes"/>
      <tag␣k="fuel:octane_98"␣v="yes"/>
      <tag␣k="name"␣v="Jet"/>
      <tag␣k="wheelchair"␣v="limited"/>
      </node>
      
      </osm>
      

      Ah, ne Metadaten lasse ich mir nicht ausgeben. Versuche ich gleich mal. Oh man, wenn dass der Fehler ist/war, ist es mir schrecklich peinlich...


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 12.02.2013 17:45 · [flux]

      So jetzt das ganze nochmal mit Metadaten versucht, aber leider das selbe Ergebnis:
      zu bearbeitende Dateien werden aufgelistet, Zieldatei ist leer bzw. enthält nur das "Grundgerüst"...


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · Netzwolf (Gast) · 12.02.2013 19:27 · [flux]

      Nahmd,

      jman1983 wrote:

      So jetzt das ganze nochmal mit Metadaten versucht, aber leider das selbe Ergebnis:
      zu bearbeitende Dateien werden aufgelistet, Zieldatei ist leer bzw. enthält nur das "Grundgerüst"...

      Ist mir das peinlich. 🙁

      Normalerweise lese ich die OSM-Daten mit einem XML-Reader; daher war mir nicht klar, in wieviel Variationen z.B. der Header kommt. 🙄 Ich hab den Code in meinem alten Beitrag aktualisiert und ihn zusätzlich ins Netz gestellt. Der frisst jetzt die Beispieldatei.

      Nachtrag: Das Skript ist jetzt auch zertifiziert!:
      😎

      Wenn die Aufgabenstellung “große Menge von OSM-Dateien mergen” häufiger vorkommt, so bitte Bescheid sagen: dann baue ich eine saubere Version in Java.

      Gruß Wolf


    • Re: x osm-Dateien zu einer Datei zusammenfassen? · jman1983 (Gast) · 12.02.2013 20:08 · [flux]

      Hallo Netzwolf!

      10000000000 fachen Dank für deine Mühe, jetzt klappt es!

      Gruß Jan