Skip to content

Instantly share code, notes, and snippets.

@alexsanqp
Last active April 24, 2019 17:33
Show Gist options
  • Save alexsanqp/e757631b443b25e77b85695a5a5c2e31 to your computer and use it in GitHub Desktop.
Save alexsanqp/e757631b443b25e77b85695a5a5c2e31 to your computer and use it in GitHub Desktop.
Polygon centroid - typescript or javascript
/**
* https://en.wikipedia.org/wiki/Centroid#Of_a_polygon
*/
public getPolygonCentroid(vertices: number[][]): { lat: number, lon: number } {
const centroid: { lat: number, lon: number } = { lat: 0, lon: 0 };
const vertexCount: number = vertices.length;
let area: number = 0;
let x0: number = 0; // Current vertex X
let y0: number = 0; // Current vertex Y
let x1: number = 0; // Next vertex X
let y1: number = 0; // Next vertex Y
let a: number = 0; // Partial signed area
let i: number = 0; // Counter
for (; i < vertexCount - 1; ++i) {
x0 = vertices[i][0];
y0 = vertices[i][1];
x1 = vertices[i + 1][0];
y1 = vertices[i + 1][1];
a = x0 * y1 - x1 * y0;
area += a;
centroid.lon += (x0 + x1) * a;
centroid.lat += (y0 + y1) * a;
}
// Do last vertex separately to avoid performing an expensive
// modulus operation in each iteration.
x0 = vertices[i][0];
y0 = vertices[i][1];
x1 = vertices[0][0];
y1 = vertices[0][1];
a = x0 * y1 - x1 * y0;
area += a;
centroid.lon += (x0 + x1) * a;
centroid.lat += (y0 + y1) * a;
area *= 0.5;
centroid.lon /= (6 * area);
centroid.lat /= (6 * area);
return centroid;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment