Unterscheidung zwischen geschlossener Polyline und gefülltem Polygon?

Guten Tag,

ich wollte fragen, wie man herausfinden kann ob eine Linie jetzt eine Fläche darstellt oder eine geschlossenen Linie (z.B. einen Ring / Kreisel). Ohne osm2pgsql, etc. - als generelle Frage. Muss man da nach bestimmten Tags gucken und wenn ja, welchen?

Ja, theorethisch könnte ich gucken, ob die letzte OSM ID = die erste OSM ID vom Way ist. Aber das würde mir ja im Beispiel eines Kreisels das ganze als Fläche kennzeichnen oder nicht?

Ich könnte auch strikt nach Tags gehen, wäre aber sehr erfreut, falls es da eine gewisse Liste an Tags gibt, die ich abgehen muss. area=yes und building=yes ist klar, aber sonst?

MfG, Felix

Da in OSM (leider) beides gleich abgebildet wird: nein. Außer wenn das area-Tag gesetzt ist. Ansonsten entscheidet der Renderer nach Gutdünken: ein Polygon mit barrier=fence ist eine geschlossene Linie, mit barrier=hedge wird es eine gefüllte Fläche … :frowning:

landuse=* und natural=* sind in der Regel gefüllte Flächen (wobei natural=tree_row einklich keine sein dürfte – ich prüf das jetzt nicht nach), ansonsten muss man wahrscheinlich wirklich einzelne Tags zusammenstellen, um das zuverlässig erkennen zu können.

Ich find’s auch doof. Wenn ein Way beides darstellt (geschlossener Linienzug und Fläche), beispielsweise ein Zaun um ein einzelnes Wohngrundstück, dann tagge ich den Way nur mit der linearen Eigenschaft (barrier=fence) und erstelle daraus ein Multipolygon mit nur einem outer-Member, das dann die Flächeneigenschaft bekommt (landuse=residential). Das ist zwar umständlich, aber ich finde es datentechnisch am saubersten, weil Wesen und Funktion der Linie dann separat abgebildet sind (der Zaun ist ja die Begrenzung des Grundstücks).

–ks

Tag-Liste ist mir nicht bekannt, ließe sich aber sicherlich schnell aus den Render-Regeln von Mapnik-Carto rausziehen.

Ohne osm2pgsql ist das nicht zu erklären, denke ich…

OSM hat leider kein Modell für Flächen, aus den Daten erkennt man es einfach nicht. Es gibt “übliche Interpretationen”, dass z.B. ein building=* eine Fläche ist und highway=* keine, aber “üblich” ist eben nicht sehr genau.

Im wesentlichen orientieren sich die Leute beim Mappen und beim Auswerten halt an dem, was die üblichen Karten als gefüllte Fläche vorfinden. Das wiederum wird im wesentlichen dadurch beeinflusst, was osm2pgsql aus einem geschlossenen Weg macht. osm2pgsql lässt sich in jeden Fall von area=yes/no zu einer Interpretation überreden. Deshalb ist area=* ein recht sicheres Unterscheidungsmerkmal. Es wird aber häufig bei Dingen weggelassen, die “selbstverständlich” Flächen oder Ringe sind. Wo wir wieder bei der “üblichen Interpretation” wären :wink:

Grüße
Max

PS: Mein Lieblingsbeispiel ist leisure=track (üblicherweise Fläche, weil leisure=) im Gegensatz zu highway=raceway (üblicherweise Linie, weil highway=). Der Unterschied zwischen einer Motorrennbahn und einer Fussrennbahn ist ohne Wissen wie osm2pgsql funktioniert nicht zu ergründen.

In osm-carto? Ich denke, dazu braucht es noch ein weiteres Tag, das das barrier=* überstimmt (natural=, area= …). Hast ein Beispiel?

Nachtrag: Natürlich kann man osm2pgsql konfigurieren und jeder Kartenhersteller kann selbst entscheiden, ob er ein Gebilde als Fläche oder als Linie in der Datenbank hat. Und selbst bei den Flächen kann er frei entscheiden, ob der den Umriss oder die Füllung malen möchte. Es ist also nicht so, dass hier ein Programm das entscheidet.

Das ist dann aber kein KISS mehr. :stuck_out_tongue:
Früher gab es mal fenced=yes (umzäunt), wurde leider abgeschafft.

Ich hab mal ein solches alleinstehendes Wohngrundstück barrier=hedge + landuse=residential getaggt. Das wurde eine komplette Heckenfläche, keine heckenumrahmte Wohnfläche. Mit barrier=fence wäre es eine zaunumrahmte Wohnfläche geworden. Insofern verhalten (verhielten?) sich fence und hedge unterschiedlich, was die Flächendarstellung anging, zumindest in Verbindung mit einem landuse.

–ks

Ach so, ich bin einfach nur dumm. Na dann. Gut N8, bevor ich auch noch aggressiv werde.

–ks

Siehe:

Das ist immer noch so Das Ding ist eine Fläche (wegen landuse=*), allerdings werden Flächen mit barrier=(alles ausser Hecke) mit dickerem Strich umrahmt, Hecken füllen die Fläche aus, weil man bei flächigen Hecken wohl eher an breite Buschstreifen gedacht hat als an umrahmte Siedlungen.

Ok, ich habe gerade nachgeguckt: osm2pgsql prüft nur ob die letzte + erste ID übereinstimmen (https://github.com/openstreetmap/osm2pgsql/blob/master/contrib/libosmium/osmium/osm/node_ref_list.hpp#L164). Alles andere wird dem Renderer überlassen.

Ok, dann ist die Sache schon mal einfacher, vielen Dank.

Nee, nicht ganz: Wenn der erste und letzte Knoten der gleiche ist, könnte der Strich eine Fläche sein. In diesem Fall wird area=* ausgewertet und wenn da nichts steht, wird in der Konfiguration nachgesehn, ob hinter dem Schlüssel ein “linear” oder ein “polygon” steht. Bei Widersprüchen aus mehreren Schlüsseln gewinnt … äh… irgendwer, das steht aber auch irgendwo :wink:

Das sehe ich gar nicht so. Die einfachste und klarste Lösung ist, für jedes reale Objekt ein osm-Element zu vewenden. Ein Grundstücksfläche und ein Zaun sind zwei unterschiedliche Objekte mit spezifischen Eigenschaften z.B. die Höhe für einen Zaun oder der landuse-Typ für eine Fläche. Die Grundstücksfläche existiert, ob nun der Zaun vorhanden ist oder vielleicht abgebaut wird. Ebenso existiert ein Zaun unabhängig von einer Grundstücksfläche.

Nicht umsonst gibt die Good practice-Regel “One feature, one OSM element”.

Ich würde die Fläche auch nicht in eine Relation mit dem Zaun als outer packen, sondern als eigenständigen way mappen. Sonst schaffe ich wieder Abhängigkeiten, die eigentlich nicht existieren. Man könnte den Zaun nicht nicht entfernen, ohne die Fläche anfassen zu müssen.