letzte 100 records ausfiltern - die nach bestimmten timestamp kamen

Hallo und guten Abend

ich will eine Abfrage zu einem OSM-file machen mit dem Ziel mit osmfilter die letzten 100 records ausfiltern die nach einem bestimmten Timestamp gemacht wurden.
vorweg: hier hatte ich die Frage mal angesprochen .gather the latest records with osmconvert - OSM Help ) - aber kam leider nicht weiter.

Es geht darum:

a die sagen wir 100 neuesten Records zu einem Gebiet erhalten - mit dem amenity=School - /(erste Randbedinung) und
b mit einem moeglichst vollständigen Datensatz - z.B. mit einer Website. (zweite Randbedingung)

Hab schon einiges kennengelernt: Kann diese Abfrage durchführen … mit:

  • overpass-API, aber das Gebiet ist zu gross und dann passiert folgendes overpass timed out
  • das osmconvert-tool (das Manual: m.m.i24.cc/osmconvert.c )
  • das osmfilter-tool (das Manual http://m.m.i24.cc/osmfilter.c )
  • die opaQuery.pl - ist ein kleines, aber doch recht mächtiges Perl-Programm (easyclasspage.de )

Die Bedingungen die eingehen müssen in die Suche sind wohl so zu formulieren: alles was (newer:‘timestamp’) - also nur Objekte neuer als Timestamp (Beispiel: ‘2014-06-01T07:00:00Z’). Will die letzten 100 records z.B. mit dem amenity=School - z.B. von

a. Süd Amerika
b. Afrika
c. dem Planeten - mein Notebook schafft das sicher nicht. DA werde ich dann umsteigen müsssen.

Starten tu ich mit Südamerika:Ensprechend dem Manual http://m.m.i24.cc/osmconvert.c sollte ich ggf. das Timestamp-Kriterium in Betracht ziehen.

“–timestamp=<date_time> add a timestamp to the data\n”
“–timestamp=NOW- add a timestamp in seconds before now\n”
"–out-timestamp output the file's timestamp, nothing else\n"

Randbedingung: Alle Resultate die zwischen zwei Timestamps gemacht wurden u. eine Webseite enthalten.

a. das reduziert die Records auf ein Minimum - ggf. kann ich sogar festlegen,
b. dass ich die letzten 100 records bekomme

Denke dass man mit osmconvert und osmfilter am schnellsten hinkomme:

Das läuft schon gut - aber nun will ich die Abfrage gemäß der o.g. Randbedinungen a.und b. noch etwas verbessern. Will nur die neuesten Records oder Einträge.

Für einen Tipp bin ich dankbar - vielen Dank schon im Voraus

Viele Grüße
tag_the_world :wink:

Hallo auch!

Mir fällt es grad schwer, dein Ansinnen zu verstehen…

  1. Was meinst du mit “Records”? Meinst du Nodes, Ways oder Relations?
  2. Was ist, wenn ein Way zu den 100 neuen “Records” gehört, sollen die zugehörigen Nodes auch dann in der Ergebnisdatei sein, wenn sie schon länger nicht geändert wurden?
  3. Warum grad eine feste Anzahl von “Records”? Warum nicht alles ausgeben, was z.B. im Lauf dieser Woche oder z.B. zwischen 12 und 24 Uhr verändert wurde? Wäre das eine Alternative?
  4. Was ist dein Ziel? Was hast du mit diesen Daten vor?

Zu osmfilter: nach Objekt-Timestamps lässt sich damit nicht filtern – glaube ich zumindest.
Du könntest diese Funktionalität natürlich für deine Zwecke ergänzen, es handelt sich ja um freie Software. Ebenso könntest du das sehr flexible Framework Osmium von Jochen Topf dafür verwenden. Vielleicht klappt es sogar mit dem Programm Osmosis, da bin ich mit jetzt allerdings nicht sicher.

Wochenendgrüße
Markus

hallo Markus - guten Morgen,

Vorweg: Dir einen guten Einstieg ins Wochenende!

vielen Dank für deine Antwort. ggf muesste ich oben einfach noch stärker fokussiert auf die Kernfrage sein: Es gibt sicher mehrere Wege die Fragen zu loesen.

Also bin neu bei opnstreetmap; was mich fasziniert ist die kollaborative Art wie dieses Netz wächst und zwar allerorten. Ich interessiere ich mich für päd. Initiativen u. Aktionen - v.a. in Südamerika, Afrika … Besonders beeindruckend finde ich zu beoachten was im Verlauf der Zeit passiert. Also Unterschiede pro Zeit zu beoachten - wie man das auch hier besonders gut sehen kann…:;

https://taginfo.openstreetmap.org/tags/amenity=school

Mich interessiert grundsätzlich das Wachstum - und eben auch, was zuletzt passiert. ist Bin nicht so sehr an den absoluten Datenmengen interessiert. Die zu extrahieren ist ja auch nicht so schwer. Siehe die jetzt schon lauffähigen Abfragen oben.

Jetzt geht es mit um das Herausfiltern spezieller Ergebnisse unter besonderen Randbedinungen: Für die techn. Umsetzung: Die moeglichen Lösungen die mir noch eingefallen sind:

ich besorge mit mir mit osmconvert u. -filter die Gesamtmenge aller Einträge und hab dann eine excel-Tabelle mit - sagen wir 3000 Einträgen für Kolumbien bis ca. 7000 für Argentinien. Da sind dann Zeilen mit mehr oder weniger grossen Datensätzen drinne. In dem Ergebni dasss mit der o.g. Toolchain erreicht wird fehlt z.B. der Timestamp ganz.

**Ansätze: ** Wenn ich jetzt die Abfragen zu zwei (!!!) Zeitpunkten mache, dann kann ich über einen diff der Ergebnissen doch auch die Resultate vergleichen. Das müsste gehen oder!? Entweder die Differenzen der CSV-formatierten Dateien oder ggf. schon früher in der Kette. Das ist doch die FRAGE; Und deshalb denke ich dass man ggf mit Timestamps weiterkommt. Deine Einwände finde ich plausibel - hier muss ich nochmals nachdenken.

Bei den Resultaten denke ich dass ich insgesamt nodes, ways und relations zusammengenommen haben will. Auf die Zahl 100 bin ich nicht festgelegt. GGF ist es einfach am besten einen oder sagen wir zwei bestimmte Timestamps zu nehmen und dann alle Resultate zu untersuchen. Allerdings ist mir eine Randbediungung wichtig. Ich will für diese Abfrage alle Ergebnisse rauswerfen die keine Webseite haben. Das reduziert dann doch erheblich. Die Frage ist - wie kann ich all diese Randbediungungen so in die Toolchain einbauen dass es moeglichst einfach alles wird - und ggf. ich gar nicht so große Datenmengen holen muss. Zwischenbemerkung: kann man dass ggf. auch mit overpass-api machen?

** Zurück zu osmconvert und -osmfilter: **
Was wäre wenn ich - osmconvert und osmfilter einsetze und dann eben mit der Berücksichtigung der o.g.Randbediungen: wie könnten ja auch eine Analyse eines Files herstellen und ein Set statistischer Daten herstellen: z.B. auch u.a. folgender Daten:

Aber - und das hab ich durch deine Gedanken erfahren, koennte hier der Einsatz von Timestamps schwierig werden.
GGF koennte ich dann ansetzen wie folgt:

Hmmm - Wie findest du das!?

Oder ich settze so an:

oder so: wie hier erläutert http://wiki.openstreetmap.org/wiki/DE:Osmfilter

oder eben so;

wie hier erläutert wird: http://wiki.openstreetmap.org/wiki/DE:Osmfilter

Tag-Filter beziehen sich immer nur auf einzelne Tags. Damit lässt sich festlegen, welche Tags erhalten bleiben und welche ausgeschlossen werden.
Bestimmte Tags behalten

Und was wäre wenn ich boolsche Algebra arbeiten und dann etwas folgende Verknüpfung baue und dann noch zusätzlich den Timestamp mit einbaue?!

Ferner koennte ich das vielleicht auch noch angehen mit

a. overpass-Api
b. dem von dir genannten Tool dem Framework Osmium von Jochen Topf

Hmm - ich werde am WE mal einiges ausprobieren u. meld mich wieder hier.

Freu mich sehr wenn dir ggf. noch etwas einfällt.

schon mal ein scheones Wochenende!! :slight_smile:
VG TagtheWorld

Das geht alles wunderbar mit Overpass API (momentan nur zurück bis Juni 2014 bis zum DB rebuild)

Beispiel 1: Schulen in Argentinien am 1.6.2014:


[date:"2014-06-01T00:00:00Z"];area[name="Argentina"][boundary=administrative]->.a;(node(area.a)[amenity=school];way(area.a)[amenity=school];);out center;

Beispiel 2: Änderungen an Schulen in Argentinien seit dem 1.7.2014 (mit Berücksichtigung gelöschter Objekte)


[adiff:"2014-07-01T00:00:00Z"];area[name="Argentina"][boundary=administrative]->.a;(node(area.a)[amenity=school];way(area.a)[amenity=school];);out center;

Wichtig: Ein Planet enthält immer nur den aktuellen Stand der OSM Datenbank. Nochmal zum Mitschreiben: Im Planet sind keine Daten zu früheren Versionen eines Objekts enthalten, insbesondere auch keine gelöschten Objekte. Das bedeutet, dass man damit keine Vergleichsanalysen zwischen zwei verschiedenen Zeitpunkten fahren kann. Nur bei Objekten mit Version 1 kann man das Erstellungsdatum verwenden, für jede nachfolgende Version ist aber nicht mehr ermittelbar, wann das Objekt ursprünglich erzeugt wurde.Das würde nur mit einem Full History Dump funktionieren (Dateigröße >50GB), oder man lädt sich viele Extrakte von unterschiedlichen Zeitpunkten herunter. Auf keinen Fall funktioniert das nur mit einem Extrakt!

Daher: am besten mit Overpass API probieren und das andere mit osmfilter, osmconvert einfach vergessen. Es funktioniert nicht, da der planet diese Information nicht enthält.

Hallo Couchmapper - guten Tag,

vielen Dank für deine rasche Antwort und die tollen Tipps. So funktioniert es bestens. Habe es gleich getestet. Deine Erkäuterungen übrigens sind sehr einleuchtend. Wie einfach das mit der Overpass-Api geht ist überwältigend. Die von mir vergleichsweise sehr sehr kleinen Datenmengen der Abfrage bekommt man mit der gewünschten Präzision sehr gut mit overpass-apil.

noch eine letzte Verständnisfrage: :

entsprechend den manuals zu overpass-api kann ich mit union mehrere queries verschachteln:

entsprechend diesem Beispiel - auf der Wikiseite der Overpass-Api: http://wiki.openstreetmap.org/wiki/Overpass_API

Union: Union allows you to group the results of several queries. For example, you can get all nodes that have name Lichtscheid or Müngstener Straße.

hier der Link nochmals http://wiki.openstreetmap.org/wiki/Overpass_API

union

Ergo: müsste ich nicht dann so um eine entsprechende verschachtelte / verknüpfte Anfrage durchzuführen - die mit der Absicht nur jene Ergebnisse in die Resultatliste zu bekommen - die eine Webseite beinhalten - dann so ansetzen…:

oder mach ich hier einen Gedankenfehler.

Dir noch ein schoenes Wochenende

VG tagtheworkd

Nein, das ist schon recht nahe dran:


[adiff:"2014-07-01T00:00:00Z"];area[name="Argentina"][boundary=administrative]->.a;(node(area.a)[amenity=school][website];way(area.a)[amenity=school][website];);out center;

2 Änderungen habe ich vorgenommen:
a) statt [website=yes] einfach [website], da beim Tag website in der Regel irgendeine Adresse steht und nicht “yes”
b) auch bei den Nodes habe ich [website] hinzugefügt

