block by rveciana b3726a6aee562c8dce1a655d232a2265

spam.js error with d3-composite-projections

Full Screen

The following code gives

TypeError: ring[0] is undefined

when clicking on the prefactures.

The code is taken from this example

The error was solved using the

topojson.presimplify(d);

function. More information in this block, which is a new Topojson 1.3 function.

index.html

<!DOCTYPE html>
<meta charset="utf-8" />
<body>
<script src="d3.min.js"></script>
<script src="topojson.min.js"></script>
<script src="rbush.min.js"></script>
<script src="spam.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-composite-projections/0.3.5/conicEquidistantJapan.min.js"></script>
<script type='text/javascript'>
var hover = null


d3.json("empty.json", function(error, d) {
    
    topojson.presimplify(d);
    
    var map = new ZoomableCanvasMap({
        element: "body",
        width: 960,
        height: 500,
        projection: d3.geo.conicEquidistantJapan(),
        data: [
            {
                features: topojson.feature(d, d.objects["japan"]),
                static: {
                    paintfeature: function(parameters, d) {
                        parameters.context.lineWidth = 1 / parameters.scale
                        parameters.context.stroke()
                    }
                },
                dynamic: {
                    postpaint: function(parameters) {
                        if (!hover)
                            return

                        parameters.context.beginPath()
                        parameters.context.lineWidth = 2 / parameters.scale
                        parameters.context.fillStyle = "rgb(241, 205, 151)"
                        parameters.path(hover)
                        parameters.context.stroke()
                        parameters.context.fill()
                    }
                },
                events: {
                    hover: function(parameters, d) {
                        hover = d

                        parameters.map.paint()
                    },
                    click: function(parameters, d) {
                        parameters.map.zoom(d)
                    }
                }
            }
        ]
    })
    map.init()
})
</script>

rbush.min.js

