-
Notifications
You must be signed in to change notification settings - Fork 449
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Improve MultiPolygon centroid robustness (#118)
* Improve MultiPolygon centroid robustness Do this by allowing each polygon shell to set its own origin point, instead of re-using the origin point from the first polygon in the geometry. Signed-off-by: Daniel Baston <[email protected]> * Refactor test case Signed-off-by: Daniel Baston <[email protected]> * Rename method for clarity * Fix formatting of tolerance constant
- Loading branch information
Showing
3 changed files
with
77 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
modules/core/src/test/java/org/locationtech/jts/algorithm/CentroidTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package org.locationtech.jts.algorithm; | ||
|
||
import junit.framework.TestCase; | ||
import org.locationtech.jts.geom.Coordinate; | ||
import org.locationtech.jts.geom.Geometry; | ||
import org.locationtech.jts.io.WKTReader; | ||
|
||
public class CentroidTest extends TestCase { | ||
|
||
private static final double TOLERANCE = 1e-10; | ||
|
||
public CentroidTest(String name) { | ||
super(name); | ||
} | ||
|
||
/** Compute the centroid of a geometry as an area-weighted average of the centroids | ||
* of its components. | ||
* | ||
* @param g a polygonal geometry | ||
* @return Coordinate of the geometry's centroid | ||
*/ | ||
private static Coordinate areaWeightedCentroid(Geometry g) { | ||
double totalArea = g.getArea(); | ||
double cx = 0; | ||
double cy = 0; | ||
|
||
for(int i = 0; i < g.getNumGeometries(); i++) { | ||
Geometry component = g.getGeometryN(i); | ||
double areaFraction = component.getArea() / totalArea; | ||
|
||
Coordinate componentCentroid = component.getCentroid().getCoordinate(); | ||
|
||
cx += areaFraction * componentCentroid.x; | ||
cy += areaFraction * componentCentroid.y; | ||
} | ||
|
||
return new Coordinate(cx, cy); | ||
} | ||
|
||
public void testCentroidMultiPolygon() throws Exception { | ||
// Verify that the computed centroid of a MultiPolygon is equivalent to the | ||
// area-weighted average of its components. | ||
Geometry g = new WKTReader().read( | ||
"MULTIPOLYGON ((( -92.661322 36.58994900000003, -92.66132199999993 36.58994900000005, -92.66132199999993 36.589949000000004, -92.661322 36.589949, -92.661322 36.58994900000003)), (( -92.65560500000008 36.58708800000005, -92.65560499999992 36.58708800000005, -92.65560499998745 36.587087999992576, -92.655605 36.587088, -92.65560500000008 36.58708800000005 )), (( -92.65512450000065 36.586800000000466, -92.65512449999994 36.58680000000004, -92.65512449998666 36.5867999999905, -92.65512450000065 36.586800000000466 )))" | ||
); | ||
|
||
assertTrue(areaWeightedCentroid(g).equals2D(g.getCentroid().getCoordinate(), TOLERANCE)); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters