-
Notifications
You must be signed in to change notification settings - Fork 7
/
OSMBuildings-Leaflet.js
50 lines (50 loc) · 24.5 KB
/
OSMBuildings-Leaflet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(function(aa){function T(b,a){var c=b.x-a.x,d=b.y-a.y;return c*c+d*d}function wa(b){var a=b.length;if(16>a)return!1;var c,d=Infinity,f=-Infinity,h=Infinity,g=-Infinity;for(c=0;c<a-1;c+=2)d=Math.min(d,b[c]),f=Math.max(f,b[c]),h=Math.min(h,b[c+1]),g=Math.max(g,b[c+1]);c=f-d;g-=h;f=c/g;if(0.85>f||1.15<f)return!1;d={x:d+c/2,y:h+g/2};c=(c+g)/4;h=c*c;for(c=0;c<a-1;c+=2)if(g=T({x:b[c],y:b[c+1]},d),0.8>g/h||1.2<g/h)return!1;return!0}function ka(b,a){var c={};b/=U;a/=U;var d=xa,f;f=0>=a?90:1<=a?-90:(2*ya(za(F*
(1-2*a)))-J)/F*180;c[d]=f;c[Aa]=360*(1===b?1:(b%1+1)%1)-180;return c}function da(b,a){var c=V(1,K(0,0.5-Ba(la(Ca+J*b/180))/F/2));return{x:(a/360+0.5)*U<<0,y:c*U<<0}}function W(b){for(var a=D+q,c=B+n,d=0,f=b.length-3;d<f;d+=2)if(b[d]>q&&b[d]<a&&b[d+1]>n&&b[d+1]<c)return!0;return!1}function Da(){M||(M=setInterval(function(){for(var b=C.items,a=!1,c=0,d=b.length;c<d;c++)1>b[c].scale&&(b[c].scale+=0.1,1<b[c].scale&&(b[c].scale=1),a=!0);x.render();a||(clearInterval(M),M=null)},33))}function ea(b){N=X+
b.x;O=B+b.y;x.render(!0)}function ma(b){D=b.width;B=b.height;X=D/2<<0;fa=B/2<<0;N=X;O=B;x.setSize(D,B);ga=t-50}function na(b){z=b;U=Ea<<z;b=ka(q+X,n+fa);var a=da(b.latitude,0);oa=da(b.latitude,1).x-a.x;E=pa(0.95,z-G);ha=""+H.alpha(E);ba=""+ca.alpha(E);Y=""+P.alpha(E)}var v=Math,za=v.exp,Ba=v.log,Fa=v.sin,Ga=v.cos,la=v.tan,ya=v.atan,Q=v.atan2,V=v.min,K=v.max,qa=v.sqrt,ra=v.ceil,pa=v.pow,ia=document,sa=sa||Array,ta=ta||Array,v=/iP(ad|hone|od)/g.test(navigator.userAgent),r=!!~navigator.userAgent.indexOf("Trident"),
Ha=!aa.requestAnimationFrame||v||r?function(b){b()}:aa.requestAnimationFrame,I=function(b){function a(a,b,c){0>c&&(c+=1);1<c&&(c-=1);return c<1/6?a+6*(b-a)*c:0.5>c?b:c<2/3?a+(b-a)*(2/3-c)*6:a}var c={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",grey:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",orange:"#ffa500",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"},d=function(a,b,
c,d){this.H=a;this.S=b;this.L=c;this.A=d};d.parse=function(a){var b=0,g=0,e=0,k=1,l;a=(""+a).toLowerCase();a=c[a]||a;if(l=a.match(/^#(\w{2})(\w{2})(\w{2})$/))b=parseInt(l[1],16),g=parseInt(l[2],16),e=parseInt(l[3],16);else if(l=a.match(/rgba?\((\d+)\D+(\d+)\D+(\d+)(\D+([\d.]+))?\)/))b=parseInt(l[1],10),g=parseInt(l[2],10),e=parseInt(l[3],10),k=l[4]?parseFloat(l[5]):1;else return;b/=255;g/=255;e/=255;a=Math.max(b,g,e);var m=Math.min(b,g,e),p;l=(a+m)/2;var y=a-m;if(y){m=0.5<l?y/(2-a-m):y/(a+m);switch(a){case b:p=
(g-e)/y+(g<e?6:0);break;case g:p=(e-b)/y+2;break;case e:p=(b-g)/y+4}p*=60}else p=m=0;return new d(p,m,l,k)};d.prototype={toRGBA:function(){var b=Math.min(360,Math.max(0,this.H)),c=Math.min(1,Math.max(0,this.S)),d=Math.min(1,Math.max(0,this.L)),e=Math.min(1,Math.max(0,this.A)),k;if(0===c)b=k=c=d;else{var l=0.5>d?d*(1+c):d+c-d*c,d=2*d-l,b=b/360,c=a(d,l,b+1/3);k=a(d,l,b);b=a(d,l,b-1/3)}return{r:Math.round(255*c),g:Math.round(255*k),b:Math.round(255*b),a:e}},toString:function(){var a=this.toRGBA();return 1===
a.a?"#"+(16777216+(a.r<<16)+(a.g<<8)+a.b).toString(16).slice(1,7):"rgba("+[a.r,a.g,a.b,a.a.toFixed(2)].join()+")"},hue:function(a){return new d(this.H*a,this.S,this.L,this.A)},saturation:function(a){return new d(this.H,this.S*a,this.L,this.A)},lightness:function(a){return new d(this.H,this.S,this.L*a,this.A)},alpha:function(a){return new d(this.H,this.S,this.L,this.A*a)}};return d}(this),Ia=function(){var b=Math,a=b.PI,c=b.sin,d=b.cos,f=b.tan,h=b.asin,g=b.atan2,e=a/180,k=23.4397*e;return function(b,
m,p){p=e*-p;m*=e;b=b.valueOf()/864E5-0.5+2440588-2451545;var y=e*(357.5291+0.98560028*b),w;w=e*(1.9148*c(y)+0.02*c(2*y)+3E-4*c(3*y));w=y+w+102.9372*e+a;y=h(c(0)*d(k)+d(0)*c(k)*c(w));w=g(c(w)*d(k)-f(0)*c(k),d(w));b=e*(280.16+360.9856235*b)-p-w;p=h(c(m)*c(y)+d(m)*d(y)*d(b));m=g(c(b),d(b)*c(m)-f(y)*d(m));return{altitude:p,azimuth:m-a/2}}}(),Ka=function(){function b(a){a=a.toLowerCase();return"#"===a[0]?a:c[d[a]||a]||null}function a(b){var c,d,e=[],k;switch(b.type){case "GeometryCollection":e=[];c=0;
for(d=b.geometries.length;c<d;c++)(k=a(b.geometries[c]))&&e.push.apply(e,k);return e;case "MultiPolygon":e=[];c=0;for(d=b.coordinates.length;c<d;c++)(k=a({type:"Polygon",coordinates:b.coordinates[c]}))&&e.push.apply(e,k);return e;case "Polygon":b=b.coordinates;break;default:return[]}var l,m=[],p=[];l=b[0];c=0;for(d=l.length;c<d;c++)m.push(l[c][1],l[c][0]);c=0;for(d=b.length-1;c<d;c++)for(l=b[c+1],p[c]=[],e=0,k=l.length;e<k;e++)p[c].push(l[e][1],l[e][0]);return[{outer:m,inner:p.length?p:null}]}var c=
{brick:"#cc7755",bronze:"#ffeecc",canvas:"#fff8f0",concrete:"#999999",copper:"#a0e0d0",glass:"#e8f8f8",gold:"#ffcc00",plants:"#009933",metal:"#aaaaaa",panel:"#fff8f0",plaster:"#999999",roof_tiles:"#f08060",silver:"#cccccc",slate:"#666666",stone:"#996666",tar_paper:"#333333",wood:"#deb887"},d={asphalt:"tar_paper",bitumen:"tar_paper",block:"stone",bricks:"brick",glas:"glass",glassfront:"glass",grass:"plants",masonry:"stone",granite:"stone",panels:"panel",paving_stones:"stone",plastered:"plaster",rooftiles:"roof_tiles",
roofingfelt:"tar_paper",sandstone:"stone",sheet:"canvas",sheets:"canvas",shingle:"tar_paper",shingles:"tar_paper",slates:"slate",steel:"metal",tar:"tar_paper",tent:"canvas",thatch:"plants",tile:"roof_tiles",tiles:"roof_tiles"};return{read:function(c){if(!c||"FeatureCollection"!==c.type)return[];c=c.features;var d,g,e,k,l=[],m,p,y,w;d=0;for(g=c.length;d<g;d++)if(m=c[d],"Feature"===m.type&&!1!==ua(m)){e=m.properties;k={};e=e||{};k.height=e.height||(e.levels?3*e.levels:Ja);k.minHeight=e.minHeight||(e.minLevel?
3*e.minLevel:0);if(p=e.material?b(e.material):e.wallColor||e.color)k.wallColor=p;if(p=e.roofMaterial?b(e.roofMaterial):e.roofColor)k.roofColor=p;switch(e.shape){case "cylinder":case "cone":case "dome":case "sphere":k.shape=e.shape;k.isRotational=!0;break;case "pyramid":k.shape=e.shape}switch(e.roofShape){case "cone":case "dome":k.roofShape=e.roofShape;k.isRotational=!0;break;case "pyramid":k.roofShape=e.roofShape}k.roofShape&&e.roofHeight?(k.roofHeight=e.roofHeight,k.height=K(0,k.height-k.roofHeight)):
k.roofHeight=0;y=k;p=a(m.geometry);e=0;for(k=p.length;e<k;e++){w=y;var q={},n=void 0;for(n in w)w.hasOwnProperty(n)&&(q[n]=w[n]);w=q;w.footprint=p[e].outer;if(w.isRotational){for(var q=w,n=w.footprint,t=180,r=-180,u=0,s=n.length;u<s;u+=2)t=V(t,n[u+1]),r=K(r,n[u+1]);q.radius=(r-t)/2}p[e].inner&&(w.holes=p[e].inner);if(m.id||m.properties.id)w.id=m.id||m.properties.id;m.properties.relationId&&(w.relationId=m.properties.relationId);l.push(w)}}return l}}}(),F=Math.PI,J=F/2,Ca=F/4,Ea=256,z,U,G=15,xa="latitude",
Aa="longitude",D=0,B=0,X=0,fa=0,q=0,n=0,H=I.parse("rgba(200, 190, 180)"),ca=H.lightness(0.8),P=H.lightness(1.2),ha=""+H,ba=""+ca,Y=""+P,oa=0,E=1,ga,Ja=5,N,O,t=450,R,La=function(){function b(a,b){if(f[a])b&&b(f[a]);else{var c=new XMLHttpRequest;c.onreadystatechange=function(){if(4===c.readyState&&c.status&&!(200>c.status||299<c.status)&&b&&c.responseText){var d;try{d=JSON.parse(c.responseText)}catch(k){}f[a]=d;h.push({url:a,size:c.responseText.length});for(g+=c.responseText.length;g>e;){var n=h.shift();
g-=n.size;delete f[n.url]}b(d)}};c.open("GET",a);c.send(null);return c}}function a(a,b){var c=a.x-b.x,d=a.y-b.y;return c*c+d*d}function c(a){a=a||{};d+=a.key||"anonymous";e=a.cacheSize||1048576}var d="http://data.osmbuildings.org/0.2/",f={},h=[],g=0,e=0;c.TILE_SIZE=256;c.ATTRIBUTION='Data Service © <a href="http://bld.gs">BLD.GS</a>';var k=c.prototype;k.getTile=function(a,c,e,f){return b(d+"/tile/"+e+"/"+a+"/"+c+".json",f)};k.getFeature=function(a,c){return b(d+"/feature/"+a+".json",c)};k.getBBox=
function(a,c){var e=d+"/bbox.json?bbox="+[a.n.toFixed(5),a.e.toFixed(5),a.s.toFixed(5),a.w.toFixed(5)].join();return b(e,c)};k.getAllTiles=function(b,d,e,f,g,h){var k=c.TILE_SIZE,n=16<g?k<<g-16:k>>16-g;g=b/n<<0;var q=d/n<<0,t=Math.ceil((b+e)/n),n=Math.ceil((d+f)/n),u,r=[];for(u=q;u<=n;u++)for(q=g;q<=t;q++)r.push({x:q,y:u,z:16});var s={x:b+(e-k)/2,y:d+(f-k)/2};r.sort(function(b,c){return a(b,s)-a(c,s)});b=0;for(d=r.length;b<d;b++)this.getTile(r[b].x,r[b].y,r[b].z,h);return{abort:function(){for(var a=
0;a<r.length;a++)r[a].abort()}}};return c}(),C={loadedItems:{},items:[],getPixelFootprint:function(b){for(var a=new sa(b.length),c,d=0,f=b.length-1;d<f;d+=2)c=da(b[d],b[d+1]),a[d]=c.x,a[d+1]=c.y;b=a;a=b.length/2;c=new ta(a);var d=0,f=a-1,h,g,e,k,l=[],m=[],p=[];for(c[d]=c[f]=1;f;){g=0;for(h=d+1;h<f;h++){e=b[2*h];var n=b[2*h+1],q=b[2*d],r=b[2*d+1],t=b[2*f],u=b[2*f+1],s=t-q,v=u-r,x=void 0;if(0!==s||0!==v)x=((e-q)*s+(n-r)*v)/(s*s+v*v),1<x?(q=t,r=u):0<x&&(q+=s*x,r+=v*x);s=e-q;v=n-r;e=s*s+v*v;e>g&&(k=h,
g=e)}2<g&&(c[k]=1,l.push(d),m.push(k),l.push(k),m.push(f));d=l.pop();f=m.pop()}for(h=0;h<a;h++)c[h]&&p.push(b[2*h],b[2*h+1]);a=p;if(!(8>a.length))return a},resetItems:function(){this.items=[];this.loadedItems={};Z.reset()},addRenderItems:function(b,a){for(var c,d,f,h=Ka.read(b),g=0,e=h.length;g<e;g++)c=h[g],f=c.id||[c.footprint[0],c.footprint[1],c.height,c.minHeight].join(),!this.loadedItems[f]&&(d=this.scale(c))&&(d.scale=a?0:1,this.items.push(d),this.loadedItems[f]=1);Da()},scale:function(b){var a=
{},c=6/pa(2,z-G);b.id&&(a.id=b.id);a.height=V(b.height/c,ga);a.minHeight=isNaN(b.minHeight)?0:b.minHeight/c;if(!(a.minHeight>ga)&&(a.footprint=this.getPixelFootprint(b.footprint),a.footprint)){for(var d=a.footprint,f=Infinity,h=-Infinity,g=Infinity,e=-Infinity,k=0,l=d.length-3;k<l;k+=2)f=V(f,d[k]),h=K(h,d[k]),g=V(g,d[k+1]),e=K(e,d[k+1]);a.center={x:f+(h-f)/2<<0,y:g+(e-g)/2<<0};b.radius&&(a.radius=b.radius*oa);b.shape&&(a.shape=b.shape);b.roofShape&&(a.roofShape=b.roofShape);"cone"!==a.roofShape&&
"dome"!==a.roofShape||a.shape||!wa(a.footprint)||(a.shape="cylinder");if(b.holes){a.holes=[];for(var m,d=0,f=b.holes.length;d<f;d++)(m=this.getPixelFootprint(b.holes[d]))&&a.holes.push(m)}var p;b.wallColor&&(p=I.parse(b.wallColor))&&(p=p.alpha(E),a.altColor=""+p.lightness(0.8),a.wallColor=""+p);b.roofColor&&(p=I.parse(b.roofColor))&&(a.roofColor=""+p.alpha(E));b.relationId&&(a.relationId=b.relationId);a.hitColor=Z.idToColor(b.relationId||b.id);a.roofHeight=isNaN(b.roofHeight)?0:b.roofHeight/c;if(!(a.height+
a.roofHeight<=a.minHeight))return a}},set:function(b){this.isStatic=!0;this.resetItems();this._staticData=b;this.addRenderItems(this._staticData,!0)},load:function(b){this.provider=b||new La({key:"rkc8ywdl"});this.update()},update:function(){function b(a){g.addRenderItems(a)}this.resetItems();if(!(z<G))if(this.isStatic&&this._staticData)this.addRenderItems(this._staticData);else if(this.provider){var a=16<z?256<<z-16:256>>16-z,c=q/a<<0,d=n/a<<0,f=ra((q+D)/a),a=ra((n+B)/a),h,g=this;for(h=d;h<=a;h++)for(d=
c;d<=f;d++)this.provider.getTile(d,h,16,b)}}},$={draw:function(b,a,c,d,f,h,g,e){var k,l=this._extrude(b,a,d,f,h,g),m=[];if(c)for(a=0,k=c.length;a<k;a++)m[a]=this._extrude(b,c[a],d,f,h,g);b.fillStyle=e;b.beginPath();this._ring(b,l);if(c)for(a=0,k=m.length;a<k;a++)this._ring(b,m[a]);b.closePath();b.stroke();b.fill()},_extrude:function(b,a,c,d,f,h){c=t/(t-c);for(var g=t/(t-d),e={x:0,y:0},k={x:0,y:0},l,m,p=[],r=0,s=a.length-3;r<s;r+=2)e.x=a[r]-q,e.y=a[r+1]-n,k.x=a[r+2]-q,k.y=a[r+3]-n,l=u.project(e,c),
m=u.project(k,c),d&&(e=u.project(e,g),k=u.project(k,g)),(k.x-e.x)*(l.y-e.y)>(l.x-e.x)*(k.y-e.y)&&(b.fillStyle=e.x<k.x&&e.y<k.y||e.x>k.x&&e.y>k.y?h:f,b.beginPath(),this._ring(b,[k.x,k.y,e.x,e.y,l.x,l.y,m.x,m.y]),b.closePath(),b.fill()),p[r]=l.x,p[r+1]=l.y;return p},_ring:function(b,a){b.moveTo(a[0],a[1]);for(var c=2,d=a.length-1;c<d;c+=2)b.lineTo(a[c],a[c+1])},simplified:function(b,a,c){b.beginPath();this._ringAbs(b,a);if(c){a=0;for(var d=c.length;a<d;a++)this._ringAbs(b,c[a])}b.closePath();b.stroke();
b.fill()},_ringAbs:function(b,a){b.moveTo(a[0]-q,a[1]-n);for(var c=2,d=a.length-1;c<d;c+=2)b.lineTo(a[c]-q,a[c+1]-n)},shadow:function(b,a,c,d,f){for(var h=null,g={x:0,y:0},e={x:0,y:0},k,l,m=0,p=a.length-3;m<p;m+=2)g.x=a[m]-q,g.y=a[m+1]-n,e.x=a[m+2]-q,e.y=a[m+3]-n,k=A.project(g,d),l=A.project(e,d),f&&(g=A.project(g,f),e=A.project(e,f)),(e.x-g.x)*(k.y-g.y)>(k.x-g.x)*(e.y-g.y)?(1===h&&b.lineTo(g.x,g.y),h=0,m||b.moveTo(g.x,g.y),b.lineTo(e.x,e.y)):(0===h&&b.lineTo(k.x,k.y),h=1,m||b.moveTo(k.x,k.y),b.lineTo(l.x,
l.y));if(c)for(m=0,p=c.length;m<p;m++)this._ringAbs(b,c[m])},shadowMask:function(b,a,c){this._ringAbs(b,a);if(c){a=0;for(var d=c.length;a<d;a++)this._ringAbs(b,c[a])}},hitArea:function(b,a,c,d,f,h){c=null;var g={x:0,y:0},e={x:0,y:0};d=t/(t-d);var k=t/(t-f),l;b.fillStyle=h;b.beginPath();for(var m=0,p=a.length-3;m<p;m+=2)g.x=a[m]-q,g.y=a[m+1]-n,e.x=a[m+2]-q,e.y=a[m+3]-n,h=u.project(g,d),l=u.project(e,d),f&&(g=u.project(g,k),e=u.project(e,k)),(e.x-g.x)*(h.y-g.y)>(h.x-g.x)*(e.y-g.y)?(1===c&&b.lineTo(g.x,
g.y),c=0,m||b.moveTo(g.x,g.y),b.lineTo(e.x,e.y)):(0===c&&b.lineTo(h.x,h.y),c=1,m||b.moveTo(h.x,h.y),b.lineTo(l.x,l.y));b.closePath();b.fill()}},s={draw:function(b,a,c,d,f,h,g,e,k){a={x:a.x-q,y:a.y-n};var l=t/(t-f),m=t/(t-h);f=u.project(a,l);d*=l;h&&(a=u.project(a,m),c*=m);(l=this._tangents(a,c,f,d))?(h=Q(l[0].y1-a.y,l[0].x1-a.x),l=Q(l[1].y1-a.y,l[1].x1-a.x)):(h=1.5*F,l=1.5*F);b.fillStyle=g;b.beginPath();b.arc(f.x,f.y,d,J,h,!0);b.arc(a.x,a.y,c,h,J);b.closePath();b.fill();b.fillStyle=e;b.beginPath();
b.arc(f.x,f.y,d,l,J,!0);b.arc(a.x,a.y,c,J,l);b.closePath();b.fill();b.fillStyle=k;this._circle(b,f,d)},simplified:function(b,a,c){this._circle(b,{x:a.x-q,y:a.y-n},c)},shadow:function(b,a,c,d,f,h){a={x:a.x-q,y:a.y-n};f=A.project(a,f);var g;h&&(a=A.project(a,h));var e=this._tangents(a,c,f,d);e?(h=Q(e[0].y1-a.y,e[0].x1-a.x),g=Q(e[1].y1-a.y,e[1].x1-a.x),b.moveTo(e[1].x2,e[1].y2),b.arc(f.x,f.y,d,g,h),b.arc(a.x,a.y,c,h,g)):(b.moveTo(a.x+c,a.y),b.arc(a.x,a.y,c,0,2*F))},shadowMask:function(b,a,c){var d=a.x-
q;a=a.y-n;b.moveTo(d+c,a);b.arc(d,a,c,0,2*F)},hitArea:function(b,a,c,d,f,h,g){a={x:a.x-q,y:a.y-n};var e=t/(t-f),k=t/(t-h);f=u.project(a,e);d*=e;h&&(a=u.project(a,k),c*=k);h=this._tangents(a,c,f,d);b.fillStyle=g;b.beginPath();h?(g=Q(h[0].y1-a.y,h[0].x1-a.x),e=Q(h[1].y1-a.y,h[1].x1-a.x),b.moveTo(h[1].x2,h[1].y2),b.arc(f.x,f.y,d,e,g),b.arc(a.x,a.y,c,g,e)):(b.moveTo(a.x+c,a.y),b.arc(a.x,a.y,c,0,2*F));b.closePath();b.fill()},_circle:function(b,a,c){b.beginPath();b.arc(a.x,a.y,c,0,2*F);b.stroke();b.fill()},
_tangents:function(b,a,c,d){var f=b.x-c.x,h=b.y-c.y,g=a-d,e=f*f+h*h;if(!(e<=g*g)){var e=qa(e),f=-f/e,h=-h/e,g=g/e,e=[],k,l,m;k=qa(K(0,1-g*g));for(var p=1;-1<=p;p-=2)l=f*g-p*k*h,m=h*g+p*k*f,e.push({x1:b.x+a*l<<0,y1:b.y+a*m<<0,x2:c.x+d*l<<0,y2:c.y+d*m<<0});return e}}},S={draw:function(b,a,c,d,f,h,g){var e=t/(t-f);c=u.project({x:c.x-q,y:c.y-n},t/(t-d));d={x:0,y:0};for(var k={x:0,y:0},l=0,m=a.length-3;l<m;l+=2)d.x=a[l]-q,d.y=a[l+1]-n,k.x=a[l+2]-q,k.y=a[l+3]-n,f&&(d=u.project(d,e),k=u.project(k,e)),(k.x-
d.x)*(c.y-d.y)>(c.x-d.x)*(k.y-d.y)&&(b.fillStyle=d.x<k.x&&d.y<k.y||d.x>k.x&&d.y>k.y?g:h,b.beginPath(),this._triangle(b,d,k,c),b.closePath(),b.fill())},_triangle:function(b,a,c,d){b.moveTo(a.x,a.y);b.lineTo(c.x,c.y);b.lineTo(d.x,d.y)},_ring:function(b,a){b.moveTo(a[0]-q,a[1]-n);for(var c=2,d=a.length-1;c<d;c+=2)b.lineTo(a[c]-q,a[c+1]-n)},shadow:function(b,a,c,d,f){var h={x:0,y:0},g={x:0,y:0};c=A.project({x:c.x-q,y:c.y-n},d);d=0;for(var e=a.length-3;d<e;d+=2)h.x=a[d]-q,h.y=a[d+1]-n,g.x=a[d+2]-q,g.y=
a[d+3]-n,f&&(h=A.project(h,f),g=A.project(g,f)),(g.x-h.x)*(c.y-h.y)>(c.x-h.x)*(g.y-h.y)&&this._triangle(b,h,g,c)},shadowMask:function(b,a){this._ring(b,a)},hitArea:function(b,a,c,d,f,h){var g=t/(t-f);c=u.project({x:c.x-q,y:c.y-n},t/(t-d));d={x:0,y:0};var e={x:0,y:0};b.fillStyle=h;b.beginPath();h=0;for(var k=a.length-3;h<k;h+=2)d.x=a[h]-q,d.y=a[h+1]-n,e.x=a[h+2]-q,e.y=a[h+3]-n,f&&(d=u.project(d,g),e=u.project(e,g)),(e.x-d.x)*(c.y-d.y)>(c.x-d.x)*(e.y-d.y)&&this._triangle(b,d,e,c);b.closePath();b.fill()}},
u={project:function(b,a){return{x:(b.x-N)*a+N<<0,y:(b.y-O)*a+O<<0}},render:function(){var b=this.context;b.clearRect(0,0,D,B);if(!(z<G||R)){var a,c,d,f={x:N+q,y:O+n},h,g,e,k,l=C.items;l.sort(function(a,b){return a.minHeight-b.minHeight||T(b.center,f)-T(a.center,f)||b.height-a.height});for(var m=0,p=l.length;m<p;m++)if(a=l[m],!ja.isSimple(a)&&(h=a.footprint,W(h))){c=1>a.scale?a.height*a.scale:a.height;d=0;a.minHeight&&(d=1>a.scale?a.minHeight*a.scale:a.minHeight);g=a.wallColor||ha;e=a.altColor||ba;
k=a.roofColor||Y;b.strokeStyle=e;switch(a.shape){case "cylinder":s.draw(b,a.center,a.radius,a.radius,c,d,g,e,k);break;case "cone":s.draw(b,a.center,a.radius,0,c,d,g,e);break;case "dome":s.draw(b,a.center,a.radius,a.radius/2,c,d,g,e);break;case "sphere":s.draw(b,a.center,a.radius,a.radius,c,d,g,e,k);break;case "pyramid":S.draw(b,h,a.center,c,d,g,e);break;default:$.draw(b,h,a.holes,c,d,g,e,k)}switch(a.roofShape){case "cone":s.draw(b,a.center,a.radius,0,c+a.roofHeight,c,k,""+I.parse(k).lightness(0.9));
break;case "dome":s.draw(b,a.center,a.radius,a.radius/2,c+a.roofHeight,c,k,""+I.parse(k).lightness(0.9));break;case "pyramid":S.draw(b,h,a.center,c+a.roofHeight,c,k,I.parse(k).lightness(0.9))}}}}},ja={maxZoom:G+2,maxHeight:5,isSimple:function(b){return z<=this.maxZoom&&b.height+b.roofHeight<this.maxHeight},render:function(){var b=this.context;b.clearRect(0,0,D,B);if(!(z<G||R||z>this.maxZoom))for(var a,c,d=C.items,f=0,h=d.length;f<h;f++)if(a=d[f],!(a.height>=this.maxHeight)&&(c=a.footprint,W(c)))switch(b.strokeStyle=
a.altColor||ba,b.fillStyle=a.roofColor||Y,a.shape){case "cylinder":case "cone":case "dome":case "sphere":s.simplified(b,a.center,a.radius);break;default:$.simplified(b,c,a.holes)}}},A={enabled:!0,color:"#666666",blurColor:"#000000",blurSize:15,date:new Date,direction:{x:0,y:0},project:function(b,a){return{x:b.x+this.direction.x*a,y:b.y+this.direction.y*a}},render:function(){var b=this.context,a,c,d;b.clearRect(0,0,D,B);if(!(!this.enabled||z<G||R||(a=ka(X+q,fa+n),a=Ia(this.date,a.latitude,a.longitude),
0>=a.altitude))){c=1/la(a.altitude);d=5>c?0.75:1/c*5;this.direction.x=Ga(a.azimuth)*c;this.direction.y=Fa(a.azimuth)*c;var f,h,g,e;a=C.items;b.canvas.style.opacity=d/(2*E);b.shadowColor=this.blurColor;b.shadowBlur=E/2*this.blurSize;b.fillStyle=this.color;b.beginPath();d=0;for(c=a.length;d<c;d++)if(f=a[d],e=f.footprint,W(e)){h=1>f.scale?f.height*f.scale:f.height;g=0;f.minHeight&&(g=1>f.scale?f.minHeight*f.scale:f.minHeight);switch(f.shape){case "cylinder":s.shadow(b,f.center,f.radius,f.radius,h,g);
break;case "cone":s.shadow(b,f.center,f.radius,0,h,g);break;case "dome":s.shadow(b,f.center,f.radius,f.radius/2,h,g);break;case "sphere":s.shadow(b,f.center,f.radius,f.radius,h,g);break;case "pyramid":S.shadow(b,e,f.center,h,g);break;default:$.shadow(b,e,f.holes,h,g)}switch(f.roofShape){case "cone":s.shadow(b,f.center,f.radius,0,h+f.roofHeight,h);break;case "dome":s.shadow(b,f.center,f.radius,f.radius/2,h+f.roofHeight,h);break;case "pyramid":S.shadow(b,e,f.center,h+f.roofHeight,h)}}b.closePath();
b.fill();b.shadowBlur=null;b.globalCompositeOperation="destination-out";b.beginPath();d=0;for(c=a.length;d<c;d++)if(f=a[d],e=f.footprint,W(e)&&!f.minHeight)switch(f.shape){case "cylinder":case "cone":case "dome":s.shadowMask(b,f.center,f.radius);break;default:$.shadowMask(b,e,f.holes)}b.fillStyle="#00ff00";b.fill();b.globalCompositeOperation="source-over"}}},Z={_idMapping:[null],reset:function(){this._idMapping=[null]},render:function(){if(!this._timer){var b=this;this._timer=setTimeout(function(){b._timer=
null;b._render()},500)}},_render:function(){var b=this.context;b.clearRect(0,0,D,B);if(!(z<G||R)){var a,c,d,f={x:N+q,y:O+n},h,g,e=C.items;e.sort(function(a,b){return a.minHeight-b.minHeight||T(b.center,f)-T(a.center,f)||b.height-a.height});for(var k=0,l=e.length;k<l;k++)if(a=e[k],g=a.hitColor)if(h=a.footprint,W(h)){c=a.height;d=0;a.minHeight&&(d=a.minHeight);switch(a.shape){case "cylinder":s.hitArea(b,a.center,a.radius,a.radius,c,d,g);break;case "cone":s.hitArea(b,a.center,a.radius,0,c,d,g);break;
case "dome":s.hitArea(b,a.center,a.radius,a.radius/2,c,d,g);break;case "sphere":s.hitArea(b,a.center,a.radius,a.radius,c,d,g);break;case "pyramid":S.hitArea(b,h,a.center,c,d,g);break;default:$.hitArea(b,h,a.holes,c,d,g)}switch(a.roofShape){case "cone":s.hitArea(b,a.center,a.radius,0,c+a.roofHeight,c,g);break;case "dome":s.hitArea(b,a.center,a.radius,a.radius/2,c+a.roofHeight,c,g);break;case "pyramid":S.hitArea(b,h,a.center,c+a.roofHeight,c,g)}}this._imageData=this.context.getImageData(0,0,D,B).data}},
getIdFromXY:function(b,a){var c=this._imageData;if(c){var d=4*((a|0)*D+(b|0));return this._idMapping[c[d]|c[d+1]<<8|c[d+2]<<16]}},idToColor:function(b){var a=this._idMapping.indexOf(b);-1===a&&(this._idMapping.push(b),a=this._idMapping.length-1);return"rgb("+[a&255,a>>8&255,a>>16&255].join()+")"}},M,x={container:ia.createElement("DIV"),items:[],init:function(){this.container.style.pointerEvents="none";this.container.style.position="absolute";this.container.style.left=0;this.container.style.top=0;
A.context=this.createContext(this.container);ja.context=this.createContext(this.container);u.context=this.createContext(this.container);Z.context=this.createContext()},render:function(b){Ha(function(){b||(A.render(),ja.render(),Z.render());u.render()})},createContext:function(b){var a=ia.createElement("CANVAS");a.style.webkitTransform="translate3d(0,0,0)";a.style.imageRendering="optimizeSpeed";a.style.position="absolute";a.style.left=0;a.style.top=0;var c=a.getContext("2d");c.lineCap="round";c.lineJoin=
"round";c.lineWidth=1;c.mozImageSmoothingEnabled=!1;c.webkitImageSmoothingEnabled=!1;this.items.push(a);b&&b.appendChild(a);return c},appendTo:function(b){b.appendChild(this.container)},remove:function(){this.container.parentNode.removeChild(this.container)},setSize:function(b,a){for(var c=0,d=this.items.length;c<d;c++)this.items[c].width=b,this.items[c].height=a},screenshot:function(){var b=ia.createElement("CANVAS"),a=b.getContext("2d"),c,d,f;b.width=D;b.height=B;clearInterval(M);M=null;f=C.items;
c=0;for(d=f.length;c<d;c++)f[c].scale=1;this.render(!0);c=0;for(d=this.items.length;c<d;c++)f=this.items[c],""!==f.style.opacity&&(a.globalAlpha=parseFloat(f.style.opacity)),a.drawImage(f,0,0),a.globalAlpha=1;return b.toDataURL("image/png")},setPosition:function(b,a){this.container.style.left=b+"px";this.container.style.top=a+"px"}};x.init();v=function(b){this.offset={x:0,y:0};b.addLayer(this)};r=v.prototype=L.Layer?new L.Layer:{};r.onAdd=function(b){this.map=b;x.appendTo(b._panes.overlayPane);var a=
this.getOffset(),c=b.getPixelOrigin();ma({width:b._size.x,height:b._size.y});var d=c.y-a.y;q=c.x-a.x;n=d;na(b._zoom);x.setPosition(-a.x,-a.y);b.on({move:this.onMove,moveend:this.onMoveEnd,zoomstart:this.onZoomStart,zoomend:this.onZoomEnd,resize:this.onResize,viewreset:this.onViewReset,click:this.onClick},this);if(b.options.zoomAnimation)b.on("zoomanim",this.onZoom,this);b.attributionControl&&b.attributionControl.addAttribution('© <a href="http://osmbuildings.org">OSM Buildings</a>');C.update()};
r.onRemove=function(){var b=this.map;b.attributionControl&&b.attributionControl.removeAttribution('© <a href="http://osmbuildings.org">OSM Buildings</a>');b.off({move:this.onMove,moveend:this.onMoveEnd,zoomstart:this.onZoomStart,zoomend:this.onZoomEnd,resize:this.onResize,viewreset:this.onViewReset,click:this.onClick},this);b.options.zoomAnimation&&b.off("zoomanim",this.onZoom,this);x.remove()};r.onMove=function(b){b=this.getOffset();ea({x:this.offset.x-b.x,y:this.offset.y-b.y})};r.onMoveEnd=
function(b){if(this.noMoveEnd)this.noMoveEnd=!1;else{var a=this.map;b=this.getOffset();var c=a.getPixelOrigin();this.offset=b;x.setPosition(-b.x,-b.y);ea({x:0,y:0});ma({width:a._size.x,height:a._size.y});a=c.y-b.y;q=c.x-b.x;n=a;x.render();C.update()}};r.onZoomStart=function(b){R=!0;x.render()};r.onZoom=function(b){};r.onZoomEnd=function(b){b=this.map;var a=this.getOffset(),c=b.getPixelOrigin(),d=c.y-a.y;q=c.x-a.x;n=d;b=b._zoom;R=!1;na(b);C.update();x.render();this.noMoveEnd=!0};r.onResize=function(){};
r.onViewReset=function(){var b=this.getOffset();this.offset=b;x.setPosition(-b.x,-b.y);ea({x:0,y:0})};r.onClick=function(b){var a=Z.getIdFromXY(b.containerPoint.x,b.containerPoint.y);a&&va({feature:a,lat:b.latlng.lat,lon:b.latlng.lng})};r.getOffset=function(){return L.DomUtil.getPosition(this.map._mapPane)};r.style=function(b){b=b||{};var a;if(a=b.color||b.wallColor)H=I.parse(a),ha=""+H.alpha(E),ca=H.lightness(0.8),ba=""+ca.alpha(E),P=H.lightness(1.2),Y=""+P.alpha(E);b.roofColor&&(P=I.parse(b.roofColor),
Y=""+P.alpha(E));void 0!==b.shadows&&(A.enabled=!!b.shadows);x.render();return this};r.date=function(b){A.date=b;A.render();return this};r.load=function(b){C.load(b);return this};r.set=function(b){C.set(b);return this};r.screenshot=function(b){var a=x.screenshot();b&&(aa.location.href=a.replace("image/png","image/octet-stream"));return a};var ua=function(){};r.each=function(b){ua=function(a){return b(a)};return this};var va=function(){};r.click=function(b){va=function(a){return b(a)};return this};
r.getDetails=function(b,a){C.provider&&C.provider.getFeature(b,a);return this};v.VERSION="0.2.2b";v.ATTRIBUTION='© <a href="http://osmbuildings.org">OSM Buildings</a>';aa.OSMBuildings=v})(this);