hallo Couchmapper

ganz vielen Dank - Super!!! So geht es.

Overpass-Api ist super. Und dieses Form ist in der OpenStreetMap-Community - die Perle schlechthin. Super community und Austausch.
Hier ist sooo viel Hilfsbereitschaft und unkomplizierte Hilfe. Wenn man die Threads anguckt - sieht man sofort wie toll das ist.

Und nun euch allen noch ein schoenes Wochenende :wink:

vg tagtheworld :wink:

Warum denn diese Einschränkung auf OSM?

Ich finde wir sind eines der besten Software-Foren überhaupt, was Qualität und Seriosität angeht. Naja - meistens.

Gruss
walter

Mein Leitspruch: “Hier werden Sie geholfen - ob Sie wollen oder nicht” :wink:

hallo Couchmapper hallo Walter, hallo Markus,

@ wambacher: seh das wie du - ein tolles Forum hier. - - wirklich:) Begeisternd, inspierierend und einfach klasse!!

Viele Gruesse noch einen schoenen Wochenanfang u. bis demnächst

tag aka martin :slight_smile:

Diese overpass-Abfrage gibt dir alle Wege mit dem Tag “amenity = school” die nach dem “2014-05-01” bearbeitet (erfaßt, geändert) wurden:

perl opaQuery.pl “way [amenity=school] (newer:‘2014-05-01T13:30:00Z’) (50.7, 7.1, 50.8, 7.2); out meta;”

