Libraries zum Lesen und Schreiben von OSM-Daten gesucht

Ich habe vermutlich zukünftig den Bedarf, die OSM-Kartendaten vor der Weiterverarbeitung zu verändern.

Beispiel: Aus den Tags “place=city && population >1.000.000” soll das Tag “place=megacity” werden.
Anschließend sollen die Tags “place=city” und “population >1.000.000” gelöscht werden.
Anmerkung: Natürlich passiert alles nur in meinen lokalen Daten.

Was ich hierzu benötige / suche, sind Libraries zum Lesen und Schreiben der OSM-Daten.
Diese sollten idealerweise von Perl oder C aus nutzbar sein.
Gefunden habe ich bislang die C-Library “o5mreader” zum Einlesen von o5m-Daten (https://github.com/bigr/o5mreader).

Fragen:

  • Gibt es auch eine Library zum Schreiben von o5m-Daten (oder geeignete Code-Snippets) ?
  • Wären andere Ansätze zur Zielerreichung ggf. sinnvoller ?
  • Oder gibt es gar Utilities die die Anforderungen abdecken ?

Gruß Klaus

Wären Manipulationen auch VOR Umformung in o5m eine gangbare Methode? Für .osm und .pbf gäbe es bestimmt passende Werkzeuge:
http://wiki.openstreetmap.org/wiki/Develop/Frameworks#Data_Processing_or_Parsing_Libraries

Wenn die Einschränkung auf C / Perl nicht so wichtig ist: http://wiki.openstreetmap.org/wiki/Osmosis/TagTransform

osmfilter ist in C geschriieben, kann o5m lesen und schreiben und kennt auch Boolsche operatoren.
Ist jetzt keine Lib im eigentlichen Sinn aber als code-snippet sicherlich brauchbar.

Vielleicht http://wiki.openstreetmap.org/wiki/Osm.pm?

Wird aber nicht mehr weiterentwickelt, da gary68 sich leider zurückgezogen hat.

Christian

läßt sich prima mit postgresql machen - wenn man eine db hat :sunglasses:. API für alle Sprachen gibt es natürlich. Ich benutzt dafür Java.

update nodes set tags=tags||‘place=>megacity’ where tags->‘place’=‘city’ and (tags->‘population’)::int>1000000;
update nodes set tags=tags-‘population’::text where tags->‘place’=‘megacity’ and (tags->‘population’)::int > 1000000;

thats’s all.

Gruss
walter

see http://www.postgresql.org/docs/9.1/static/hstore.html

Kann ich nur unterstreichen, das ist ein wirklich tolles tool - damit geht fast alles.
Perl verwende ich nurmehr für das Auflösen von Relationen etc, also alles was über ein Objekt hinausgreifft.

Einziger Wermutstropfen: Mit o5m habe ich seltsame Ergebnisse (zumindest unter WindowsXP).

EDIT: Hier das conf für tagtransform


<?xml version="1.0"?>
<translations>
	<translation>
		<name>get megacitys</name>
		<description>get megacitys</description>
		<match mode="and" type="node">
			<tag k="place" v="city"/>
			<tag k="population" v=".{7,}"/>
		</match>
		<output>
			<copy-all/>
			<tag k="place" v="megacity"/>
		</output>
	</translation>	
</translations>

Die Population wird noch nicht gelöscht und die regex ist wirklich Q&D, aber sonst läuft es…

Innerhalb der können beliebig viele gebildet werden, das tool ist extrem flexibel und komplex.

Grüsse
Christian

Zunächst einmal Danke für die (erstaunlich vielen) Vorschläge.
Näher angesehen habe ich mir bislang das osmosis-Plugin “TagTransform”.
Leider fehlt mir die Funktion aus mehreren vorhandenen Werten einen neuen Wert zu erzeugen - Beispiel:

Ist:


Soll:



Ist so etwas mit TagTransform auch möglich ?
Bislang konnte ich nichts entsprechendes finden.

Gruß Klaus

jaja, so san mer halt :wink:

Bevor du dir größere Gedanken über die Möglichkeinen von tagtransform machst, versuche das Zeug erst einmal überhaupt zum Laufen zu bekommen - mir ist es noch nie gelungen, da die Versionen von Osmosis und TagTransform nie zusammenpassten. Aber eventuell hat sich das ja 2012 geändert.

Ansonsten frage ich mich, wie du deine - auf welchem Weg auch immer - modifizierten lokalen Daten mit den sich permanent ändernden Live-Osm-Daten synchron halten willst.
Mir fällt da nur “alles neu runterladen und erneut konvertieren” ein. Kann man bei kleinen Bereichen (Stadt, Kreis, eventuell Bundesland wohl machen aber bei Germany oder mehr würde ich mir was besseres einfallen lassen)

Gruss
walter

Hallo Walter, Klaus

Sind diese Änderungen an Taggs nicht erst bei der Bearbeitung durch einen Renderer notwendig? Und unterstützen Renderer wie Mapnik, mkgmap, … solche Transformation nicht in ihrem Regelset? In dem Fall könnte auch die Aktualisierung der Daten mit dem normalen Prozedere erfolgen.

Edbert (EvanE)

Zumindest in Brett Henderson’s osmosis-Branch (0.41) läuft tagtransform. Gerade komplett neu kompiliert und getestet. → https://github.com/brettch/osmosis
Es gibt bestimmt auch fertige Pakete, dazu kann christiank61 vielleicht etwas sagen. Klaus’ Frage kann ich nicht beantworten, ich würde die Frage eher auf osmosis-dev stellen. Meine Vermutung ist, dass möglichst viel Logik in einen generischen Layer verlagert werden soll, damit nicht für jeden Renderer (Garmin, Android,…) alle Regeln redundant gepflegt werden müssen.

ja, das hab ich mich auch schon gefragt: “Was soll das Ganze eigentlich? Ist doch unnötig” Aber wer kann ahnen was hier wirklich geplant ist.

Gruss
walter

Zum Hintergrund:
Die gewünschte Funktionalität wird im Zusammenhang mit einem Echtzeit-Renderer auf Android-Devices benötigt. Zum einen sind die logischen Verarbeitungsmöglichkeiten dort sehr begrenzt, und zum anderen, falls sie denn vorhanden wären, aus Performanzgründen (vermutlich) nicht wünschenswert. Der Benutzer will ja die Karte möglichst zeitnah sehen, nachdem er einen Bereich verschoben oder die Zoomstufe geändert hat. D.h. der Renderer soll/muss die bereits “passenden” Daten erhalten und sich im wesentlichen um das (performante) Rendering kümmern. Somit sind im Vorfeld die Daten in die geeignete Form zu bringen. Und hier kann man sich ja so einiges Vorstellen. Einige Beispiele wurden bereits genannt, aber auch String sollten “komplex” aufbereitet werden können. Also z.B. sinnvoll (oder überhaupt) abgekürzt werden, für unterschiedliche Zoomstufen aufbereitet werden und vieles mehr …

Gruß Klaus

PS: Wie von “mmd” bereits angemerkt, erfordert das osmosis-Plugin “TagTransform” eine Neucompilation.