leaflet.mousecoordinate
Version:
A Coordinate Mouse Viewer for Leaflet
2 lines • 6.65 kB
JavaScript
/*! leaflet.mousecoordinate 2016-09-09 Copyright by */
L.Control.mouseCoordinate=L.Control.extend({options:{gps:!0,utm:!1,utmref:!1,position:"bottomright",_sm_a:6378137,_sm_b:6356752.314,_sm_EccSquared:.00669437999013,_UTMScaleFactor:.9996},onAdd:function(a){if(this._map=a,L.Browser.touch||L.Browser.msTouch)return L.DomUtil.create("div");var b="leaflet-control-mouseCoordinate",c=this._container=L.DomUtil.create("div",b);return this._gpsPositionContainer=L.DomUtil.create("div","gpsPos",c),a.on("mousemove",this._update,this),c},_update:function(a){var b=Math.round(1e5*a.latlng.lat)/1e5,c=Math.round(1e5*a.latlng.lng)/1e5,d={lat:b,lng:c},e="<table>";if(this.options.gps){e+="<tr><td>GPS</td><td>"+b+"</td><td> "+c+"</td></tr>";var f=this._geo2geodeziminuten(d);e+="<tr><td></td><td class='coords'>"+f.NS+" "+f.latgrad+"° "+f.latminuten+"</td><td class='coords'> "+f.WE+" "+f.lnggrad+"° "+f.latminuten+"</td></tr>";var g=this._geo2gradminutensekunden(d);e+="<tr><td></td><td>"+g.NS+" "+g.latgrad+"° "+g.latminuten+"′ "+g.latsekunden+"″</td><td> "+g.WE+" "+g.lnggrad+"° "+g.latminuten+"′ "+g.lngsekunden+"″</td></tr>"}if(this.options.utm){var h=UTM.fromLatLng(d);e+="<tr><td>UTM</td><td colspan='2'>"+h.zone+" "+h.x+" "+h.y+"</td></tr>"}if(this.options.utmref){var i=UTMREF.fromUTM(UTM.fromLatLng(d));e+="<tr><td>UTM REF</td><td colspan='2'>"+i.zone+" "+i.band+" "+i.x+" "+i.y+"</td></tr>"}if(this.options.qth){var j=QTH.fromLatLng(d);e+="<tr><td>QTH</td><td colspan='2'>"+j+"</td></tr>"}if(this.options.nac){var k=NAC.fromLatLng(d);e+="<tr><td>NAC</td><td colspan='2'>"+k.y+" "+k.x+"</td></tr>"}e+="</table>",this._gpsPositionContainer.innerHTML=e},_geo2geodeziminuten:function(a){var b=parseInt(a.lat),c=Math.round(60*(a.lat-b)*1e4)/1e4,d=parseInt(a.lng),e=Math.round(60*(a.lng-d)*1e4)/1e4;return this._AddNSEW({latgrad:b,latminuten:c,lnggrad:d,lngminuten:e})},_geo2gradminutensekunden:function(a){var b=parseInt(a.lat),c=60*(a.lat-b),d=Math.round(60*(c-parseInt(c))*100)/100;c=parseInt(c);var e=parseInt(a.lng),f=60*(a.lng-e),g=Math.round(60*(f-parseInt(f))*100)/100;return f=parseInt(f),this._AddNSEW({latgrad:b,latminuten:c,latsekunden:d,lnggrad:e,lngminuten:f,lngsekunden:g})},_AddNSEW:function(a){return a.NS="N",a.WE="E",a.latgrad<0&&(a.latgrad=a.latgrad*-1,a.NS="S"),a.lnggrad<0&&(a.lnggrad=a.lnggrad*-1,a.EW="W"),a}}),L.control.mouseCoordinate=function(a){return new L.Control.mouseCoordinate(a)};var NAC={fromLatLng:function(a){var b=a.lat,c=a.lng,d=[],e=[],f=[];if(f.x="",f.y="",c>=-180&&c<=180){var g=(c+180)/360;d[0]=parseInt(30*g),d[1]=parseInt(30*(30*g-d[0])),d[2]=parseInt(30*(30*(30*g-d[0])-d[1])),d[3]=parseInt(30*(30*(30*(30*g-d[0])-d[1])-d[2])),d[4]=parseInt(30*(30*(30*(30*(30*g-d[0])-d[1])-d[2])-d[3])),d[5]=parseInt(30*(30*(30*(30*(30*(30*g-d[0])-d[1])-d[2])-d[3])-d[4]))}else d[0]=0;if(b>=-90&&b<=90){var h=(b+90)/180;e[0]=parseInt(30*h),e[1]=parseInt(30*(30*h-e[0])),e[2]=parseInt(30*(30*(30*h-e[0])-e[1])),e[3]=parseInt(30*(30*(30*(30*h-e[0])-e[1])-e[2])),e[4]=parseInt(30*(30*(30*(30*(30*h-e[0])-e[1])-e[2])-e[3])),e[5]=parseInt(30*(30*(30*(30*(30*(30*h-e[0])-e[1])-e[2])-e[3])-e[4]))}else e[0]=0;for(var i=0;i<d.length;i++)f.x+=this._nac2Letter(d[i]);for(i=0;i<e.length;i++)f.y+=this._nac2Letter(e[i]);return f},_nac2Letter:function(a){var b="0123456789BCDFGHJKLMNPQRSTVWXZ";return!isNaN(a)&&a<30?b.substr(a,1):0}},QTH={fromLatLng:function(a){var b,c,d,e,f,g,h="ABCDEFGHIJKLMNOPQRSTUVWXYZ",i="0123456789",j=0,k=[0,0,0],l=[0,0,0,0,0,0,0];for(k[1]=a.lng+180,k[2]=a.lat+90,c=1;c<3;++c)for(d=1;d<4;++d)3!=d?(1==c&&(1==d&&(e=20),2==d&&(e=2)),2==c&&(1==d&&(e=10),2==d&&(e=1)),f=k[c]/e,k[c]=f,g=k[c]>0?Math.floor(f):Math.ceil(f),k[c]=(k[c]-g)*e):(e=1==c?12:24,f=k[c]*e,k[c]=f,g=k[c]>0?Math.floor(f):Math.ceil(f)),++j,l[j]=g;return b=h.charAt(l[1])+h.charAt(l[4])+i.charAt(l[2]),b+=i.charAt(l[5])+h.charAt(l[3])+h.charAt(l[6])}},UTM={fromLatLng:function(a){var b=a.lng,c=a.lat;if(!(b<=-180||b>180||c<=-80||c>=84)){b=parseFloat(b),c=parseFloat(c);var d=6378137,e=.00335281068,f=Math.PI,g="CDEFGHJKLMNPQRSTUVWXX",h=d/(1-e),i=(2*e-e*e)/((1-e)*(1-e)),j=i*i,k=j*i,l=j*j,m=h*(f/180)*(1-3*i/4+45*j/64-175*k/256+11025*l/16384),n=h*(-3*i/8+15*j/32-525*k/1024+2205*l/4096),o=h*(15*j/256-105*k/1024+2205*l/16384),p=h*(-35*k/3072+315*l/12288),q=parseInt((b+180)/6)+1,r=q;q<10&&(r="0"+q);var s,t=parseInt(1+(c+80)/8),u=g.substr(t-1,1),v=c*f/180,w=Math.tan(v),x=w*w,y=x*x,z=Math.cos(v),A=z*z,B=A*A,C=A*z,D=B*z,E=i*A,F=h/Math.sqrt(1+E),G=m*c+n*Math.sin(2*v)+o*Math.sin(4*v)+p*Math.sin(6*v),H=6*(q-30)-3,I=(b-H)*f/180,J=I*I,K=J*J,L=J*I,M=K*I;s=c<0?1e7+.9996*(G+F*A*w*J/2+F*B*w*(5-x+9*E)*K/24):.9996*(G+F*A*w*J/2+F*B*w*(5-x+9*E)*K/24);var N=.9996*(F*z*I+F*C*(1-x+E)*L/6+F*D*(5-18*x+y)*M/120)+5e5,O=r+u,P=s-parseInt(s);for(s=P<.5?""+parseInt(s):""+(parseInt(s)+1);s.length<7;)s="0"+s;return P=N-parseInt(N),N=P<.5?"0"+parseInt(N):"0"+parseInt(N+1),{zone:O,x:N,y:s}}},toLatLng:function(a){var b=a.zone,c=a.x,d=a.y;if(""===b||""===c||""===d)return b="",c="",void(d="");var e=b.substr(2,1);b=parseFloat(b),c=parseFloat(c),d=parseFloat(d);var f,g=6378137,h=.00335281068,i=Math.PI,j=g/(1-h),k=(2*h-h*h)/((1-h)*(1-h)),l=k*k,m=l*k,n=l*l,o=j*(i/180)*(1-3*k/4+45*l/64-175*m/256+11025*n/16384),p=180/i*(3*k/8-3*l/16+213*m/2048-255*n/4096),q=180/i*(21*l/256-21*m/256+533*n/8192),r=180/i*(151*m/6144-453*n/12288);f=e>="N"||""===e?d:d-1e7;var s=f/.9996/o,t=s*i/180,u=s+p*Math.sin(2*t)+q*Math.sin(4*t)+r*Math.sin(6*t),v=u*i/180,w=Math.tan(v),x=w*w,y=x*x,z=Math.cos(v),A=z*z,B=k*A,C=j/Math.sqrt(1+B),D=C*C,E=D*D,F=E*D,G=D*C,H=E*C,I=6*(b-30)-3,J=(c-5e5)/.9996,K=J*J,L=K*K,M=K*J,N=M*K,O=M*M,P=-w*(1+B)/(2*D),Q=w*(5+3*x+6*B*(1-x))/(24*E),R=-w*(61+90*x+45*y)/(720*F),S=1/(C*z),T=-(1+2*x+B)/(6*G*z),U=(5+28*x+24*y)/(120*H*z),V=u+180/i*(P*K+Q*L+R*O),W=I+180/i*(S*J+T*M+U*N);return{lat:V,lng:W}}},UTMREF={fromUTM:function(a){var b=a.zone,c=a.x,d=a.y,e=b.substr(0,2),f=b.substr(2,1),g=parseInt(c.substr(0,2)),h=parseInt(d.substr(0,2)),i=c.substr(2,5),j=d.substr(2,5),k="ABCDEFGHJKLMNPQRSTUVWXYZ",l="ABCDEFGHJKLMNPQRSTUV";(e<"01"||e>"60"||f<"C"||f>"X")&&alert(e+f+" ist keine gueltige UTM Zonenangabe");var m,n=e%3;1===n&&(m=g-1),2===n&&(m=g+7),0===n&&(m=g+15),n=e%2;var o;for(o=1===n?0:5,n=h;n-20>=0;)n-=20;o+=n,o>19&&(o-=20);var p=k.charAt(m)+l.charAt(o);return{zone:b,band:p,x:i,y:j}},toUTM:function(a){var b,c="STUVWXYZ",d="ABCDEFGH",e="JKLMNPQR",f=a.zone,g=a.band.substr(0,1),h=(a.band.substr(1,1),parseInt(f.substr(0,2))%3);0===h&&(b=c.indexOf(g)+1),1===h&&(b=d.indexOf(g)+1),2===h&&(b=e.indexOf(g)+1);var i,j="0"+b,k=this._mgr2utm_find_m_cn(f);return i=1===k.length?"0"+k:""+k,{zone:f,x:j,y:i}}};