In einem zweiten Schritt müsstest du dann die Reduktion auf die gewünschte Objektanzahl (z.B. die letzten 100) vornehmen. Dies kannst du z.B. mit der Perl-Library “OSM::Tree” recht einfach erreichen.

Gruß Klaus

PS: Um alle Objekte vom Typ “amenity=school” zu erhalten, muß du zusätzlich Nodes und Relationen in die obige Abfrage integrieren.

hallo Klaus, - vielen Dank für deine Antwort :wink:

neu - ein update: siehe unten!

vorweg: bin an vrschiedenen Techniken interessiert - einfach mal auch aus technischer Sicht.

hab mit Ruby, Python, PHP Ansätzen Versuche gemacht,

Darüber hinaus mit dem Overpass-API und natürlich auch mit osmconvert - siehe unten. Was ich am Ende auch erreichen will, ist ein ein Speichern in MySQL DB oder auch in einer PostgreSQL

An Perl hab ich mich bislang noch nciht so rangetraut. Denk aber dass Dein opaquery.pl echt klasse ist - und sehr leistungsfähig. Werde in der kommenen Woche mal ein paar Versuche damit machen.

Denke dass ich opaquery.pl sehr sehr gut dazu einsetzen kann - die Abfragen sehr detailiert zu stellen und auch die Anbidung an die DB gut herstellen zu koennen.-…