(function(){"use strict";function rbush(maxEntries,format){if(!(this instanceof rbush))return new rbush(maxEntries,format);this._maxEntries=Math.max(4,maxEntries||9);this._minEntries=Math.max(2,Math.ceil(this._maxEntries*.4));if(format){this._initFormat(format)}this.clear()}rbush.prototype={all:function(){return this._all(this.data,[])},search:function(bbox){var node=this.data,result=[],toBBox=this.toBBox;if(!intersects(bbox,node.bbox))return result;var nodesToSearch=[],i,len,child,childBBox;while(node){for(i=0,len=node.children.length;i<len;i++){child=node.children[i];childBBox=node.leaf?toBBox(child):child.bbox;if(intersects(bbox,childBBox)){if(node.leaf)result.push(child);else if(contains(bbox,childBBox))this._all(child,result);else nodesToSearch.push(child)}}node=nodesToSearch.pop()}return result},collides:function(bbox){var node=this.data,toBBox=this.toBBox;if(!intersects(bbox,node.bbox))return false;var nodesToSearch=[],i,len,child,childBBox;while(node){for(i=0,len=node.children.length;i<len;i++){child=node.children[i];childBBox=node.leaf?toBBox(child):child.bbox;if(intersects(bbox,childBBox)){if(node.leaf||contains(bbox,childBBox))return true;nodesToSearch.push(child)}}node=nodesToSearch.pop()}return false},load:function(data){if(!(data&&data.length))return this;if(data.length<this._minEntries){for(var i=0,len=data.length;i<len;i++){this.insert(data[i])}return this}var node=this._build(data.slice(),0,data.length-1,0);if(!this.data.children.length){this.data=node}else if(this.data.height===node.height){this._splitRoot(this.data,node)}else{if(this.data.height<node.height){var tmpNode=this.data;this.data=node;node=tmpNode}this._insert(node,this.data.height-node.height-1,true)}return this},insert:function(item){if(item)this._insert(item,this.data.height-1);return this},clear:function(){this.data={children:[],height:1,bbox:empty(),leaf:true};return this},remove:function(item){if(!item)return this;var node=this.data,bbox=this.toBBox(item),path=[],indexes=[],i,parent,index,goingUp;while(node||path.length){if(!node){node=path.pop();parent=path[path.length-1];i=indexes.pop();goingUp=true}if(node.leaf){index=node.children.indexOf(item);if(index!==-1){node.children.splice(index,1);path.push(node);this._condense(path);return this}}if(!goingUp&&!node.leaf&&contains(node.bbox,bbox)){path.push(node);indexes.push(i);i=0;parent=node;node=node.children[0]}else if(parent){i++;node=parent.children[i];goingUp=false}else node=null}return this},toBBox:function(item){return item},compareMinX:function(a,b){return a[0]-b[0]},compareMinY:function(a,b){return a[1]-b[1]},toJSON:function(){return this.data},fromJSON:function(data){this.data=data;return this},_all:function(node,result){var nodesToSearch=[];while(node){if(node.leaf)result.push.apply(result,node.children);else nodesToSearch.push.apply(nodesToSearch,node.children);node=nodesToSearch.pop()}return result},_build:function(items,left,right,height){var N=right-left+1,M=this._maxEntries,node;if(N<=M){node={children:items.slice(left,right+1),height:1,bbox:null,leaf:true};calcBBox(node,this.toBBox);return node}if(!height){height=Math.ceil(Math.log(N)/Math.log(M));M=Math.ceil(N/Math.pow(M,height-1))}node={children:[],height:height,bbox:null,leaf:false};var N2=Math.ceil(N/M),N1=N2*Math.ceil(Math.sqrt(M)),i,j,right2,right3;multiSelect(items,left,right,N1,this.compareMinX);for(i=left;i<=right;i+=N1){right2=Math.min(i+N1-1,right);multiSelect(items,i,right2,N2,this.compareMinY);for(j=i;j<=right2;j+=N2){right3=Math.min(j+N2-1,right2);node.children.push(this._build(items,j,right3,height-1))}}calcBBox(node,this.toBBox);return node},_chooseSubtree:function(bbox,node,level,path){var i,len,child,targetNode,area,enlargement,minArea,minEnlargement;while(true){path.push(node);if(node.leaf||path.length-1===level)break;minArea=minEnlargement=Infinity;for(i=0,len=node.children.length;i<len;i++){child=node.children[i];area=bboxArea(child.bbox);enlargement=enlargedArea(bbox,child.bbox)-area;if(enlargement<minEnlargement){minEnlargement=enlargement;minArea=area<minArea?area:minArea;targetNode=child}else if(enlargement===minEnlargement){if(area<minArea){minArea=area;targetNode=child}}}node=targetNode}return node},_insert:function(item,level,isNode){var toBBox=this.toBBox,bbox=isNode?item.bbox:toBBox(item),insertPath=[];var node=this._chooseSubtree(bbox,this.data,level,insertPath);node.children.push(item);extend(node.bbox,bbox);while(level>=0){if(insertPath[level].children.length>this._maxEntries){this._split(insertPath,level);level--}else break}this._adjustParentBBoxes(bbox,insertPath,level)},_split:function(insertPath,level){var node=insertPath[level],M=node.children.length,m=this._minEntries;this._chooseSplitAxis(node,m,M);var splitIndex=this._chooseSplitIndex(node,m,M);var newNode={children:node.children.splice(splitIndex,node.children.length-splitIndex),height:node.height,bbox:null,leaf:false};if(node.leaf)newNode.leaf=true;calcBBox(node,this.toBBox);calcBBox(newNode,this.toBBox);if(level)insertPath[level-1].children.push(newNode);else this._splitRoot(node,newNode)},_splitRoot:function(node,newNode){this.data={children:[node,newNode],height:node.height+1,bbox:null,leaf:false};calcBBox(this.data,this.toBBox)},_chooseSplitIndex:function(node,m,M){var i,bbox1,bbox2,overlap,area,minOverlap,minArea,index;minOverlap=minArea=Infinity;for(i=m;i<=M-m;i++){bbox1=distBBox(node,0,i,this.toBBox);bbox2=distBBox(node,i,M,this.toBBox);overlap=intersectionArea(bbox1,bbox2);area=bboxArea(bbox1)+bboxArea(bbox2);if(overlap<minOverlap){minOverlap=overlap;index=i;minArea=area<minArea?area:minArea}else if(overlap===minOverlap){if(area<minArea){minArea=area;index=i}}}return index},_chooseSplitAxis:function(node,m,M){var compareMinX=node.leaf?this.compareMinX:compareNodeMinX,compareMinY=node.leaf?this.compareMinY:compareNodeMinY,xMargin=this._allDistMargin(node,m,M,compareMinX),yMargin=this._allDistMargin(node,m,M,compareMinY);if(xMargin<yMargin)node.children.sort(compareMinX)},_allDistMargin:function(node,m,M,compare){node.children.sort(compare);var toBBox=this.toBBox,leftBBox=distBBox(node,0,m,toBBox),rightBBox=distBBox(node,M-m,M,toBBox),margin=bboxMargin(leftBBox)+bboxMargin(rightBBox),i,child;for(i=m;i<M-m;i++){child=node.children[i];extend(leftBBox,node.leaf?toBBox(child):child.bbox);margin+=bboxMargin(leftBBox)}for(i=M-m-1;i>=m;i--){child=node.children[i];extend(rightBBox,node.leaf?toBBox(child):child.bbox);margin+=bboxMargin(rightBBox)}return margin},_adjustParentBBoxes:function(bbox,path,level){for(var i=level;i>=0;i--){extend(path[i].bbox,bbox)}},_condense:function(path){for(var i=path.length-1,siblings;i>=0;i--){if(path[i].children.length===0){if(i>0){siblings=path[i-1].children;siblings.splice(siblings.indexOf(path[i]),1)}else this.clear()}else calcBBox(path[i],this.toBBox)}},_initFormat:function(format){var compareArr=["return a"," - b",";"];this.compareMinX=new Function("a","b",compareArr.join(format[0]));this.compareMinY=new Function("a","b",compareArr.join(format[1]));this.toBBox=new Function("a","return [a"+format.join(", a")+"];")}};function calcBBox(node,toBBox){node.bbox=distBBox(node,0,node.children.length,toBBox)}function distBBox(node,k,p,toBBox){var bbox=empty();for(var i=k,child;i<p;i++){child=node.children[i];extend(bbox,node.leaf?toBBox(child):child.bbox)}return bbox}function empty(){return[Infinity,Infinity,-Infinity,-Infinity]}function extend(a,b){a[0]=Math.min(a[0],b[0]);a[1]=Math.min(a[1],b[1]);a[2]=Math.max(a[2],b[2]);a[3]=Math.max(a[3],b[3]);return a}function compareNodeMinX(a,b){return a.bbox[0]-b.bbox[0]}function compareNodeMinY(a,b){return a.bbox[1]-b.bbox[1]}function bboxArea(a){return(a[2]-a[0])*(a[3]-a[1])}function bboxMargin(a){return a[2]-a[0]+(a[3]-a[1])}function enlargedArea(a,b){return(Math.max(b[2],a[2])-Math.min(b[0],a[0]))*(Math.max(b[3],a[3])-Math.min(b[1],a[1]))}function intersectionArea(a,b){var minX=Math.max(a[0],b[0]),minY=Math.max(a[1],b[1]),maxX=Math.min(a[2],b[2]),maxY=Math.min(a[3],b[3]);return Math.max(0,maxX-minX)*Math.max(0,maxY-minY)}function contains(a,b){return a[0]<=b[0]&&a[1]<=b[1]&&b[2]<=a[2]&&b[3]<=a[3]}function intersects(a,b){return b[0]<=a[2]&&b[1]<=a[3]&&b[2]>=a[0]&&b[3]>=a[1]}function multiSelect(arr,left,right,n,compare){var stack=[left,right],mid;while(stack.length){right=stack.pop();left=stack.pop();if(right-left<=n)continue;mid=left+Math.ceil((right-left)/n/2)*n;select(arr,left,right,mid,compare);stack.push(left,mid,mid,right)}}function select(arr,left,right,k,compare){var n,i,z,s,sd,newLeft,newRight,t,j;while(right>left){if(right-left>600){n=right-left+1;i=k-left+1;z=Math.log(n);s=.5*Math.exp(2*z/3);sd=.5*Math.sqrt(z*s*(n-s)/n)*(i-n/2<0?-1:1);newLeft=Math.max(left,Math.floor(k-i*s/n+sd));newRight=Math.min(right,Math.floor(k+(n-i)*s/n+sd));select(arr,newLeft,newRight,k,compare)}t=arr[k];i=left;j=right;swap(arr,left,k);if(compare(arr[right],t)>0)swap(arr,left,right);while(i<j){swap(arr,i,j);i++;j--;while(compare(arr[i],t)<0)i++;while(compare(arr[j],t)>0)j--}if(compare(arr[left],t)===0)swap(arr,left,j);else{j++;swap(arr,j,right)}if(j<=k)left=j+1;if(k<=j)right=j-1}}function swap(arr,i,j){var tmp=arr[i];arr[i]=arr[j];arr[j]=tmp}if(typeof define==="function"&&define.amd)define("rbush",function(){return rbush});else if(typeof module!=="undefined")module.exports=rbush;else if(typeof self!=="undefined")self.rbush=rbush;else window.rbush=rbush})();

