Skip to main content
2 of 3
added 1174 characters in body
SGhaleb
  • 151
  • 5

So to create simple polygons from a complex polygon (self-intersecting), is to use turf.unkink() for Javascript turf.js. The area can also be found using the polygon area equation.

Example code below.

Firstly, join the end point of the first curve with end of second curve, then join the start point of the second curve with start point of the first point.

Like the following:

function zip(arrays) {
  return arrays[0].map((_,i) => {
    return arrays.map((array) => {return array[i]})
  });
}

var xy_1 = zip([x1,y1]);
var xy_2 = zip([x2,y2]);

var newPolygon = [] //creates a empty list where we will append the points to create the polygon

for(var i = 0; i < xy_1.length; i++) 
  newPolygon.push([xy_1[i][0],xy_1[i][1]]) //append all xy points for curve 1

for(var i = xy_2.length - 1; i >= 0; i--)
  newPolygon.push([xy_2[i][0],xy_2[i][1]]) //append all xy points for curve 2 in the reverse order (from last point to first point)

console.log(newPolygon)

Then using the unkink() function from turf.js you can simplify the self-intersecting polygon into simple polygons and then find area.

NOTE: The area is calculated in Cartesian form, as turf.area gives different area.

const line_non_simple = turf.polygon([some_intersecting_polygon_coords])

var result = turf.unkinkPolygon(line_non_simple);

var A_modelArea = []

function findModelArea(multiCoords){
  //Split multicoords to x, y 
  var xNew = []
  var yNew = []
  for(var i = 0; i < multiCoords.length; i++ ){
    xNew.push(multiCoords[i][0]);
    yNew.push(multiCoords[i][1])
  }
  //Finds the area using the x, y
  var avg_sum = []
  for(var i = 0; i < multiCoords.length -1; i++ ){
    avg_sum.push(xNew[i]*yNew[i+1]-xNew[i+1]*yNew[i])
  }
  var avg_area = Math.abs(0.5*(avg_sum.reduce((a, b) => a + b)))

  A_modelArea.push(avg_area);
}

result.features.map(i => findModelArea(i.geometry.coordinates[0]))

console.log(A_modelArea.reduce((a, b) => a + b))
SGhaleb
  • 151
  • 5