I was expecting to be able to test for self intersecting polygons either by JSTS failing to construct them or by adding a buffer and testing whether they were MultiPolygons after buffering but for a certain shape this isn't working and that's well past my geometry ability to grok
//a self-intersecting shape
var poly = [[0, 3], [1, 5], [3, 1], [5, 5], [6, 3], [0, 3]];
var geomFactory = new jsts.geom.GeometryFactory();
var jstsCoordinates = poly.map(function(pt) {
return new jsts.geom.Coordinate(pt[0], pt[1]);
});
var linearRing = geomFactory.createLinearRing(jstsCoordinates);
var jstsPolygon = geomFactory.createPolygon(linearRing).buffer(1);
console.log(jstsPolygon.getGeometryType()); //this will be polygon but I thought should be MultiPolygon
var bufferedPoly = (jstsPolygon.shell.points.coordinates.map(function(pr) {
return [pr.x, pr.y]
}))
var svg = d3.select('svg');
//add the first shape (maginified for display)
svg.selectAll('.original').data([poly]).enter().append("polygon")
.attr("points",function(d) {
return d.map(function(d) {
return [d[0] * 10 + 10, d[1]*10].join(",");
}).join(" ");
})
.attr("fill", "yellow");
//add the buffered shape below it
svg.selectAll('.buffered').data([bufferedPoly]).enter().append("polygon")
.attr("points",function(d) {
return d.map(function(d) {
return [d[0] * 10 + 10, d[1]*10 + 40].join(",");
}).join(" ");
})
.attr("fill", "yellow");
svg {background-color:blue}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://cdn.rawgit.com/bjornharrtell/jsts/gh-pages/1.0.2/jsts.min.js"></script>
<svg width=200 height=200>
<svg>