spam.min.js

var StaticCanvasMap;var ZoomableCanvasMap;!function(){"use strict";function inside(pt,polygon){var polys=polygon.geometry.coordinates;if(polygon.geometry.type==="Polygon")polys=[polys];var insidePoly=false;var i=0;while(i<polys.length&&!insidePoly){if(inRing(pt,polys[i][0])){var inHole=false;var k=1;while(k<polys[i].length&&!inHole){if(inRing(pt,polys[i][k])){inHole=true}k++}if(!inHole)insidePoly=true}i++}return insidePoly}function inRing(pt,ring){var isInside=false;for(var i=0,j=ring.length-1;i<ring.length;j=i++){var xi=ring[i][0],yi=ring[i][1];var xj=ring[j][0],yj=ring[j][1];var intersect=yi>pt[1]!==yj>pt[1]&&pt[0]<(xj-xi)*(pt[1]-yi)/(yj-yi)+xi;if(intersect)isInside=!isInside}return isInside}function maxBounds(one,two){var bounds=two;if(one[0][0]<two[0][0])bounds[0][0]=one[0][0];if(one[0][1]<two[0][1])bounds[0][1]=one[0][1];if(one[1][0]>two[1][0])bounds[1][0]=one[1][0];if(one[1][1]>two[1][1])bounds[1][1]=one[1][1];return bounds}function createRTree(element,dataPath){element.lookupTree=rbush(4);var elements=[];for(var j in element.features.features){var bounds=dataPath.bounds(element.features.features[j]);elements.push([bounds[0][0].toFixed(0),bounds[0][1].toFixed(0),Math.ceil(bounds[1][0]),Math.ceil(bounds[1][1]),element.features.features[j]])}element.lookupTree.load(elements)}function paintFeature(element,feature,parameters){parameters.context.beginPath();parameters.path(feature);element.static.paintfeature(parameters,feature)}function paintBackgroundElement(element,parameters){if(!element.static)return;if(element.static.prepaint)element.static.prepaint(parameters);if(element.static.paintfeature){var lookup=element.lookupTree.search([parameters.translate[0],parameters.translate[1],parameters.width/parameters.scale-parameters.translate[0],parameters.height/parameters.scale-parameters.translate[1]]);for(var j in lookup){paintFeature(element,lookup[j][4],parameters)}}if(element.static.postpaint)element.static.postpaint(parameters)}function PartialPainter(data,parameters){var index=0,j=0,element=null,currentLookup=[];this.hasNext=function(){return index<=data.length&&j<currentLookup.length};this.renderNext=function(){if(index>=data.length&&j>=currentLookup.length)return;var start=performance.now();if(!element||j>=currentLookup.length){while(index<data.length&&!data[index].static){index++}if(index>=data.length)return;element=data[index];if(element.static.prepaint)element.static.prepaint(parameters);currentLookup=element.lookupTree.search([-parameters.translate[0],-parameters.translate[1],parameters.width/parameters.scale-parameters.translate[0],parameters.height/parameters.scale-parameters.translate[1]]);j=0;++index}if(element.static.paintfeature){for(;j!=currentLookup.length;++j){var feature=currentLookup[j][4];paintFeature(element,feature,parameters);if(performance.now()-start>10)break}}else{j=currentLookup.length}if(j==currentLookup.length&&element.static.postpaint){element.static.postpaint(parameters)}};this.finish=function(){if(index>=data.length&&j>=currentLookup.length)return;if(j<currentLookup.length)index--;for(;index!=data.length;++index){if(j>=currentLookup.length){while(!data[index].static&&index<data.length){index++}if(index>=data.length)return;element=data[index];if(element.static.prepaint)element.static.prepaint(parameters);currentLookup=element.lookupTree.search([-parameters.translate[0],-parameters.translate[1],parameters.width/parameters.scale-parameters.translate[0],parameters.height/parameters.scale-parameters.translate[1]]);j=0}if(element.static.paintfeature){for(;j!=currentLookup.length;++j){var feature=currentLookup[j][4];paintFeature(element,feature,parameters)}}if(element.static.postpaint)element.static.postpaint(parameters)}}}function translatePoint(point,scale,translate){return[point[0]/scale-translate[0],point[1]/scale-translate[1]]}function extend(extension,obj){var newObj={};for(var elem in obj){newObj[elem]=obj[elem]}for(var elem in extension){if(!newObj.hasOwnProperty(elem))newObj[elem]=extension[elem]}return newObj}function CanvasMap(parameters){var settings=extend({width:d3.select(parameters.element).node().getBoundingClientRect().width,ratio:1,area:0,scale:1,translate:[0,0],background:null,backgroundScale:1,backgroundTranslate:[0,0],map:this},parameters),simplify=d3.geo.transform({point:function(x,y,z){if(!z||z>=settings.area){this.stream.point(x,y)}}}),canvas=null,context=null;if(!parameters.projection){var b=[[Infinity,Infinity],[-Infinity,-Infinity]];for(var i in settings.data){b=maxBounds(b,d3.geo.bounds(settings.data[i].features))}settings.projection=d3.geo.mercator().scale(1).center([(b[1][0]+b[0][0])/2,(b[1][1]+b[0][1])/2])}var dataPath=d3.geo.path().projection({stream:function(s){return simplify.stream(settings.projection.stream(s))}});var b=[[Infinity,Infinity],[-Infinity,-Infinity]];for(var i in settings.data){b=maxBounds(b,dataPath.bounds(settings.data[i].features))}var dx=b[1][0]-b[0][0],dy=b[1][1]-b[0][1];if(!parameters.projection){settings.height=settings.height||Math.ceil(dy*settings.width/dx);settings.projection.scale(.9*(settings.width/dx)).translate([settings.width/2,settings.height/2])}else if(!settings.height){settings.height=Math.ceil(dy*1/.9)}d3.select(settings.parameters).attr("height",settings.height);function init(){canvas=d3.select(settings.element).append("canvas");context=canvas.node().getContext("2d");var devicePixelRatio=window.devicePixelRatio||1,backingStoreRatio=context.webkitBackingStorePixelRatio||context.mozBackingStorePixelRatio||context.msBackingStorePixelRatio||context.oBackingStorePixelRatio||context.backingStorePixelRatio||1;settings.ratio=devicePixelRatio/backingStoreRatio;settings.area=1/settings.projection.scale()/settings.ratio/20;canvas.attr("width",settings.width*settings.ratio);canvas.attr("height",settings.height*settings.ratio);canvas.style("width",settings.width+"px");canvas.style("height",settings.height+"px");context.lineJoin="round";context.lineCap="round";dataPath.context(context);context.clearRect(0,0,settings.width*settings.ratio,settings.height*settings.ratio);context.save();context.scale(settings.ratio,settings.ratio);for(var i in settings.data){createRTree(settings.data[i],dataPath)}settings.background=new Image;settings.backgroundScale=settings.scale;settings.backgroundTranslate=settings.translate;var parameters={path:dataPath,context:context,scale:settings.scale,translate:settings.translate,width:settings.width,height:settings.height,map:settings.map};var callback=function(){var hasHover=false,hasClick=false;for(var i in settings.data){var element=settings.data[i];hasHover=hasHover||element.events&&element.events.hover;hasClick=hasClick||element.events&&element.events.click;if(element.dynamic&&element.dynamic.postpaint)element.dynamic.postpaint(parameters,null)}context.restore();hasClick&&canvas.on("click",click);hasHover&&canvas.on("mousemove",hover).on("mouseleave",hoverLeave)};for(var i in settings.data){var element=settings.data[i];if(element.dynamic&&element.dynamic.prepaint)element.dynamic.prepaint(parameters,element.hoverElement)}for(var i in settings.data){var element=settings.data[i];paintBackgroundElement(element,parameters)}settings.background.onload=callback;settings.background.src=canvas.node().toDataURL();this.init=function(){}}function paint(){context.save();context.scale(settings.scale*settings.ratio,settings.scale*settings.ratio);context.translate(settings.translate[0],settings.translate[1]);context.clearRect(-settings.translate[0],-settings.translate[1],settings.width*settings.ratio,settings.height*settings.ratio);context.rect(-settings.translate[0],-settings.translate[1],settings.width/settings.scale,settings.height/settings.scale);context.clip();var parameters={path:dataPath,context:dataPath.context(),scale:settings.scale,translate:settings.translate,width:settings.width,height:settings.height,map:settings.map};settings.area=1/settings.projection.scale()/settings.scale/settings.ratio/20;for(var i in settings.data){var element=settings.data[i];if(element.dynamic&&element.dynamic.prepaint)element.dynamic.prepaint(parameters,element.hoverElement)}context.drawImage(settings.background,0,0,settings.width*settings.ratio,settings.height*settings.ratio,-settings.backgroundTranslate[0],-settings.backgroundTranslate[1],settings.width/settings.backgroundScale,settings.height/settings.backgroundScale);for(var i in settings.data){var element=settings.data[i];if(element.dynamic&&element.dynamic.postpaint)element.dynamic.postpaint(parameters,element.hoverElement)}context.restore()}function click(){var point=translatePoint(d3.mouse(this),settings.scale,settings.translate);var parameters={scale:settings.scale,translate:settings.translate,width:settings.width,height:settings.height,map:settings.map};for(var i in settings.data){var element=settings.data[i];if(!element.events||!element.events.click)continue;var lookup=element.lookupTree.search([point[0],point[1],point[0],point[1]]);var isInside=false;for(var j in lookup){var feature=lookup[j][4];if(inside(settings.projection.invert(point),feature)){element.events.click(parameters,feature);isInside=true}}isInside||element.events.click(parameters,null)}}function hoverLeave(){var parameters={scale:settings.scale,translate:settings.translate,width:settings.width,height:settings.height,map:settings.map};for(var i in settings.data){var element=settings.data[i];if(!element.events||!element.events.hover)continue;element.hoverElement=false;element.events.hover(parameters,null)}}function hover(){var point=translatePoint(d3.mouse(this),settings.scale,settings.translate),parameters={scale:settings.scale,translate:settings.translate,width:settings.width,height:settings.height,map:settings.map};for(var i in settings.data){var element=settings.data[i];if(!element.events||!element.events.hover||element.hoverElement&&inside(settings.projection.invert(point),element.hoverElement)){continue}element.hoverElement=false;var lookup=element.lookupTree.search([point[0],point[1],point[0],point[1]]);for(var j in lookup){var feature=lookup[j][4];if(inside(settings.projection.invert(point),feature)){element.hoverElement=feature;break}}element.events.hover(parameters,element.hoverElement)}}this.init=init;this.paint=paint;this.settings=function(){return settings}}StaticCanvasMap=function(parameters){var map=new CanvasMap(parameters);this.init=function(){map.init()};this.paint=function(){map.paint()}};var epsilon=.5;function nearEqual(a,b){return Math.abs(a-b)<epsilon}function ImageCache(parameters){var cache=[],settings=parameters;this.addImage=function(parameters){cache.push(parameters)};this.getImage=function(parameters){for(var i in cache){var element=cache[i];if(nearEqual(element.scale,parameters.scale)&&nearEqual(element.translate[0],parameters.translate[0])&&nearEqual(element.translate[1],parameters.translate[1]))return element}return null};this.getFittingImage=function(bbox){var currentImage=cache.length>0?cache[0]:null;for(var i in cache){var image=cache[i];var imageBB=[-image.translate[0],-image.translate[1],settings.width/image.scale-image.translate[0],settings.height/image.scale-image.translate[1]];if(imageBB[0]<=bbox[0]&&imageBB[1]<=bbox[1]&&imageBB[2]>=bbox[2]&&imageBB[3]>=bbox[3]&&(!currentImage||currentImage.scale<image.scale)){currentImage=image}}return currentImage}}ZoomableCanvasMap=function(parameters){var map=new CanvasMap(parameters),simplify=d3.geo.transform({point:function(x,y,z){if(z>=area)this.stream.point(x,y)}}),area=0,canvas=null,context=null,settings=map.settings(),dataPath=d3.geo.path().projection({stream:function(s){return simplify.stream(settings.projection.stream(s))}}),imageCache=new ImageCache({width:settings.width,height:settings.height}),busy=false;settings.map=this;settings.zoomScale=settings.zoomScale||.5;this.init=function(){map.init();canvas=d3.select(settings.element).append("canvas");context=canvas.node().getContext("2d");area=1/settings.projection.scale()/settings.ratio/20;canvas.attr("width",settings.width*settings.ratio);canvas.attr("height",settings.height*settings.ratio);canvas.style("width",settings.width+"px");canvas.style("height",settings.height+"px");canvas.style("display","none");context.lineJoin="round";context.lineCap="round";dataPath.context(context);imageCache.addImage({image:settings.background,scale:settings.scale,translate:settings.translate})};this.paint=function(){map.paint()};function scaleZoom(scale,translate){if(busy){return}busy=true;if(nearEqual(scale,settings.scale)&&nearEqual(translate[0],settings.translate[0])&&nearEqual(translate[1],settings.translate[1])){scale=1;translate=[0,0]}if(scale==1&&settings.scale==1&&!translate[0]&&!translate[1]&&!settings.translate[0]&&!settings.translate[1]){return}area=1/settings.projection.scale()/scale/settings.ratio/20;context.save();context.scale(scale*settings.ratio,scale*settings.ratio);context.translate(translate[0],translate[1]);context.clearRect(-translate[0],-translate[1],settings.width*settings.ratio,settings.height*settings.ratio);var parameters={path:dataPath,context:context,scale:scale,translate:translate,width:settings.width,height:settings.height,map:settings.map};var image=imageCache.getImage({scale:scale,translate:translate});if(!image){var background=new Image,partialPainter=new PartialPainter(settings.data,parameters)}var translatedOne=translatePoint([settings.width,settings.height],scale,translate),translatedTwo=translatePoint([settings.width,settings.height],settings.scale,settings.translate);var bbox=[Math.min(-translate[0],-settings.translate[0]),Math.min(-translate[1],-settings.translate[1]),Math.max(translatedOne[0],translatedTwo[0]),Math.max(translatedOne[1],translatedTwo[1])];var zoomImage=imageCache.getFittingImage(bbox);if(zoomImage){settings.background=zoomImage.image;settings.backgroundScale=zoomImage.scale;settings.backgroundTranslate=zoomImage.translate}d3.transition().duration(300).ease("linear").tween("zoom",function(){var i=d3.interpolateNumber(settings.scale,scale),oldTranslate=settings.translate,oldScale=settings.scale;return function(t){settings.scale=i(t);var newTranslate=[oldTranslate[0]+(translate[0]-oldTranslate[0])/(scale-oldScale)*(i(t)-oldScale)*scale/i(t),oldTranslate[1]+(translate[1]-oldTranslate[1])/(scale-oldScale)*(i(t)-oldScale)*scale/i(t)];settings.translate=newTranslate;map.paint();!image&&partialPainter.renderNext()}}).each("end",function(){settings.scale=scale;settings.translate=translate;if(image){context.restore();settings.background=image.image;settings.backgroundScale=image.scale;settings.backgroundTranslate=image.translate;map.paint()}else{map.paint();partialPainter.finish();background.onload=function(){context.restore();imageCache.addImage({image:background,scale:scale,translate:translate});settings.background=background;settings.backgroundScale=scale;settings.backgroundTranslate=translate;map.paint()};background.src=canvas.node().toDataURL()}busy=false})}this.zoom=function(d){if(!d){scaleZoom.call(this,1,[0,0]);return}var bounds=dataPath.bounds(d),dx=bounds[1][0]-bounds[0][0],dy=bounds[1][1]-bounds[0][1],bx=(bounds[0][0]+bounds[1][0])/2,by=(bounds[0][1]+bounds[1][1])/2,scale=settings.zoomScale*Math.min(settings.width/dx,settings.height/dy),translate=[-bx+settings.width/scale/2,-by+settings.height/scale/2];scaleZoom.call(this,scale,translate)}}}();

