zuschneiden/clipping von Wegen/Flächen beim Ausschneiden von OSM-Daten

Nabend zusammen,

ich bin, malwieder, beim Import von OSM Daten in eine Postgis DB auf ein neues Problem gestoßen:

Der Plan ist, aus einem Datensatz den Teil, der innerhalb eines Polygons liegt, “auszustanzen”, würde ich mit osmosis folgendermaßen machen:
osmosis --read-pbf “datei” --bounding-polygon “Polygon” --write…

Das bekannte Problem dabei sind ja Dinge, die über die Schnittgrenze hinausgehen, zwar bietet die option “clipIncompleteEntities=true” schonmal ne möglichkeit, zumindest die Wege relativ schön zu schneiden, eine 100%ige Lösung ist das aber nicht, und bei Flächen ist das ganze insofern untragbar, da Flächen auf der Grenze keinen geschlossenen Linienzug mehr bilden, was es später unmöglich macht beispielsweise deren Flächeninhalt zu bestimmen.

Daher die Frage, gibt es ein Tool, mit dem exaktes Clipping auf OSM-Daten möglich ist?

Viele Grüße!

Hallo!
Ein Tool, das wirklich exakt clippt, muss dazu die OSM-Daten verändern:

Wege, die über die Grenze gehen, müssen am Schnittpunkt enden. Falls da nicht zufällig ein Node des Wegs ist, muss ein neuer angelegt werden. Wege, die das Gebiet verlassen und anschließend wieder “betreten”, müssen so verändert werden, dass sie an der Schnittfläche entlang laufen. Dazu sind dann wieder einige Nodes neu zu generieren und in den Weg einzufügen. Bei Multipolygon-Relationen wirds dann noch komplizierter.

Entsprechend geschnittene OSM-Daten lassen sich anschließend vermutlich nicht mehr updaten, weil die Daten ja inhaltlich verändert und ergänzt wurden.

Mir persönlich ist kein Tool bekannt, das dieses echte Clipping tatsächlich durchführt. Aber ok, das muss nicht viel heißen. :slight_smile: Vielleicht meldet sich jemand, und ich lerne was.

Man kann das in der PostGIS machen. Also erst “ueberstehende” Polygone importieren, dann das Ausschnittsgebiet als ein Polygon in eine andere Tabelle (mit nur einer Zeile und einer Spalte), und dann sowas wie

select x,y,z,st_intersection(the_geom, (select the_geom from ausschnitt)) into neue_tabelle from alte_tabelle;

Das ist nicht ganz schnell (und koennte fuer groessere Gebiete noch verschiedentlich optimiert werden, indem man das st_intersectiion nur fuer solche Polygone macht, die tatsaechlich auch den Rand ueberlappen etc), aber es geht zumindest prinzipiell. Updates sind damit auch nicht ganz unmoeglich - entweder macht man “brute force” den ganzen Ausschnitt nach jedem Import neu, oder baut in der Datenbank einen Trigger, der immer dann anspringt, wenn die Geometrie in der Tabelle durch den Import aktualisiert wurd.

Ein Tool, das so etwas auf OSM-Ebene macht, ist mir selber auch nicht bekannt. Das muesste, wie Markus geschrieben hat, in der Tat lauter Pseudo-Nodes einfuehren und waere schon ziemlich speziell.

Bye
Frederik

hi,
misterboo hat da einiges hingekriegt:

http://forum.openstreetmap.org/viewtopic.php?pid=206765#p206765

gruss
walter

p.s. es schadet nie was, wenn man die gerade aktuellen threads mitverfolgt :wink:

dank euch,

war irgentwie garnicht auf den Gedanken gekommen, das clipping erst nach dem Import in Postgis zu machen :confused:
Mit dem st_intersection scheints zu klappen, habs erstmal im kleinen probiert, ergebnisse genau wie ichs mir vorgestellt hab :slight_smile:

Also, vielen Dank nochmal;)

Um das Thema abzuschließen, und für den Fall dass mal irgentwer dasselbe Problem hat und danach sucht:
Soganz simpel wars dann doch nicht, denn eben die “Flächen” werden bei von Osmosis importierten Daten nicht korrekt geschnitten.
Der Grund ist einfach wenn man mal drüber nachdenkt… OSM kennt ja eigentlich keine Flächen, sondern nur geschlossene Linienzüge mit entsprechenden Tags… das weiß sone intersect funktion natürlich nicht. Die hackt deswegen logischerweise einfach die Teile ab, die über die Schnittkante gehen, und macht die Fläche natürlich nicht wieder zu. Am einfachsten isses, einfach aus geschlossenen Liniestrings zunächst Polygone zu erstellen, bevor man verschneidet, so hab ichs jedenfalls gemacht jetzt und hat wunderbar geklappt.

Vielen Dank nochmal für eure Hilfe:)

Wenn du eine rendering Datenbank mit osm2pgsql erstellt hättest, wären die Flächen Polygone bereits angelegt.

jop, wenn man denn nur rendern möchte, ist das natürlich der beste weg…