Finding self-intersections in Leaflet drawn polygons using JSTS library

by Rajkishan Rajappan

HTML

<script src="https://api.mapbox.com/mapbox.js/v2.4.0/mapbox.js"></script>
<link rel="stylesheet" href="https://api.mapbox.com/mapbox.js/v2.4.0/mapbox.css">
<script src="https://api.mapbox.com/mapbox.js/plugins/leaflet-draw/v0.2.3/leaflet.draw.js"></script>
<link rel="stylesheet" href="https://api.mapbox.com/mapbox.js/plugins/leaflet-draw/v0.2.3/leaflet.draw.css">
<script src="https://cdn.rawgit.com/bjornharrtell/jsts/gh-pages/1.4.0/jsts.min.js"></script>
<div id="map"></div>

CSS

/* Map */
 #map {
    height: 500px;
}
input {
  margin-top:10px;
}

JavaScript

L.mapbox.accessToken = 'pk.eyJ1IjoicnJhamFwcGFuIiwiYSI6ImNpb2Jta3prcDA0NGp2emx6M21jbWJkam4ifQ.w2R3ZlYBiKBezxUduz7vTg';
var map = L.mapbox.map('map', 'mapbox.streets')
    .setView([40, -74.50], 9);
        
var featureGroup = L.featureGroup().addTo(map);
        
var drawControl = new L.Control.Draw({
    edit: {
        featureGroup: featureGroup
    },
    draw: {
        polygon: {
            allowIntersection: false
        },
        polyline: false,
        rectangle: false,
        circle: false,
        marker: false
    }
}).addTo(map);
            
var polygonedit = false;

map.on('draw:created', getCoordinates);
map.on('draw:edited', changeCoordinates);
function changeCoordinates(e) {
		featureGroup.eachLayer(function (layer) {
			polygonedit = true;
			getCoordinates({ layer: layer });
		});
}
function getCoordinates(e) {
		if(polygonedit == false) {
    		featureGroup.addLayer(e.layer);
		}
		else {
				var layer = e.layer;
				var corners = layer.getLatLngs();
				var intersects = findSelfIntersects(corners);
				if (intersects && intersects.length) {
					alert('Polygon intersects itself');
					//for (var toolbarId in drawControl._toolbars) {
					//    if (drawControl._toolbars.hasOwnProperty(toolbarId) && drawControl._toolbars[toolbarId] instanceof L.EditToolbar) {
					//        drawControl._toolbars[toolbarId].disable();
					//    }
					//}
				} else {
					featureGroup.addLayer(layer);
				}
		}
}

/**
* corners2JTS
*
* Convert the given polygon to JTS Coordinate objects as required by JTS.
*
* @param {array} Corners of the given polygon.
* @return {array} boundaries in JTS friendly format.
*/
var corners2JTS = function (corners) {
	var coordinates = [];
	for (var i = 0; i < corners.length; i++) {
		coordinates.push(new jsts.geom.Coordinate(
			corners[i].lat, corners[i].lng));
	}
	return coordinates;
};

/**
* findSelfIntersects
*
* Detect self-intersections in a polygon.
*
* @param {array} Corners of the given polygon.
* @return {array}...