topojson.min.js

!function(){var topojson={version:"1.6.19",mesh:function(topology){return object(topology,meshArcs.apply(this,arguments))},meshArcs:meshArcs,merge:function(topology){return object(topology,mergeArcs.apply(this,arguments))},mergeArcs:mergeArcs,feature:featureOrCollection,neighbors:neighbors,presimplify:presimplify};function stitchArcs(topology,arcs){var stitchedArcs={},fragmentByStart={},fragmentByEnd={},fragments=[],emptyIndex=-1;arcs.forEach(function(i,j){var arc=topology.arcs[i<0?~i:i],t;if(arc.length<3&&!arc[1][0]&&!arc[1][1]){t=arcs[++emptyIndex],arcs[emptyIndex]=i,arcs[j]=t}});arcs.forEach(function(i){var e=ends(i),start=e[0],end=e[1],f,g;if(f=fragmentByEnd[start]){delete fragmentByEnd[f.end];f.push(i);f.end=end;if(g=fragmentByStart[end]){delete fragmentByStart[g.start];var fg=g===f?f:f.concat(g);fragmentByStart[fg.start=f.start]=fragmentByEnd[fg.end=g.end]=fg}else{fragmentByStart[f.start]=fragmentByEnd[f.end]=f}}else if(f=fragmentByStart[end]){delete fragmentByStart[f.start];f.unshift(i);f.start=start;if(g=fragmentByEnd[start]){delete fragmentByEnd[g.end];var gf=g===f?f:g.concat(f);fragmentByStart[gf.start=g.start]=fragmentByEnd[gf.end=f.end]=gf}else{fragmentByStart[f.start]=fragmentByEnd[f.end]=f}}else{f=[i];fragmentByStart[f.start=start]=fragmentByEnd[f.end=end]=f}});function ends(i){var arc=topology.arcs[i<0?~i:i],p0=arc[0],p1;if(topology.transform)p1=[0,0],arc.forEach(function(dp){p1[0]+=dp[0],p1[1]+=dp[1]});else p1=arc[arc.length-1];return i<0?[p1,p0]:[p0,p1]}function flush(fragmentByEnd,fragmentByStart){for(var k in fragmentByEnd){var f=fragmentByEnd[k];delete fragmentByStart[f.start];delete f.start;delete f.end;f.forEach(function(i){stitchedArcs[i<0?~i:i]=1});fragments.push(f)}}flush(fragmentByEnd,fragmentByStart);flush(fragmentByStart,fragmentByEnd);arcs.forEach(function(i){if(!stitchedArcs[i<0?~i:i])fragments.push([i])});return fragments}function meshArcs(topology,o,filter){var arcs=[];if(arguments.length>1){var geomsByArc=[],geom;function arc(i){var j=i<0?~i:i;(geomsByArc[j]||(geomsByArc[j]=[])).push({i:i,g:geom})}function line(arcs){arcs.forEach(arc)}function polygon(arcs){arcs.forEach(line)}function geometry(o){if(o.type==="GeometryCollection")o.geometries.forEach(geometry);else if(o.type in geometryType)geom=o,geometryType[o.type](o.arcs)}var geometryType={LineString:line,MultiLineString:polygon,Polygon:polygon,MultiPolygon:function(arcs){arcs.forEach(polygon)}};geometry(o);geomsByArc.forEach(arguments.length<3?function(geoms){arcs.push(geoms[0].i)}:function(geoms){if(filter(geoms[0].g,geoms[geoms.length-1].g))arcs.push(geoms[0].i)})}else{for(var i=0,n=topology.arcs.length;i<n;++i)arcs.push(i)}return{type:"MultiLineString",arcs:stitchArcs(topology,arcs)}}function mergeArcs(topology,objects){var polygonsByArc={},polygons=[],components=[];objects.forEach(function(o){if(o.type==="Polygon")register(o.arcs);else if(o.type==="MultiPolygon")o.arcs.forEach(register)});function register(polygon){polygon.forEach(function(ring){ring.forEach(function(arc){(polygonsByArc[arc=arc<0?~arc:arc]||(polygonsByArc[arc]=[])).push(polygon)})});polygons.push(polygon)}function exterior(ring){return cartesianRingArea(object(topology,{type:"Polygon",arcs:[ring]}).coordinates[0])>0}polygons.forEach(function(polygon){if(!polygon._){var component=[],neighbors=[polygon];polygon._=1;components.push(component);while(polygon=neighbors.pop()){component.push(polygon);polygon.forEach(function(ring){ring.forEach(function(arc){polygonsByArc[arc<0?~arc:arc].forEach(function(polygon){if(!polygon._){polygon._=1;neighbors.push(polygon)}})})})}}});polygons.forEach(function(polygon){delete polygon._});return{type:"MultiPolygon",arcs:components.map(function(polygons){var arcs=[];polygons.forEach(function(polygon){polygon.forEach(function(ring){ring.forEach(function(arc){if(polygonsByArc[arc<0?~arc:arc].length<2){arcs.push(arc)}})})});arcs=stitchArcs(topology,arcs);if((n=arcs.length)>1){var sgn=exterior(polygons[0][0]);for(var i=0,t;i<n;++i){if(sgn===exterior(arcs[i])){t=arcs[0],arcs[0]=arcs[i],arcs[i]=t;break}}}return arcs})}}function featureOrCollection(topology,o){return o.type==="GeometryCollection"?{type:"FeatureCollection",features:o.geometries.map(function(o){return feature(topology,o)})}:feature(topology,o)}function feature(topology,o){var f={type:"Feature",id:o.id,properties:o.properties||{},geometry:object(topology,o)};if(o.id==null)delete f.id;return f}function object(topology,o){var absolute=transformAbsolute(topology.transform),arcs=topology.arcs;function arc(i,points){if(points.length)points.pop();for(var a=arcs[i<0?~i:i],k=0,n=a.length,p;k<n;++k){points.push(p=a[k].slice());absolute(p,k)}if(i<0)reverse(points,n)}function point(p){p=p.slice();absolute(p,0);return p}function line(arcs){var points=[];for(var i=0,n=arcs.length;i<n;++i)arc(arcs[i],points);if(points.length<2)points.push(points[0].slice());return points}function ring(arcs){var points=line(arcs);while(points.length<4)points.push(points[0].slice());return points}function polygon(arcs){return arcs.map(ring)}function geometry(o){var t=o.type;return t==="GeometryCollection"?{type:t,geometries:o.geometries.map(geometry)}:t in geometryType?{type:t,coordinates:geometryType[t](o)}:null}var geometryType={Point:function(o){return point(o.coordinates)},MultiPoint:function(o){return o.coordinates.map(point)},LineString:function(o){return line(o.arcs)},MultiLineString:function(o){return o.arcs.map(line)},Polygon:function(o){return polygon(o.arcs)},MultiPolygon:function(o){return o.arcs.map(polygon)}};return geometry(o)}function reverse(array,n){var t,j=array.length,i=j-n;while(i<--j)t=array[i],array[i++]=array[j],array[j]=t}function bisect(a,x){var lo=0,hi=a.length;while(lo<hi){var mid=lo+hi>>>1;if(a[mid]<x)lo=mid+1;else hi=mid}return lo}function neighbors(objects){var indexesByArc={},neighbors=objects.map(function(){return[]});function line(arcs,i){arcs.forEach(function(a){if(a<0)a=~a;var o=indexesByArc[a];if(o)o.push(i);else indexesByArc[a]=[i]})}function polygon(arcs,i){arcs.forEach(function(arc){line(arc,i)})}function geometry(o,i){if(o.type==="GeometryCollection")o.geometries.forEach(function(o){geometry(o,i)});else if(o.type in geometryType)geometryType[o.type](o.arcs,i)}var geometryType={LineString:line,MultiLineString:polygon,Polygon:polygon,MultiPolygon:function(arcs,i){arcs.forEach(function(arc){polygon(arc,i)})}};objects.forEach(geometry);for(var i in indexesByArc){for(var indexes=indexesByArc[i],m=indexes.length,j=0;j<m;++j){for(var k=j+1;k<m;++k){var ij=indexes[j],ik=indexes[k],n;if((n=neighbors[ij])[i=bisect(n,ik)]!==ik)n.splice(i,0,ik);if((n=neighbors[ik])[i=bisect(n,ij)]!==ij)n.splice(i,0,ij)}}}return neighbors}function presimplify(topology,triangleArea){var absolute=transformAbsolute(topology.transform),relative=transformRelative(topology.transform),heap=minAreaHeap();if(!triangleArea)triangleArea=cartesianTriangleArea;topology.arcs.forEach(function(arc){var triangles=[],maxArea=0,triangle;for(var i=0,n=arc.length,p;i<n;++i){p=arc[i];arc[i]=[p[0],p[1],Infinity,p[0],p[1]];absolute(arc[i],i)}for(var i=1,n=arc.length-1;i<n;++i){triangle=arc.slice(i-1,i+2);triangle[1][2]=triangleArea(triangle);triangles.push(triangle);heap.push(triangle)}for(var i=0,n=triangles.length;i<n;++i){triangle=triangles[i];triangle.previous=triangles[i-1];triangle.next=triangles[i+1]}while(triangle=heap.pop()){var previous=triangle.previous,next=triangle.next;if(triangle[1][2]<maxArea)triangle[1][2]=maxArea;else maxArea=triangle[1][2];if(previous){previous.next=next;previous[2]=triangle[2];update(previous)}if(next){next.previous=previous;next[0]=triangle[0];update(next)}}for(var i=0,n=arc.length,p;i<n;++i){p=arc[i];arc[i]=[p[3],p[4],p[2]]}});function update(triangle){heap.remove(triangle);triangle[1][2]=triangleArea(triangle);heap.push(triangle)}return topology}function cartesianRingArea(ring){var i=-1,n=ring.length,a,b=ring[n-1],area=0;while(++i<n){a=b;b=ring[i];area+=a[0]*b[1]-a[1]*b[0]}return area*.5}function cartesianTriangleArea(triangle){var a=triangle[0],b=triangle[1],c=triangle[2];return Math.abs((a[0]-c[0])*(b[1]-a[1])-(a[0]-b[0])*(c[1]-a[1]))}function compareArea(a,b){return a[1][2]-b[1][2]}function minAreaHeap(){var heap={},array=[],size=0;heap.push=function(object){up(array[object._=size]=object,size++);return size};heap.pop=function(){if(size<=0)return;var removed=array[0],object;if(--size>0)object=array[size],down(array[object._=0]=object,0);return removed};heap.remove=function(removed){var i=removed._,object;if(array[i]!==removed)return;if(i!==--size)object=array[size],(compareArea(object,removed)<0?up:down)(array[object._=i]=object,i);return i};function up(object,i){while(i>0){var j=(i+1>>1)-1,parent=array[j];if(compareArea(object,parent)>=0)break;array[parent._=i]=parent;array[object._=i=j]=object}}function down(object,i){while(true){var r=i+1<<1,l=r-1,j=i,child=array[j];if(l<size&&compareArea(array[l],child)<0)child=array[j=l];if(r<size&&compareArea(array[r],child)<0)child=array[j=r];if(j===i)break;array[child._=i]=child;array[object._=i=j]=object}}return heap}function transformAbsolute(transform){if(!transform)return noop;var x0,y0,kx=transform.scale[0],ky=transform.scale[1],dx=transform.translate[0],dy=transform.translate[1];return function(point,i){if(!i)x0=y0=0;point[0]=(x0+=point[0])*kx+dx;point[1]=(y0+=point[1])*ky+dy}}function transformRelative(transform){if(!transform)return noop;var x0,y0,kx=transform.scale[0],ky=transform.scale[1],dx=transform.translate[0],dy=transform.translate[1];return function(point,i){if(!i)x0=y0=0;var x1=(point[0]-dx)/kx|0,y1=(point[1]-dy)/ky|0;point[0]=x1-x0;point[1]=y1-y0;x0=x1;y0=y1}}function noop(){}if(typeof define==="function"&&define.amd)define(topojson);else if(typeof module==="object"&&module.exports)module.exports=topojson;else this.topojson=topojson}();