Calculating area on a globe

1,112 views
Skip to first unread message

lydi...@visionistinc.com

unread,
Dec 19, 2013, 4:05:11 PM12/19/13
to cesiu...@googlegroups.com
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

Patrick Cozzi

unread,
Dec 20, 2013, 11:19:00 AM12/20/13
to cesiu...@googlegroups.com, lydi...@visionistinc.com
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

lydi...@visionistinc.com

unread,
Jan 7, 2014, 12:40:48 PM1/7/14
to cesiu...@googlegroups.com, lydi...@visionistinc.com
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

Patrick Cozzi

unread,
Jan 7, 2014, 1:10:32 PM1/7/14
to cesiu...@googlegroups.com, Lydia Lei
Lydia - we don't have plans to do this soon.  However, the method I suggested will work for all regions on the globe.

Patrick



--
You received this message because you are subscribed to a topic in the Google Groups "cesium-dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/cesium-dev/EimmL-poCDI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to cesium-dev+...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.



--

David Whipps

unread,
Sep 7, 2016, 10:11:38 AM9/7/16
to cesium-dev, lydi...@visionistinc.com
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
Reply all
Reply to author
Forward
0 new messages