Platzieren von Markierungen auf Karten
Um Informationen auf Karten zu visualisieren, wie z. B. die Fläche (in Quadratmetern), die ein bestimmtes Polygon bedeck, müssen Markierungen gesetzt werden. Eine der Herausforderungen ist es, innerhalb eines konkaven Polygons einen Mittelpunkt zu finden, der innerhalb der Geometrie bleibt.
Das Problem
Viele GeoJSON-Bibliotheken für die räumliche Analyse bieten vordefinierte Funktionen zur Berechnung des Mittelpunkts eines Polygons. Die Turf.js-Bibliothek bietet zum Beispiel Methoden wie center()
, centerOfMass()
und centroid()
, welche mit den meisten Polygonen funktioniert. Diese Methoden berechnen den Mittelpunkt durch Mittelung der Scheitelpunktkoordinaten unter Berücksichtigung der Flächenabmessungen des Polygons.
1center = turf.center(poly);
2centroid = turf.centroid(poly)
3centerOfMass = turf.centerOfMass(poly)
Diese Methoden haben jedoch oft Probleme mit Polygonen mit komplexen Strukturen, insbesondere mit konkaven. Das Ergebnis: Punkte, die außerhalb des Polygons liegen.
Tesselierung als Retter
Für solch komplexe Polygone ist die Tesselierung (in diesem Zusammenhang speziell die Triangulation) eine effektive Lösung. Dabei wird das Polygon in kleinere Dreiecke zerlegt, die die gesamte Polygonfläche abdecken. Die Turf.js-Bibliothek bietet eine Funktion namens tessellate()
, die dies erleichtert.
Mit dieser Strategie ist es nun möglich eine Markierung innerhalb der Polygongeometrie leichter zu finden. Dies ist der Mittelpunkt des größten Dreiecks, der mit centerOfMass()
berechnet wird.
1const tessellation = turf.tesselate(poly)
2const largestTriangle = tessellation.features.reduce((maxTriangle, currentTriangle) => {
3 return turf.area(currentTriangle) > turf.area(maxTriangle) ? currentTriangle : maxTriangle;});
4const centerLargestTriangle = turf.centerOfMass(largestTriangle)
Dank der Tesselierung ist die Bestimmung des Mittelpunktes eines konkaven Polygons zuverlässiger und es wird sichergestellten, dass dieser innerhalb der Geometrie bleibt. Diese Methode ist besonders nützlich für die Entwicklung von Geodaten visualisierenden Apps welche die Kartenvisualisierung durch Mapbox integrieren.