OpenStreetMap

Mittelpunkte von Flächen und Multipolygonen

Posted by ubahnverleih on 7 August 2013 in German (Deutsch)

Wenn man nicht nur Nodes auf einer Karte auswerten und darstellen will, muss man sich irgendwann überlegen wie man den Mittelpunkt von Flächen erhält um da ein Icon oder eine Stecknadel zu platzieren. Für die Unterkunftskarte habe ich mir das schon ziemlich zeitig überlegen müssen und bin jetzt noch einmal drauf gestoßen, weil ich nun auch Multipolygone auswerte. Ich habe mich damals für eine Ziemlich einfache Lösung entschieden. (schon allein weil die Positionierung von Icons nicht das war worauf ich bei einer Unterkunftskarte viel Energie verschwenden wollte.)

Ich nehme mir einfach alle Nodes der Fläche daher und suche mir dann jeweils die extremsten Punkte in jede Himmelsrichtung heraus und nehme dann jeweils den Durchschnitt der nördlichsten und südlichsten Punkte für die Latitude und für die Longitude den Durchschnitt aus östlichstem und westlichstem Punkt. (Ist im Bild vielleicht besser zu erkennen was ich meine.)

Der Nachteil an der ganzen Geschichte ist, dass es Flächen gibt in denen das wie in der rechten Skizze nicht funktioniert. Als Beispiel könnte das ein Zeltplatz, der sich um einen See zieht sein. Der Marker würde dann mitten im See liegen. In der Praxis habe ich aber kein Beispiel gefunden wo es wirklich passiert ist.

einfacher Mittelpunkt von Flächen

Lösen ließe sich das Problem in dem man den Geometrischen Schwerpunkt der Fläche errechnet. Die Formel für Polygone sieht gar nicht so kompliziert aus und ich bin am Überlegen das mal auszuprobieren. Update: Bekam gerade eine Mail, die sagte, dass der Geometrische Schwerpunkt das Problem doch nicht unbedingt löst.

Mittelpunkt von Polygonen

Bei Multipolygonen wird das ganze ein wenig komplizierter und ich bin mir nicht sicher ob es da überhaupt eine Perfekte Lösung gibt. Bei Multipolygonen mit inneren Flächen sehe ich weniger ein Problem, auch wenn der Mittelpunkt auf der ausgestanzten Fläche liegt (mittlere Skizze). Das kommt häufig bei Häusern mit Innenhof vor - und hier gehört der Innenhof ja irgendwie mit zum Gebäude. Klar wenn man einen Renderer baut, der dann auch Namen in Wälder mit Löchern schreiben soll, muss man sich hier auch ein paar mehr Gedanken machen.

Richtig problematisch wird es aber wenn ein Polygon aus mehreren Flächen besteht die einigen Abstand voneinander haben. Hier kann es Passieren, dass der Marker dann einfach zwischen die Flächen gesetzt wird. Ist auch nicht wirklich schlimm - kann aber möglicherweise verwirren. Die Renderer scheinen hier das Symbol einfach in alle Flächen zu malen, was ich bei dynamischen Markern weniger passend finde. Vielleicht sollte ich hier überlegen einfach den Mittelpunkt der größten Fläche für die Stecknadel zu wählen.

Weitere Ansätze dazu würden mich auch interessieren - das ist ja auf keinen fall ein neues Problem. - Wie macht das eigentlich osmfilter --alltonodes?

Comment from jutezak on 10 August 2013 at 08:46

It depends a bit on what you need the icon for. Geometric might be fine if you do not want to show a lake at all but just represent it somewhere for mathematical purposes.

But if the goal is to show an icon on top of the polygon the first method can be extended. Use it to determine the position A. If A is not in the polygon, or too close to the polygon edge, divide the bounding block in 4, and find out which of the 4 has the most polygon arean in it. The midpoint of the winner is point B. As the icon position, then try the point between A and B.

For multipolygons it may also be worthwhile to determine the largest first and only process that. But for an archipelago it is probably best to start with geometric middle. Maybe a rule that uses the middle of a 'main' subpolygon if it exists (for example, use the largest polygon if it is larger than (total area)/sqrt(number of subpolygons).

The search for a perfect solution will be determined by the exact question asked, as a multipolygon will never be perfectly reflected in a single pin.

Hide this comment

Comment from Karl Ove Hufthammer on 10 August 2013 at 09:48

You might be interested in the (algorithms implemented in) the ‘polygonsLabel’ function in the rgeos package in R. See the referance manual for more information.

Hide this comment

Leave a comment

Parsed with Markdown

  • Headings

    # Heading
    ## Subheading

  • Unordered list

    * First item
    * Second item

  • Ordered list

    1. First item
    2. Second item

  • Link

    [Text](URL)
  • Image

    ![Alt text](URL)

Login to leave a comment