Wie genau wird der Schwerpunkt der Polygone berechnet?

10

Ich würde gerne wissen, wie genau QGIS Geometry Tools -> Polygonschwerpunkt die Punktkoordinaten berechnet. Teilt es beispielsweise die Grenze des Polygons in kleine Punkte, nimmt zwei Paare von zwei Punkten (Länge und Breite) mit maximalem Abstand und nimmt die Kreuzung dieser beiden Linien als Schwerpunkt?

Hausladen Carina
quelle

Antworten:

13

Wenn QGIS den Schwerpunkt mit GEOS berechnet, einem JTS-Port, lautet der Algorithmus http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/algorithm/CentroidArea.html . Über die Theorie gibt es im Javadoc einen Link zu http://www.faqs.org/faqs/graphics/algorithms-faq/ , siehe Abschnitt 2.02: Wie kann der Schwerpunkt eines Polygons berechnet werden?.

Der Schwerpunkt (auch als Schwerpunkt oder Schwerpunkt bezeichnet) eines Polygons kann als gewichtete Summe der Schwerpunkte einer Aufteilung des Polygons in Dreiecke berechnet werden. Der Schwerpunkt eines Dreiecks ist einfach der Durchschnitt seiner drei Eckpunkte, dh er hat die Koordinaten (x1 + x2 + x3) / 3 und (y1 + y2 + y3) / 3. Dies schlägt vor, zuerst das Polygon zu triangulieren und dann eine Summe der Schwerpunkte jedes Dreiecks zu bilden, gewichtet mit der Fläche jedes Dreiecks, wobei die gesamte Summe durch die gesamte Polygonfläche normalisiert wird. Dies funktioniert zwar, aber es gibt eine einfachere Methode: Die Triangulation muss keine Partition sein, sondern kann positiv und negativ ausgerichtete Dreiecke (mit positiven und negativen Flächen) verwenden, wie sie bei der Berechnung der Fläche eines Polygons verwendet werden. Dies führt zu einem sehr einfachen Algorithmus zur Berechnung des Schwerpunkts, der auf einer Summe von Dreiecksschwerpunkten basiert, die mit ihrer vorzeichenbehafteten Fläche gewichtet sind. Die Dreiecke können als solche angesehen werden, die durch einen beliebigen festen Punkt gebildet werden, z. B. den Scheitelpunkt v0 des Polygons und die beiden Endpunkte aufeinanderfolgender Kanten des Polygons: (v1, v2), (v2, v3) usw. Die Fläche eines Dreiecks mit Eckpunkten a, b, c ist die Hälfte dieses Ausdrucks: (b [X] - a [X]) * (c [Y] - a [Y]) - (c [X] - a [X] ) * (b [Y] - a [Y]);

Code available at ftp://cs.smith.edu/pub/code/centroid.c (3K).
Reference: [Gems IV] pp.3-6; also includes code.

Es scheint mir, dass die Methode korrekt ist. Wenn Sie überprüfen möchten, wie die Koordinatenwerte verwendet werden und ob Rundungsfehler usw. auftreten können, können Sie sich den Quellcode von JTS oder GEOS ansehen.

user30184
quelle
1
Nur noch ein paar Links: gdal.org/python/osgeo.ogr.Geometry-class.html#Centroid stellt fest, dass GDAL die unter geos.osgeo.org/doxygen/classgeos_1_1algorithm_1_1Centroid.html beschriebene GEOS-Methode verwendet . QGIS verwendet die GDAL-Funktionalität im Hintergrund.
AndreJ
2
Die Methode ist nur für sehr kleine Polygone genau. Bei großen stößt man auf das Problem, dass der Globus nicht flach ist.
Peter Taylor