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));
}
coordinates.push(new jsts.geom.Coordinate(
corners[0].lat, corners[0].lng));
return coordinates;
};
/**
* findSelfIntersects
*
* Detect self-intersections in a...