ich meld mich wieder.

LG matze

**update: **

hallo - habe einige Test gefahren.

das ist echt klasse: http://www.easyclasspage.de/maptools/seite-2.html

man kann sehr sehr viel einstellen…
Es kommt in der Leistungsfähigkeit sehr sehr den Ideen u. Absichten nahe - mittels einer Toolchain auch die DATEN weiterzuverarbeiten.

  • mysql- oder postgresql
    z.B mit DBI und XML::Twig;

Sehr gut finde ich dass man viel einstellen kann. Timeout u vieles andere mehr.

Eine Frage: Sieht man hier die jeweiligen Timestamps der Bearbitung:

Das ist sehr sehr gut

**
update 2**

die oben erwähnten Abfragen ergebn ein DATENSET wie hier gezeigt: - Das will ich nun in eine DB übergeben…

BTW: hier in dem nachfolgenden Link sieht man es etwas besser http://pastebin.com/mq5kAHyy - da ist ein groesserer DATENAUSSCHNITT sichtbar

hier sieht man es etwas besser http://pastebin.com/mq5kAHyy - da ist ein groesserer DATENAUSSCHNITT sichtbar

Das will ich nun in eine DB übergeben…

update: btw - zur overpass-api ql - vgl. hier http://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL

das ist toll dass ich das machen kann…