if(!d3.geo2square) d3.geo2square = function(coordinates, width, height) { var centroid =d3.polygonCentroid(coordinates) width = (width) ? width : 0 ; height = (height) ? height : 0 ; var p = [] var i = 0 var length = coordinates.length var qtr = ~~(length/4) var nScale = d3.scaleLinear().domain([0, qtr]).range([0, width]) var sScale = d3.scaleLinear().domain([0, qtr]).range([width, 0]) var wScale = d3.scaleLinear().domain([0, qtr]).range([0, height]) var eScale = d3.scaleLinear().domain([0, qtr]).range([height, 0]) while (i < length) { if (i <= qtr){ p.push([ centroid[0]+nScale(i), centroid[1] ]) } else if (i <= qtr*2){ p.push([ centroid[0]+width, centroid[1] + wScale(i-qtr) ]) } else if (i <= qtr*3){ p.push([ centroid[0]+sScale(i-qtr*2), centroid[1]+height ]) } else if (i <= qtr*4){ p.push([ centroid[0], centroid[1]+eScale(i-qtr*3) ]) } i++ } return p };