Calculating area on a globe

Hi,

Does Cesium have a method to calculate the area of a polygon or shape on the surface of the earth? I know how to do it on a 2D plane, but what about 3D? When a user places a shape on the map (either using polyline or polygon), I want to be able to show the perimeter and area of each shape.

Thanks for your help!
Lydia

Lydia,

Cesium doesn’t have a function to do this, but the Polygon used for visualization divides the polygon in small triangles that approximate the curvature of Earth (based on the granularity input). You could sum up the area of all the triangles.

See createGeometryFromPositions in PolygonGeometry.js.

Patrick

Thanks, Patrick. I will look into this solution.

Do you know if Cesium will be implementing any type of area calculation in the near future? I am also looking to calculate the area of rectangles, squares, circles, etc. on the surface of the earth.

Thanks,
Lydia

Lydia - we don’t have plans to do this soon. However, the method I suggested will work for all regions on the globe.

Patrick

Hey All,

I just worked on this myself and used the following. (It’s rough, but gives a pretty good approximation.)

// Get the polygon from your “entity”
var polygon = theEntity.polygon;

var hierarchy = polygon.hierarchy._value;

// “indices” here defines an array, elements of which defines the indice of a vector

// defining one corner of a triangle. Add up the areas of those triangles to get
// an approximate area for the polygon

var indices = Cesium.PolygonPipeline.triangulate(hierarchy.positions, hierarchy.holes);

var area = 0; // In square kilometers

for (var i = 0; i < indices.length; i += 3) {

var vector1 = hierarchy.positions[indices[i]];

var vector2 = hierarchy.positions[indices[i+1]];

var vector3 = hierarchy.positions[indices[i+2]];

// These vectors define the sides of a parallelogram (double the size of the triangle)

var vectorC = Cesium.Cartesian3.subtract(vector2, vector1, new Cesium.Cartesian3());

var vectorD = Cesium.Cartesian3.subtract(vector3, vector1, new Cesium.Cartesian3());

// Area of parallelogram is the cross product of the vectors defining its sides

var areaVector = Cesium.Cartesian3.cross(vectorC, vectorD, new Cesium.Cartesian3());

// Area of the triangle is just half the area of the parallelogram, add it to the sum.

area += Cesium.Cartesian3.magnitude(areaVector)/2.0;

}

``

Hope that helps.

  • Dave