sybind
sybind

Reputation: 3588

calculate the area of a polygon in ruby

I have an array of latitude/longitude coordinate pairs that represent a polygon. I'm trying to determine the total area within that polygon. How would I go about doing that in Ruby?

Here's an example array of the polygon:

[[37.7663613767094, -122.452969210084], [37.7674219449606, -122.444718340349], [37.7701838510542, -122.445330289514], [37.7709974013834, -122.439159589248], [37.7700761930893, -122.438861402472], [37.7703501163684, -122.436868738421], [37.7712650571321, -122.437078116573], [37.7736056746515, -122.437533130227], [37.7714671036087, -122.453964210266], [37.7663613767094, -122.452969210084]]

Upvotes: 2

Views: 2929

Answers (5)

user836725
user836725

Reputation: 49

language independent solution:

GIVEN: a polygon can ALWAYS be composed by n-2 triangles that do not overlap (n = number of points OR sides). 1 triangle = 3 sided polygon = 1 triangle; 1 square = 4 sided polygon = 2 triangles; etc ad nauseam QED

therefore, a polygon can be reduced by "chopping off" triangles and the total area will be the sum of the areas of these triangles. try it with a piece of paper and scissors, it is best if you can visualize the process before following.

if you take any 3 consecutive points in a polygons path and create a triangle with these points, you will have one and only one of three possible scenarios:

  1. resulting triangle is completely inside original polygon
  2. resulting triangle is totally outside original polygon
  3. resulting triangle is partially contained in original polygon

we are interested only in cases that fall in the first option (totally contained).

every time we find one of these, we chop it off, calculate its area (easy peasy, wont explain formula here) and make a new polygon with one less side (equivalent to polygon with this triangle chopped off). until we have only one triangle left.

how to implement this programatically:

create an array of points. run the array making triangles from points x, x+1 and x+2. transform each triangle from a shape to an area and intersect it with area created from polygon. IF the resulting intersection is identical to the original triangle, then said triangle is totally contained in polygon and can be chopped off. remove x+1 from the array and start again from x=0. otherwise, move to next point x+1 in array.

additionally if you are looking to integrate with mappping and are starting from geopoints, you must convert from geopoints to screenpoints. this requires deciding a modelling and formula for earths shape (though we tend to think of the earth as a sphere, it is actually an irregular ovoid (eggshape), with dents. there are many models out there, for further info wiki.

Upvotes: 3

TheSteve0
TheSteve0

Reputation: 3526

You can use this library which wraps GEOS (a C geospatial library itself a port of the JTS). https://github.com/dark-panda/ffi-geos

This library can handle the calculations in coordinate space and takes care of the approximations.

Depending on how much accuracy you need I would project the data first to an appropriate projection (not Mercator). Then calculate your area

Upvotes: 2

Mahesh Velaga
Mahesh Velaga

Reputation: 21971

It probably doesn't matter that much on the language. You can make use of the formula mentioned in here for calculating the area of a polygon:

http://mathworld.wolfram.com/PolygonArea.html

Assuming your points are (x1, y1) (x2, y2) .. (xn, yn) and they enclose a small area:

Area = 0.5 * (x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 ..... + xn * y1 - x1 * yn)

Note: This won't work for larger areas, for which you need to use more complex method to calculate the area, which involves angular co-ordinates. But, this does the job for small areas, which can be assumed to be planar.

Edit:

To get area in sq miles, you can do the following, from there, convert to whatever units you want.

areaInSqMiles = Area * (60 * 60 * 1.15 * 1.15)

Upvotes: 3

SRM
SRM

Reputation: 1377

Some techniques for this include integration (divide the polygon into latitudinal strips and integrate. You can also project onto a flat surface and calculate that area.

Upvotes: 0

user608669
user608669

Reputation: 1

There is an awesome example on how to multiply verticies. Essentially exactly what you would like to do!!

http://www.wikihow.com/Calculate-the-Area-of-a-Polygon

Upvotes: 0

Related Questions