/** * @file map.js * @version 20170906 ms * @use internet.js, mapmath.js, win.js * * KIG-Kartenmodul */ /// @var KUrl var KUrl="https://www.kig.gmbh/libs/"; /** * @class KMap * @constructor * @param o * @param opts */ var KMap=function(o,opts){ var m=this; if(typeof opts=="undefined") opts={}; m.opts=opts; m.untiled;m.untiledimg=null; m.cmenu=[];m.cmenuo=null; m.cursor=""; m.expanse=null; m.xmin=0;m.ymin=0;m.xmax=0;m.ymax=0; m.lx=0;m.ly=0; m.mapw=0;m.maph=0; m.unon=false; m.tiles=[]; m.History=[]; m.labels=[]; m.ButtonsLeft=[]; m.ButtonsRight=[]; m.MouseIn=false; m.mx=0;m.my=0; m.ex=0;m.ey=0;m.eb=0; m.timerID=0; m.LinkO=null;m.LinkClickable=false;m.Immediately=false; m.MouseKey=0; m.Rectangling=false;m.Dragging=false;m.Zooming=false; m.StartX=0;m.StartY=0; m.Version=Math.floor((Math.random()*9999999)); m.tmrMap; m.ReqID=0; m.o=o; var st=o.style;st.backgroundColor="transparent";st.userSelect="none";st.MozUserSelect="none";st.webkitUserSelect="none";st.msUserSelect="none"; m.mapback=document.createElement("div"); st=m.mapback.style;st.position="absolute";st.left=st.top="0";st.zIndex="1";st.overflow="hidden";st.backgroundColor="#F4F5F6"; o.appendChild(m.mapback); m.untiled=document.createElement("div"); st=m.untiled.style;st.position="absolute";st.overflow="hidden";st.display="none"; m.mapback.appendChild(m.untiled); m.untiledimg=document.createElement("img"); m.untiledimg.style.position="absolute"; m.untiled.appendChild(m.untiledimg); /// addDOMEvent img.onload m.untiledimg.onload=function(){m.untiled.style.backgroundColor="white";m.untiled.style.display=""}; m.rect=document.createElement("div"); st=m.rect.style;st.position="absolute";st.zIndex="1007";st.display="none"; o.appendChild(m.rect); m.mapal=document.createElement("div"); st=m.mapal.style;st.position="absolute";st.left=st.top="0";st.zIndex="1009";st.overflow="hidden";st.backgroundColor="#000000";st.opacity=0;st.cursor=m.cursor; o.appendChild(m.mapal); /// addDOMEvent div.wheel m.mapal.addEventListener('wheel',function(e){m.MouseWheel(e)}); if("ontouchstart" in m.mapal){ m.mapal.addEventListener("touchstart",function(e){m.TouchStart(e)}); // necessary to activate touch events for all document elements /// addEvent touchmove = this.TouchMove(e) m.mapal.addEventListener("touchmove",function(e){m.TouchMove(e)}); /// addEvent touched = this.TouchEnd(e) m.mapal.addEventListener("touchend",function(e){m.TouchEnd(e)}); } m.mapal.addEventListener("mousemove",function(e){m.MouseMove(e)}); m.mapal.addEventListener("mousedown",function(e){m.MouseDown(e)}); m.mapal.addEventListener("mouseup",function(e){m.MouseUp(e)}); m.mapal.addEventListener("dblclick",function(e){m.MouseDbl()}); m.mapal.addEventListener("mouseout",function(e){m.MouseOut()}); m.mapal.addEventListener("contextmenu",function(e){e.preventDefault()}); m.mapal.addEventListener("dragenter",function(e){e.preventDefault();e.dataTransfer.dropEffect="none";m.DragEnter(e)}); m.mapal.addEventListener("dragover",function(e){e.preventDefault()}); m.mapal.addEventListener("drop",function(e){e.preventDefault();m.Drop(e)}); document.addEventListener("keydown",function(e){if(m.MouseIn) m.KeyDown(e)}); /// @var {HTMLElement::div} this.impr m.impr=document.createElement("div"); st=m.impr.style;st.position="absolute";st.top="8px";st.zIndex="1009";st.fontSize="9px";st.cursor="pointer"; m.o.appendChild(m.impr); /// @var {HTMLElement::div} this.copyr m.copyr=document.createElement("div"); st=m.copyr.style;st.position="absolute";st.zIndex="1009";st.fontSize="9px";st.color="#73808D";st.whiteSpace="nowrap"; o.appendChild(m.copyr); /// @var {HTMLElement::div} this.ButtonsLeftO m.ButtonsLeftO=document.createElement("div"); st=m.ButtonsLeftO.style;st.position="absolute";st.zIndex="1011"; o.appendChild(m.ButtonsLeftO); /// @var {HTMLElement::div} this.ButtonsRightO m.ButtonsRightO=document.createElement("div"); st=m.ButtonsRightO.style;st.position="absolute";st.zIndex="1011"; o.appendChild(m.ButtonsRightO); if(opts.expanse){ m.expanse={xmin:opts.expanse[0],ymin:opts.expanse[1],xmax:opts.expanse[2],ymax:opts.expanse[3]}; m.ButtonsLeftAdd("zoomall",KMap.ImgZoomAll,"ZoomAll",function(){m.ZoomAll()}); } m.ButtonsLeftAdd("zoomin",KMap.ImgZoomIn,"ZoomIn",function(){m.ZoomIn()}); m.ButtonsLeftAdd("zoomout",KMap.ImgZoomOut,"ZoomOut",function(){m.ZoomOut()}); m.ButtonsLeftAdd("zoomback",KMap.ImgZoomBack,"ZoomBack",function(){m.ZoomBack()}); // TODO (map.js) Geolocation: erweitert um Karten-Button ZoomPos => an Maik senden if(opts.geolocation) { var buttonObj; buttonObj = m.ButtonsLeftAdd("zoompos",KMap.ImgZoomPos,"ZoomPos",function(){m.ZoomPos(buttonObj)}); } m.ButtonsLeftAddGap(); if(opts.search){ m.ButtonsLeftAdd("find",KMap.ImgSearch,"Search",function(c){m.FindShow(c)},true,false); m.ButtonsLeftAddGap(); } if(opts.measure) m.ButtonsLeftAdd("measure",KMap.ImgMeasure,"Measure",function(c){if(c) m.MeasShow();else m.EdgebarClose()},true,false); if(opts.printout){ m.ButtonsLeftAdd("printout",KMap.ImgPrint,"Printout",function(){m.PrintDlgShow()}); if(!m.win) m.win=new KWin(); } if(opts.weblink) m.ButtonsLeftAdd("weblink",KMap.ImgLink,"WebLink",function(){m.WebLink()}); if(opts.printout || opts.weblink) m.ButtonsLeftAddGap(); m.SetBasemap(m.Basemap); if(!opts.hideLayers){ m.ButtonsRightAdd("map",KMap.ImgLayers,"Basemap",function(c){m.LyShow(c)},true,false,"sidebar"); var d=document.createElement("div");var st=d.style;st.position="absolute";st.width=st.height="0";st.overflow="hidden";document.body.appendChild(d); m.LyFileInput=document.createElement("input");m.LyFileInput.type="file";m.LyFileInput.multiple=true;d.appendChild(m.LyFileInput); m.LyFileInput.onchange=function(){m.LyImportFiles(this.files)}; if(!m.win) m.win=new KWin(); } m.DigiCanvas=document.createElement("canvas"); var st=m.DigiCanvas.style;st.position="absolute";st.left="0";st.top="0";st.zIndex="1008"; m.mapback.appendChild(m.DigiCanvas); m.DigiCtx=m.DigiCanvas.getContext("2d"); m.DigiCtx.lineJoin="round"; var d=document.createElement("div");var st=d.style;st.position="absolute";st.width=st.height="0";st.overflow="hidden";document.body.appendChild(d); m.DigiFileInput=document.createElement("input");m.DigiFileInput.type="file";d.appendChild(m.DigiFileInput); m.Measuring=0; m.MeasType=0; m.MeasShowXY=false; m.MeasLine=[[0,0]]; m.AfterConstruct(); // TODO (map.js) das Laden der custom basemaps und layers auskommentiert, weil jetzt in userRecord.settings // var l=localStorage.getItem(m.localStorageNamespace+"kigmapBasemaps"); // if(l){l=JSON.parse(l);for(var a=0;a0.000000001); return [Math.atan(Pt[1]/Pt[0]),f,Math.sqrt(Pt[0]*Pt[0]+Pt[1]*Pt[1])/Math.cos(f1)-a/Math.sqrt(1-eq*Math.sin(f1)*Math.sin(f1))]; } KMap.neuF=function(f,x,y,p,a,eq){ var zw=a/Math.sqrt(1-eq*Math.sin(f)*Math.sin(f)); var nnq=1-eq*zw/(Math.sqrt(x*x+y*y)/Math.cos(f)); return Math.atan(p/nnq); } KMap.Merc2LL=function(x,y,Prj){ var eq=(Prj.ella*Prj.ella-Prj.ellb*Prj.ellb)/(Prj.ellb*Prj.ellb); var ellc=(Prj.ella*Prj.ella)/Prj.ellb*(1-3*eq/4+45/64*eq*eq-175/256*eq*eq*eq+11025/16384*eq*eq*eq*eq); var lon=Prj.lon0*Math.PI/180+(x-Prj.x0)/ellc/Prj.sc; var lat=((y-Prj.y0)/Prj.sc+Prj.northing0)/ellc; lat=(Math.pow(Math.E,lat)-Math.pow(Math.E,-lat))/2; lat=Math.atan(lat); return [lon,lat]; } KMap.UTM2LL=function(x,y,Prj){ var zone=Prj.zone; if(Prj.autozone) zone=Math.floor((x-Prj.x0+500000)/1000000); var eq=(Prj.ella*Prj.ella-Prj.ellb*Prj.ellb)/(Prj.ellb*Prj.ellb); var ellc=(Prj.ella*Prj.ella)/Prj.ellb*(1-3*eq/4+45/64*eq*eq-175/256*eq*eq*eq+11025/16384*eq*eq*eq*eq); var d2=(x-Prj.x0-zone*1000000)/Prj.sc; var d3=((y-Prj.y0)/Prj.sc+Prj.northing0)/ellc; var d9=(Prj.ella-Prj.ellb)/(Prj.ella+Prj.ellb); var d13=d3+(((3*d9)/2-(27*d9*d9*d9)/32)*Math.sin(2*d3)+(21*d9*d9*Math.sin(4*d3))/16+1*d9*d9*d9*Math.sin(6*d3)); var d4=Math.cos(d13); var d5=Math.tan(d13); var d7=1+eq*d4*d4; var d8=Math.sqrt(d7); var d18=(Prj.ella*Prj.ella)/(Prj.ellb*d8); var d11=eq*d4*d4; var d15=(-d5/(2*d18*d18))*(1+d11); var d16=(d5/(24*d18*d18*d18*d18))*(5+3*d5*d5+6*d11*(1-d5*d5)); var d17=(-d5/(720*d18*d18*d18*d18*d18*d18))*(61+90*d5*d5+45*d5*d5*d5*d5); var lat=d13+d15*d2*d2+d16*d2*d2*d2*d2+d17*d2*d2*d2*d2*d2*d2; var d20=1/(d18*d4); var d21=(-1/(6*d18*d18*d18*d4))*(1+2*d5*d5+d11); var d22=(1/(120*d18*d18*d18*d18*d18*d4))*(5+28*d5*d5+24*d5*d5*d5*d5); var lon=(Prj.lon0+zone*Prj.zonewidth)*Math.PI/180+d20*d2+d21*d2*d2*d2+d22*d2*d2*d2*d2*d2; return [lon,lat]; } KMap.Lambert2LL=function(x,y,Prj){ var lat0=Prj.lat0*Math.PI/180;var lat1=Prj.lat1*Math.PI/180;var lat2=Prj.lat2*Math.PI/180; x-=Prj.x0;y-=Prj.y0; var eq=(Prj.ella*Prj.ella-Prj.ellb*Prj.ellb)/(Prj.ella*Prj.ella); var e=Math.sqrt(eq); var m1=Math.cos(lat1)/Math.sqrt(1-eq*Math.sin(lat1)*Math.sin(lat1)); var m2=Math.cos(lat2)/Math.sqrt(1-eq*Math.sin(lat2)*Math.sin(lat2)); var aux1=Math.sqrt((1-e*Math.sin(lat1))/(1+e*Math.sin(lat1))); var aux2=Math.sqrt((1-e*Math.sin(lat2))/(1+e*Math.sin(lat2))); var aux0=Math.sqrt((1-e*Math.sin(lat0))/(1+e*Math.sin(lat0))); var t1=((1-Math.tan(lat1/2))/(1+Math.tan(lat1/2)))/Math.pow(aux1,e); var t2=((1-Math.tan(lat2/2))/(1+Math.tan(lat2/2)))/Math.pow(aux2,e); var t0=((1-Math.tan(lat0/2))/(1+Math.tan(lat0/2)))/Math.pow(aux0,e); if(lat1== lat2) var n=Math.sin(lat1); else var n=(Math.log(m1)-Math.log(m2))/(Math.log(t1)-Math.log(t2)); var efe=m1/(n*Math.pow(t1,n)); var ro0=Prj.ella*efe*Math.pow(t0,n); var sinal=(n/Math.abs(n)); var ro=Math.sqrt(x*x+(ro0-y)*(ro0-y)); ro*=sinal; var teta=Math.atan(x/(ro0-y)); var t=Math.pow(ro/(Prj.ella*efe),1/n); var XX=Math.PI/2-2*Math.atan(t); var aux3=eq/2+5*eq*eq/24+eq*eq*eq/12; var aux4=7*eq*eq/48+29*eq*eq*eq/240; var aux5=(7*eq*eq*eq/120)*Math.sin(12*Math.atan(t)); var lon=teta/n+Prj.lon0*Math.PI/180; var lat=XX+aux3*Math.sin(4*Math.atan(t))-aux4*Math.sin(8*Math.atan(t))+aux5; return [lon,lat]; } KMap.LL2Lambert=function(lon,lat,Prj){ var lat0=Prj.lat0*Math.PI/180;var lat1=Prj.lat1*Math.PI/180;var lat2=Prj.lat2*Math.PI/180; var eq=(Prj.ella*Prj.ella-Prj.ellb*Prj.ellb)/(Prj.ella*Prj.ella); var e=Math.sqrt(eq); var m1=Math.cos(lat1)/Math.sqrt(1-eq*Math.pow(Math.sin(lat1),2)); var m2=Math.cos(lat2)/Math.sqrt(1-eq*Math.pow(Math.sin(lat2),2)); var aux1=Math.sqrt((1-e*Math.sin(lat1))/(1+e*Math.sin(lat1))); var aux2=Math.sqrt((1-e*Math.sin(lat2))/(1+e*Math.sin(lat2))); var aux0=Math.sqrt((1-e*Math.sin(lat0))/(1+e*Math.sin(lat0))); var t1=((1-Math.tan(lat1/2))/(1+Math.tan(lat1/2)))/Math.pow(aux1,e); var t2=((1-Math.tan(lat2/2))/(1+Math.tan(lat2/2)))/Math.pow(aux2,e); var t0=((1-Math.tan(lat0/2))/(1+Math.tan(lat0/2)))/Math.pow(aux0,e); if(lat1==lat2) var n=Math.sin(lat1); else var n=(Math.log(m1)-Math.log(m2))/(Math.log(t1)-Math.log(t2)); var efe=m1/(n*Math.pow(t1,n)); var ro0=Prj.ella*efe*Math.pow(t0,n); var aux=Math.sqrt((1-e*Math.sin(lat))/(1+e*Math.sin(lat))); var t=((1-Math.tan(lat/2))/(1+Math.tan(lat/2)))/Math.pow(aux,e); var ro=Prj.ella*efe*Math.pow(t,n); var teta=n*(lon-Prj.lon0*Math.PI/180); var x=ro*Math.sin(teta)+Prj.x0; var y=ro0-ro*Math.cos(teta)+Prj.y0; return [x,y]; } // --- MapModule Functions --- /// @vars {?} Prj, zoomlevels, x,y, mpp KMap.prototype.Prj=KMap.Prj.EPSG3857; KMap.prototype.zoomlevels=[0.298582,0.597164,1.194329,2.388657,4.777314,9.554629,19.109257,38.218514,76.437028,152.874057,305.748113,611.496226,1222.992453,2445.984905]; KMap.prototype.x=1470000; KMap.prototype.y=7100000; KMap.prototype.mpp=152.874057; /// @vars mapl,mapt,mapr,mapb KMap.prototype.mapl=0; KMap.prototype.mapt=0; KMap.prototype.mapr=0; KMap.prototype.mapb=0; /// @vars MapTipImageSize, MapTipBgColor, MapTipHooverColor, MapTipImgSrc KMap.prototype.MapTipImageSize=144; KMap.prototype.MapTipBgColor="#FEF4CB"; KMap.prototype.MapTipHooverColor="#FFA155"; KMap.prototype.MaptipColor="black"; KMap.prototype.MapTipImgSrc={}; /// @vars {string::color} FontSize, {string::color} FontSizeBig, {string::color} FontWeightBig, {string::color} TitleBarTextColor KMap.prototype.FontSize=""; KMap.prototype.FontSizeBig="120%"; KMap.prototype.FontWeightBig="bold"; KMap.prototype.TitleBarTextColor="#000000"; /// @var {array} DefaultPrintoutBasemap KMap.prototype.DefaultPrintoutBasemap={ url:"https://www.kig.gmbh/osm-wms/?Dither=true&FORMAT=image/png;mode=24bit", copyright:"© OSM contributors (ODbL 1.0)", copyrightlong:"© OpenStreetMap contributors (ODbL 1.0)", opacity:75 } /// @var {array} Basemaps KMap.prototype.Basemaps=[{ token:"OSM", caption:"OpenStreetMap", type:"tiles", scmin:1000, //url:"http://c.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png", url:"https://c.tile.openstreetmap.org/{z}/{x}/{y}.png", copyright:"© OSM contributors (ODbL 1.0)", copyright_link:"http://www.openstreetmap.org/copyright", opacity:85, tilesize:256, yshift:0, size:1, printout:KMap.prototype.DefaultPrintoutBasemap } /*,{ token:"DOP", caption:"Sat", type:"tiles", scmin:30000, url:"http://maps.kulturlandschaft-informatik.de/sat/{z}/{x}/{y}.jpg", copyright:"NASA/KIG", opacity:100, tilesize:256, drawlabels:1, printout:KMap.prototype.DefaultPrintoutBasemap }*/ ]; /// @var Basemap KMap.prototype.Basemap=KMap.prototype.Basemaps[0]; /// @var {array} Layers KMap.prototype.Layers=[]; /* KMap.CoorTrans=function(Pt,Prj1,Prj2){ if(Prj1==Prj2) return Pt; if(Prj1==KMap.Prj.EPSG4326) return [Pt[0]*20037508.34/180,Math.log(Math.tan((90+Pt[1])*Math.PI/360))/(Math.PI/180)*20037508.34/180]; else return [Pt[0]/20037508.34*180,180/Math.PI*(2*Math.atan(Math.exp(Pt[1]/20037508.34*Math.PI))-Math.PI/2)]; }; */ /** * @fn ProjectExtent( e, Prj1, Prj2 ) */ KMap.ProjectExtent=function(e,Prj1,Prj2){ p1=KMap.CoorTrans([e[0],e[1]],Prj1,Prj2); p2=KMap.CoorTrans([e[0],e[3]],Prj1,Prj2); p3=KMap.CoorTrans([e[2],e[3]],Prj1,Prj2); p4=KMap.CoorTrans([e[2],e[1]],Prj1,Prj2); var xmin=Math.min(p1[0],p2[0]); var ymin=Math.min(p1[1],p4[1]); var xmax=Math.max(p3[0],p4[0]); var ymax=Math.max(p2[1],p3[1]); return [xmin,ymin,xmax,ymax]; }; /** * @fn Hash(s) * @memberof KMap * @param {string} s * @return {int} */ KMap.Hash=function(s){ var h=0; var f=1; for(var a=0;a999999999999){h-=999999999999;f=1;} } return h; }; /** * @fn RemoveArrayElement(A,E) * @memberof KMap * @param {array} array * @param {any} item */ KMap.RemoveArrayElement=function(array,item){ out=[]; for(var i=0;i-1){ var n="";var f=root.attributes; for(var a=0;a-1?ev.createNSResolver(root):null; var iterator=ev.evaluate(path,node,ns,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null); var n,nodes=[];while(n=iterator.iterateNext()) nodes.push(n); return nodes; } }; /** * @fn ExtentsOverlap * @memberof KMap * @param {object} e1 * @param {object} e2 * @return {bool} */ KMap.ExtentsOverlap=function(e1,e2){ return e1.xmin<=e2.xmax && e1.xmax>=e2.xmin && e1.ymin<=e2.ymax && e1.ymax>=e2.ymin; }; /** * @fn ExtentsOverlapArea * @memberof KMap * @param {object} e1 * @param {object} e2 * @return {float} overlapping area in square units */ KMap.ExtentsOverlapArea=function(e1,e2){ var dx=Math.min(e1.xmax,e2.xmax)-Math.max(e1.xmin,e2.xmin); var dy=Math.min(e1.ymax,e2.ymax)-Math.max(e1.ymin,e2.ymin); return Math.sqrt(dx*dx+dy*dy); }; /** * @fn ExtentsArea * @memberof KMap * @param {object} e * @return {float} area of extent in square units */ KMap.ExtentsArea=function(e){ var dx=e.xmax-e.xmin;var dy=e.ymax-e.ymin;return Math.sqrt(dx*dx+dy*dy); }; /** * @fn s * @memberof KMap * @param {string} resource id * @return {string} localized resource string */ KMap.prototype.s=function(id){ var r=KRes[id]; if(r && Object.keys(r).length) return r[this.Lang] || r[this.DefaultLang] || r[Object.keys(r)[0]]; else return "["+id+"]"; }; /** * @fn LangChange * @memberof KMap * @param {string:language id} l * Public method. */ KMap.prototype.LangChange=function(l){ if(this.Lang!=l){this.Lang=l;this.LangChanged()} }; /** * @fn LangChanged * @memberof KMap */ KMap.prototype.LangChanged=function(){ this.ButtonsRefresh(); this.RefreshBasemapCopyr(); }; /** * @fn Px2Geo * @memberof KMap * @param {float[2]} xy: pixel coordinates * @return {float[2]} map coordinates */ KMap.prototype.Px2Geo=function(xy){ return [this.xmin+xy[0]*this.mpp,this.ymax-xy[1]*this.mpp]; }; /** * @fn Geo2Px * @memberof KMap * @param {float[2]} xy: map coordinates * @return {float[2]} pixel coordinates */ KMap.prototype.Geo2Px=function(xy){ return [(xy[0]-this.xmin)/this.mpp,(this.ymax-xy[1])/this.mpp]; }; /** * @fn RealScaleFac * @memberof KMap * @param y * @return */ KMap.prototype.RealScaleFac=function(y){ if(this.Prj==KMap.Prj.EPSG3857){ var lat=y/6378137; lat=Math.atan((Math.pow(Math.E,lat)-Math.pow(Math.E,-lat))/2); return Math.cos(lat); }else return 1; }; KMap.prototype.RealMPP=function(){ return this.mpp*this.RealScaleFac(this.y); }; KMap.prototype.GetScale=function(){ return this.RealMPP()/0.00028; }; KMap.prototype.SetMPP=function(mpp){ this.mpp=mpp;this.RoundMPP(); this.CleanOverlays(); }; KMap.prototype.RoundMPP=function(mpp){ var out=false; if(typeof mpp=="undefined") mpp=this.mpp; else out=true; if(mpp<=this.zoomlevels[0]) mpp=this.zoomlevels[0]; else if(mpp>this.zoomlevels[this.zoomlevels.length-1]) mpp=this.zoomlevels[this.zoomlevels.length-1]; else for(var a=0;athis.zoomlevels[a] && mpp<=this.zoomlevels[a+1]) mpp=this.zoomlevels[a+1]; if(out) return mpp; else this.mpp=mpp; }; KMap.prototype.Placing=function(){ var m=this; if(m.o.clientWidth==0 || m.o.clientHeight==0) return; m.mapw=m.o.clientWidth-m.mapl-m.mapr; m.maph=m.o.clientHeight-m.mapt-m.mapb; var st=m.mapback.style;st.left=m.mapl+"px";st.top=m.mapt+"px";st.width=m.mapw+"px";st.height=m.maph+"px"; st=m.mapal.style;st.left=m.mapl+"px";st.top=m.mapt+"px";st.width=m.mapw+"px";st.height=m.maph+"px"; if(m.scalebar){m.scalebar.style.left=(m.mapl+6)+"px";m.scalebar.style.bottom=(m.mapb+6)+"px"}; m.copyr.style.left=(m.mapl+m.mapw-m.copyr.offsetWidth-10)+"px"; m.copyr.style.top=(m.mapt+m.maph-18)+"px"; m.impr.style.left=(m.mapl+m.mapw-m.impr.offsetWidth-10-(m.ButtonsRight.length ? m.ButtonSize:0))+"px"; m.impr.style.top=(m.mapt+8)+"px"; if(m.sidebar){ st=m.sidebar.style; // TODO (Maik) jetzt wird die Start- bzw. mit dem Divider eingestellte Breite verwendet: if(m.sidebarAlign=="right") st.left=(m.mapw - m.sidebarSettings[m.sidebarId].width)+"px"; else st.right=(m.mapw - m.sidebarSettings[m.sidebarId].width)+"px"; // st.left=(m.mapl+(m.sidebarAlign=="right"?m.mapw-m.sidebar.offsetWidth:0))+"px"; st.top=m.mapt+"px"; st.height=m.maph+"px"; m.sidebarContainer.style.height=(m.maph-m.sidebarTitle.offsetHeight)+"px"; } // TODO (Maik) Musste wegen Divider die Button-Left/Right-Platzierung hierher nach die Sidebar-Platzierung verschieben: st=m.ButtonsLeftO.style;st.left=(m.mapl+(m.sidebar && m.sidebarAlign=="left"? m.sidebar.offsetWidth:0))+"px";st.top=(m.mapt+m.ButtonGapSize)+"px"; st=m.ButtonsRightO.style;st.left=(m.mapl+m.mapw-m.ButtonSize-(m.sidebar && m.sidebarAlign=="right"? m.sidebar.offsetWidth:0))+"px";st.top=(m.mapt+m.ButtonGapSize)+"px"; if(m.edgebar){ st=m.edgebar.style; st.left=m.mapl+"px"; // TODO (Maik) In M-V soll die Edgebar (Geom-Editor und Mess-Funktion) nicht die KO-Anzeige verdecken: // st.top=(m.mapt+m.maph-m.edgebar.offsetHeight)+"px"; st.bottom=m.mapb+(m.scalebar?46:0)+"px"; } m.DigiCanvas.width=m.mapw; m.DigiCanvas.height=m.maph; }; KMap.prototype.Scalebar=function(){ var m=this; if(m.scalebar) m.o.removeChild(m.scalebar); m.scalebar=document.createElement("div"); var st=m.scalebar.style; st.position="absolute";st.left=(m.mapl+6)+"px";st.bottom="6px";st.padding="2px";st.zIndex="1007";st.background="rgba(255,255,255,0.7)"; m.o.appendChild(m.scalebar); if(m.opts.coordinates){ m.lblCoor=document.createElement("div");var st=m.lblCoor.style;st.fontSize=m.FontSize; m.scalebar.appendChild(m.lblCoor); m.lblCoor.onmousemove=function(){m.CoorShow()}; m.lblCoor.onmouseout=function(){m.CMenuLeave()}; } var t=document.createElement("table");m.scalebar.appendChild(t);t.style.borderSpacing="0";t.style.borderCollapse="collapse"; var r=m.RealMPP(); var w=String(Math.floor(160*r)); var v=w.substr(0,1); switch(v){case "6":case "7":case "8":case "9":v="5";} w=parseInt(v+Array(w.length).join("0")); var tr=t.insertRow(); var td=tr.insertCell();td.style.padding="0";td.style.width=(w/r)+"px";td.style.height="6px";td.style.fontSize="1pt";td.style.borderBottom="2px solid #333333";td.style.borderLeft="2px solid #333333";td.style.borderRight="2px solid #333333"; td=tr.insertCell();td.rowSpan="2";td.style.padding="0";td.style.paddingLeft="4px";td.style.fontSize=m.FontSize;td.style.color="#333333";td.style.verticalAlign="middle"; if(String(w).substr(String(w).length-3,3)=="000") td.innerHTML=(w/1000)+" km"; else td.innerHTML=w+" m"; tr=t.insertRow(); td=tr.insertCell();td.style.padding="0";td.style.width=(w/r)+"px";td.style.height="6px";td.style.fontSize="1pt";td.style.borderLeft="2px solid #333333";td.style.borderRight="2px solid #333333"; m.scalebar.style.bottom=(m.mapb+6)+"px"; }; KMap.prototype.CoorUpdate=function(e){ var m=this; if(!m.lblCoor) return; var pt=[m.xmin+m.ex*m.mpp,m.ymax-m.ey*m.mpp]; pt=KMap.CoorTrans(pt,m.Prj,m.PrjEx); if(m.PrjEx.proj=="none"){pt[0]=pt[0].toFixed(5);pt[1]=pt[1].toFixed(5);}else{pt[0]=pt[0].toFixed(0);pt[1]=pt[1].toFixed(0);} m.lblCoor.innerHTML=pt[0]+";"+pt[1]; if(e){ var r=m.lblCoor.getBoundingClientRect(); var ex=e.clientX-r.left,ey=e.clientY-r.top; if(ex>=0 && ey>=0 && ex"+v.caption+"":v.caption; tr.myPrj=v; tr.onclick=function(){ m.PrjEx=this.myPrj; m.CoorUpdate(); m.CMenuHide(); m.PrjExChanged(); }; } m.o.appendChild(m.cmenuo); m.cmenuo.onmousemove=function(){m.CMenuHold()}; m.cmenuo.onmouseout=function(){m.CMenuLeave()}; }; KMap.prototype.CleanLabels=function(){ this.labels=[];this.DrawLabels(); }; KMap.prototype.DrawLabel=function(o,x,y,t,a){ if(a){var m=document.createElement("div");o.appendChild(m);} var l=document.createElement("div"); l.innerHTML=t; l.style.position="absolute"; o.appendChild(l); l.style.left=(x-l.offsetWidth/(a?1:2))+"px"; l.style.top=(y-l.offsetHeight/(a?1:2))+"px"; if(a){var st=m.style;st.fontSize="8px";st.background="#FFFFFF";st.opacity=.7;st.position="absolute";st.left=l.offsetLeft+"px";st.top=l.offsetTop+"px";st.width=l.offsetWidth+"px";st.height=l.offsetHeight+"px"}; }; KMap.prototype.DrawLabels=function(){ if(this.labelplane) this.mapback.removeChild(this.labelplane); this.labelplane=document.createElement("div"); var st=this.labelplane.style;st.position="absolute";st.zIndex="1006";st.left=this.mapl+"px";st.top=this.mapt+"px";st.width=this.mapw+"px";st.height=this.maph+"px";st.overflow="hidden"; this.mapback.appendChild(this.labelplane); for(var a=0;a"+t[3]+"",c); } }; KMap.prototype.LoadLabels=function(){ // DEPRECATED !!! if(this.Basemap.drawlabels){ var m=this; /** @call extern URL */ KInternet.HTTPRequest(KUrl+"annos.php?MPP="+this.mpp+"&BBOX="+this.xmin+","+this.ymin+","+this.xmax+","+this.ymax,function(r){ m.labels=r.split("\n"); if(!m.Dragging) m.DrawLabels(); }); }else this.labels=[]; this.DrawLabels(); }; KMap.prototype.OverlayClean=function(sameMPP){ }; KMap.prototype.OverlayPlace=function(){ }; KMap.prototype.OverlayLoad=function(){ }; KMap.prototype.GetTile=function(layer,kx,ky,mpp){ for(var i=0;i=0;i--) if(this.tiles[i].layer==layer){var t=this.tiles[i];this.mapback.removeChild(t.d);t.d=t.b=null;this.tiles.splice(i,1)} }; KMap.prototype.ReloadTiles=function(layer){ for(var i=this.tiles.length-1;i>=0;i--) if(this.tiles[i].layer==layer) this.LoadTileDo(layer,this.tiles[i]); }; KMap.prototype.CleanTiles=function(){ for(var i=0;i0) y1-=layer.yshift*t.mpp; else y2-=layer.yshift*t.mpp; var e=KMap.ProjectExtent([t.xmin,y1,t.xmax,y2],this.Prj,layer.prj); var url=KMap.LayerUrlWithAuth(layer)+"&SERVICE=WMS&VERSION="+(layer.v ? layer.v:"1.1.1")+"&REQUEST=GetMap&"+(layer.v=="1.3.0"?"CRS":"SRS")+"="+layer.prj.crs+"&BBOX="+e.join(",")+"&WIDTH="+layer.tilesize*layer.size+"&HEIGHT="+(layer.tilesize+Math.abs(layer.yshift))*layer.size; if(url!=t.b.src){ t.b.src=KMap.dummyImg; t.b.style.opacity=layer.opacity/100; if(layer.size==1){ t.b.style.msInterpolationMode="nearest-neighbor"; if(t.b.style.setProperty) t.b.style.setProperty("image-rendering","optimizeSpeed",null); } t.b.src=url; if(t.layer.snapable) this.DigiSnapSetLoadParams(layer,t,e); // store snap-params/geoms in t(ile) } }else if(layer.drawFunc) layer.drawFunc(t); }; KMap.LayerUrlWithAuth=function(layer){ var url=layer.url; if(layer.authUser && layer.authPw){ var i=url.indexOf("://"); if(i>-1){i+=3;url=url.substr(0,i)+encodeURIComponent(layer.authUser)+":"+encodeURIComponent(layer.authPw)+"@"+url.substr(i);} } return url; }; /** * @fn LoadGTiles() */ KMap.prototype.LoadGTiles=function(){ var zs=[0.298582,0.597164,1.194329,2.388657,4.777314,9.554629,19.109257,38.218514,76.437028,152.874057,305.748113,611.496226,1222.992453,2445.984905,4891.969810,9783.939621,19567.879241,39135.758482]; var l=0;while(zs[l]<=this.mpp){var mpp=zs[l];l++};l=20-l; var e=KMap.ProjectExtent([this.xmin,this.ymin,this.xmax,this.ymax],this.Prj,KMap.Prj.EPSG4326); for(var kx=KMap.osm_long2tile(e[0],l);kx<=KMap.osm_long2tile(e[2],l);kx++) for(var ky=KMap.osm_lat2tile(e[3],l);ky<=KMap.osm_lat2tile(e[1],l);ky++) this.LoadGTile(kx,ky,mpp,l); }; /** * @fn LoadGTile(kx,ky,mpp,l) * @param kx * @param ky * @param mpp * @param l */ KMap.prototype.LoadGTile=function(kx,ky,mpp,l){ var t=this.GetTile(this.Basemap,kx,ky,mpp); if(t){ if(t.d) this.mapback.removeChild(t.d); }else{ var b=KMap.ProjectExtent([KMap.osm_tile2long(kx,l),KMap.osm_tile2lat(ky+1,l),KMap.osm_tile2long(kx+1,l),KMap.osm_tile2lat(ky,l)],KMap.Prj.EPSG4326,this.Prj); t={layer:this.Basemap,kx:kx,ky:ky,mpp:mpp,xmin:b[0],xmax:b[2],ymin:b[1],ymax:b[3]} this.tiles.push(t); } if(!t.d){ t.d=document.createElement("div"); var st=t.d.style;st.zIndex="1";st.position="absolute";st.overflow="hidden"; t.b=document.createElement("img"); if(this.Basemap.opacity<100){var m=this;t.b.onload=function(){m.TileLoaded(m.Basemap,kx,ky,t.mpp)}}; t.b.style.position="absolute";t.b.style.opacity=this.Basemap.opacity/100; t.d.appendChild(t.b); } t.b.src=KMap.LayerUrlWithAuth(this.Basemap).replace(/{z}/g,l).replace(/{x}/g,kx).replace(/{y}/g,ky); this.mapback.appendChild(t.d); }; /** * @fn osm_long2tile * @memberof KMap * @param lon * @param z * @return */ KMap.osm_long2tile=function(lon,z){return (Math.floor((lon+180)/360*Math.pow(2,z)));} /** * @fn osm_lat2tile * @memberof KMap * @param lat * @param z * @return */ KMap.osm_lat2tile=function(lat,z){return (Math.floor((1-Math.log(Math.tan(lat*Math.PI/180)+1/Math.cos(lat*Math.PI/180))/Math.PI)/2*Math.pow(2,z)));} /** * @fn osm_tile2long * @memberof KMap * @param x * @param z * @return */ KMap.osm_tile2long=function(x,z){return (x/Math.pow(2,z)*360-180);} /** * @fn osm_tile2lat(y,z) * @memberof KMap * @param y * @param z * @return */ KMap.osm_tile2lat=function(y,z){var n=Math.PI-2*Math.PI*y/Math.pow(2,z);return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));} /** * @fn LayerAvailable(v) * @memberof KMap * @param v */ KMap.prototype.LayerAvailable=function(v){ return (!v.bbox || !v.bbox[0] || this.xmin<=v.bbox[2] && this.xmax>=v.bbox[0] && this.ymin<=v.bbox[3] && this.ymax>=v.bbox[1]) && (this.GetScale()>=v.scmin || !v.scmin) && (this.GetScale()<=v.scmax || !v.scmax); }; /** * @fn FindSuitableBasemap() * @memberof KMap */ KMap.prototype.FindSuitableBasemap=function(){ var a,i=-1; for(a=0;a-1) this.SetBasemap(this.Basemaps[i]); }; /** * @fn LoadSoon() * @memberof KMap */ KMap.prototype.LoadSoon=function(){ var m=this; if(m.tmrMap) clearTimeout(m.tmrMap); m.tmrMap=setTimeout(function(){m.Load()},1500); }; /** * @fn Load * @memberof KMap * @param NoHistory * @param NewVersion */ KMap.prototype.Load=function(NoHistory,NewVersion){ var m=this; if(!m.maph) return; if(NewVersion) m.Version+=1; m.RoundMPP(); m.xmin=m.x-(m.mapw*m.mpp)/2; m.xmax=m.x+(m.mapw*m.mpp)/2; m.ymin=m.y-(m.maph*m.mpp)/2; m.ymax=m.y+(m.maph*m.mpp)/2; if(!NoHistory){ m.AddHistory(); m.Scalebar(); if(!m.LayerAvailable(m.Basemap)) m.FindSuitableBasemap(); for(var i=m.tiles.length-1;i>=0;i--){ var t=m.tiles[i]; if(t.isLayer || !KMap.ExtentsOverlap(t,this) || Math.max(m.mpp,t.mpp)/Math.min(m.mpp,t.mpp)>2.001){ m.mapback.removeChild(t.d); t.d=t.b=null; m.tiles.splice(i,1); } } m.untiled.style.display="none"; if(!m.Basemap.yshift) m.Basemap.yshift=0; if(!m.Basemap.size) m.Basemap.size=1; if(m.Basemap.type=="tiles") m.LoadGTiles(); else if(m.unon){ var y1=m.ymin,y2=m.ymax; if(m.Basemap.yshift<0) y2-=m.Basemap.yshift*m.mpp; if(m.Basemap.yshift>0) y1-=m.Basemap.yshift*m.mpp; var e=KMap.ProjectExtent([m.xmin,y1,m.xmax,y2],m.Prj,m.Basemap.prj); m.untiledimg.src=KMap.LayerUrlWithAuth(m.Basemap)+"&SERVICE=WMS&VERSION="+(m.Basemap.v? m.Basemap.v:"1.1.1")+"&REQUEST=GetMap&"+(m.Basemap.v=="1.3.0" ? "CRS":"SRS")+"="+m.Basemap.prj.crs+"&BBOX="+e.join(",")+"&WIDTH="+m.mapw*m.Basemap.size+"&HEIGHT="+(m.maph+Math.abs(m.Basemap.yshift))*m.Basemap.size; var st=m.untiledimg.style; st.left="0"; st.top=Math.min(0,m.Basemap.yshift)+"px"; st.width=m.mapw+"px"; st.height=(m.maph+Math.abs(m.Basemap.yshift))+"px"; st.opacity=m.Basemap.opacity/100; st.msInterpolationMode="nearest-neighbor"; if(m.untiledimg.style.setProperty) st.setProperty("image-rendering","optimizeSpeed",null); m.untiled.style.width=m.mapw+"px"; m.untiled.style.height=m.maph+"px"; if(m.Basemap.snapable) this.DigiSnapSetLoadParams(m.Basemap,m,e); // store snap-params/geoms in m(this) }else{ m.untiledimg.src=KMap.dummyImg; m.TileQueue=[]; for(var kx=Math.floor(m.xmin/m.mpp/m.Basemap.tilesize);kx<=Math.floor(m.xmax/m.mpp/m.Basemap.tilesize);kx++) for(var ky=Math.floor(m.ymin/m.mpp/m.Basemap.tilesize);ky<=Math.floor(m.ymax/m.mpp/m.Basemap.tilesize);ky++) m.TileQueueAdd(kx,ky); m.TileQueue.sort(KMap.TileQueueSort); for(i=0;i=1){ this.mpp=mpp2; this.x=xx; this.y=yy; var m=this;this.tmrMap=setTimeout(function(){m.Zooming=false;m.Load()},50); }else{ var m=this;setTimeout(function(){m.ZoomEffect(x,y,mpp1,mpp2,f)},50); } }; /** * @fn Zoom * @memberof KMap * @param x * @param y * @param mpp1 * @param mpp2 */ KMap.prototype.Zoom=function(x,y,mpp1,mpp2){ if(this.timerID){clearTimeout(this.timerID);this.timerID=0} if(this.tmrMap){clearTimeout(this.tmrMap);this.tmrMap=0} this.CleanOverlays(); this.MapTipHide(); this.Zooming=true; this.ZoomEffect(x,y,mpp1,mpp2,0); }; /** * @fn ZoomIn(x,y) * @memberof KMap * @param x * @param y */ KMap.prototype.ZoomIn=function(x,y){ if(typeof y=="undefined"){x=this.x;y=this.y} var i; for(var a=0;a0) this.Zoom(x,y,this.zoomlevels[i],this.zoomlevels[i-1]); }; /** * @fn ZoomOut(x,y) * @memberof KMap * @param x * @param y */ KMap.prototype.ZoomOut=function(x,y){ if(typeof y=="undefined"){x=this.x;y=this.y} var i; for(var a=0;a1) { this.History.shift(); this.x=this.History[0]["x"];this.y=this.History[0]["y"]; if(this.mpp!=this.History[0]["mpp"]){this.mpp=this.History[0]["mpp"];this.CleanOverlays()}else this.OverlayClean(true); this.History.shift(); this.Load(); } }; /** * @fn ZoomAll() * @memberof KMap */ KMap.prototype.ZoomAll=function(){ this.x=(this.expanse.xmin+this.expanse.xmax)/2;this.y=(this.expanse.ymin+this.expanse.ymax)/2; this.SetMPP(0.9*Math.max((this.expanse.xmax-this.expanse.xmin)/this.mapw,(this.expanse.ymax-this.expanse.ymin)/this.maph)); this.CleanOverlays(); this.Load(); }; // TODO (map.js) Geolocation: erweitert um Methode ZoomPos => an Maik senden /** * @fn ZoomPos(o) * @memberof KMap * @param o is the button object with button definitions and the inner DIV element of the button */ KMap.prototype.ZoomPos=function(o){ if (this.geolocationWatchPositionId !== undefined) return; var zoomLevel = Infinity; this.geolocationWatchPositionId = navigator.geolocation.watchPosition( // better use of GPS than getCurrentPosition // Firefox uses the mobile location service only sometimes! // Chrome uses the mobile location service always on watching the position! function(pos){ //console.log(pos); //console.log(new Date(pos.timestamp)); var zoomLevelNew = Math.max(0.5, pos.coords.accuracy/50); // Zoom level according to returned accuracy - more accurate coords = more zoom, but not too much! if (zoomLevelNew < zoomLevel) { //console.log(`watchPosition #${id} better accuracy ${pos.coords.accuracy}`); zoomLevel = zoomLevelNew; Map.Localize(KMap.CoorTrans([pos.coords.longitude,pos.coords.latitude], KMap.Prj.EPSG4326,KMap.Prj.EPSG5650), // transform from WGS84 to internal DenkmalGIS crs zoomLevel, "POINT(0 0)"); // This dummy WKT is needed, that Map.Localize applies mpp (zoom level)! } },function(err){ // err.code: // 0 = UNKNOWN_ERROR // 1 = PERMISSION_DENIED // 2 = POSITION_UNAVAILABLE // 3 = TIMEOUT console.log(`ERROR(${err.code}): ${err.message}`); },{ // With maximumAge:0 and enableHighAccuracy:true FFmobile activates location icon some times, // Chrome-Mobile does not! maximumAge:0, // 0 = always aquire new position otherwise set milliseconds timeout:10*1000, enableHighAccuracy:true } ); o.innerDiv.style.backgroundImage="url('"+KMap.ImgZoomPosWait+"')"; //console.log(`watchPosition #${id} started`); setTimeout((function(){ navigator.geolocation.clearWatch(this.geolocationWatchPositionId); o.innerDiv.style.backgroundImage="url('"+o.img+"')"; delete this.geolocationWatchPositionId; //console.log(`watchPosition #${id} stopped`); }).bind(this),15*1000); // give GPS time to respond before stop watching }; //KMap.prototype.Pan=function(dx,dy){ // this.x+=dx*(this.xmax-this.xmin)/2; // this.y+=dy*(this.ymax-this.ymin)/2; // this.Load(); //}; /** * @fn CleanOverlays() * @memberof KMap * @use this.CleanTiles(), this.CleanLabels(), this.OverlayClean() */ KMap.prototype.CleanOverlays=function(){ this.CleanTiles();this.CleanLabels();this.OverlayClean(); }; /** * @fn MapTipRequest() * @memberof KMap */ KMap.prototype.MapTipRequest=function(){ // to be overwritten this.BasemapTipRequest(); }; /** * @fn BasemapTipRequest() * @memberof KMap */ KMap.prototype.BasemapTipRequest=function(){ var m=this,layers=[],i=-1; if(this.Basemap.queryable) layers.push(this.Basemap); for(var a=0;a-1){ i=t.indexOf("{",j); if(i>-1){ o+=t.substr(j+1,i-j-1); j=t.indexOf("}",i); var xpath=t.substr(i+1,j-i-1); var n=KMap.XMLSelectNodes(d.documentElement,xpath); var s=n[0].nodeValue; if(n.length) o+=s; }else o+=t.substr(j+1); } tips=[{tip:o}]; }else if(r && r!=" ") tips=[{tip:r}]; func(tips); }); } }; KMap.prototype.WmsGetFeatureInfo=function(layer,bbox,func){ var m=this; var url=layer.url+"&SERVICE=WMS&VERSION="+(layer.v?layer.v:"1.1.1")+"&REQUEST=GetFeatureInfo&QUERY_LAYERS="+layer.querylayers+"&INFO_FORMAT="+layer.queryformat+"&"+(layer.v=="1.3.0"?"CRS":"SRS")+"="+layer.prj.crs+"&"+(layer.v=="1.3.0"?"I":"X")+"="+m.ex+"&"+(layer.v=="1.3.0"?"J":"Y")+"="+m.ey+"&WIDTH="+m.mapw+"&HEIGHT="+m.maph+"&BBOX="+bbox.join(","); var xhr=new XMLHttpRequest(); xhr.open("GET",url,true,layer.authUser?layer.authUser:null,layer.authPw?layer.authPw:null); xhr.withCredentials=!!layer.authUser; xhr.onload=function(){ if(xhr.readyState===4){ if(xhr.status===200) func(this.responseText,this.responseXML);else alert(this.statusText); } }; xhr.onerror=function(){ // probably cross-domain error, retry via server KInternet.HTTPRequest(KUrl+"map-getwmsfeatureinfo.php?url="+encodeURIComponent(url)+"&user="+encodeURIComponent(layer.authUser?layer.authUser:"")+"&pw="+encodeURIComponent(layer.authPw?layer.authPw:""),function(r,d){ func(r,d); }); }; xhr.send(null); }; //KMap.prototype.MapTipRec=function(tip,topic,type,id,clickable,imgSrc,imgW,imgH,imgXXL){ // return {tip:tip,topic:topic,type:type,id:id,clickable:clickable,imgSrc:imgSrc,imgW:imgW,imgH:imgH,imgXXL:imgXXL} //}; /** * @fn MapTipShow(recs,mainRec) * @memberof KMap * @param recs * @param mainRec */ KMap.prototype.MapTipShow=function(recs,mainRec){ if(this.cmenuo) return; this.MapTipHide(); this.maptip=document.createElement("div"); var st=this.maptip.style;st.position="absolute";st.left=st.top="0";st.zIndex="1012";st.padding="3px";st.border="1px #000000 solid";st.backgroundColor=this.MapTipBgColor;borderRadius="4px 4px 4px 4px";st.boxShadow="2px 2px 2px 0 black"; var inner=document.createElement("div"); this.maptip.appendChild(inner); var t=document.createElement("table");inner.appendChild(t);st=t.style;st.borderSpacing=0;st.borderCollapse="collapse"; var clickables=[]; var xxlNum=0,xxl=false; var m=this; for(var a=0;amaxw){imgH=Math.round(imgH*maxw/imgW);imgW=maxw;} var maxh=KMap.WindowHeight();if(imgH>maxh){imgW=Math.round(imgW*maxh/imgH);imgH=maxh;} var imgSrc=r.img.src.replace(/{w}/g,imgW).replace(/{h}/g,imgH); td.innerHTML="
"+r.tip+"
"; }else{ td.style.padding="6px 0 6px 6px"; if(r.img){ var f=this.MapTipImageSize/Math.max(r.img.w,r.img.h); var imgW=Math.round(r.img.w*f); var imgH=Math.round(r.img.h*f); var i=document.createElement("img");i.width=imgW;i.height=imgH;i.src=r.img.src.replace(/{w}/g,imgW).replace(/{h}/g,imgH);td.appendChild(i); st=i.style;st.marginRight="6px";st.float="left"; } td=tr.insertCell(1); td.style.padding="6px 6px 6px 0"; var t2=document.createElement("table");td.appendChild(t2);st=t2.style;st.borderSpacing=0;st.borderCollapse="collapse"; if(typeof(r.topic)=="string"){ var items=r.topic.split("\n"); for(var b=0;b1) st.whiteSpace="nowrap"; td2.innerHTML=items[b]; } } if(typeof(r.tip)=="string"){ items=r.tip.split("\n"); for(b=0;bwh*.8){ st=inner.style;st.height=(wh*.8)+"px";st.overflowY="scroll"; dh=this.maptip.offsetHeight; } } if(mxww) mx=ww-dw; if(my<0) my=0; if(my+dh>wh) my=wh-dh; this.maptip.style.left=(mx-dl)+"px"; this.maptip.style.top=(my-dt)+"px"; if(clickables.length>1){ var al=this.mapal.getBoundingClientRect(); var mt=this.maptip.getBoundingClientRect(); this.maptipBox=[Math.min(this.mx-5,mt.left-al.left),Math.min(this.my-5,mt.top-al.top),Math.max(this.mx+5,mt.right-al.left),Math.max(this.my+5,mt.bottom-al.top)]; } if(this.Immediately) this.MouseUp(); }; /** * @fn MapTipHookEvent * @memberof KMap * @params o,eventName,target,funcName,funcParam */ KMap.MapTipHookEvent=function(o,eventName,target,funcName,funcParam){ o.addEventListener(eventName,function(e){target[funcName](funcParam,e.button+1)},false); }; KMap.prototype.MapTipHide=function(){ if(this.maptip){this.o.removeChild(this.maptip);delete this.maptip;delete this.maptipBox;} if(!this.Dragging) this.mapal.style.cursor=this.cursor; }; /** * @fn MapTipClick * @memberof KMap * @params rec,button */ KMap.prototype.MapTipClick=function(rec,button){ // to be overwritten }; /** * @fn TouchStart * @memberof KMap * @param e */ KMap.prototype.TouchStart=function(e){ e.button=0;e.clientX=e.touches[0].clientX;e.clientY=e.touches[0].clientY;this.MouseMove(e);this.MouseDown(e); }; /** * @fn TouchMove * @memberof KMap * @param e */ KMap.prototype.TouchMove=function(e){ if(e.touches.length==1){ e.button=0;e.clientX=e.touches[0].clientX;e.clientY=e.touches[0].clientY;this.MouseMove(e);this.MouseDown(e); }else{ var dx=e.touches[0].clientX-e.touches[1].clientX;var dy=e.touches[0].clientY-e.touches[1].clientY;var d=Math.sqrt(dx*dx+dy*dy); if(this.TouchZoom){ if(!this.Zooming){ var r=this.mapal.getBoundingClientRect(); var x=this.xmin+((e.touches[0].clientX+e.touches[1].clientX)/2-r.left)*this.mpp; var y=this.ymax-((e.touches[0].clientY+e.touches[1].clientY)/2-r.top)*this.mpp; var mpp=this.RoundMPP(this.TouchMPP*Math.pow(this.TouchDist/d,1.5)); if(mppthis.mpp) this.ZoomOut(x,y); } }else{ this.TouchZoom=true;this.TouchDist=d;this.TouchMPP=this.mpp; } } }; /** * @fn TouchEnd * @memberof KMap * @param e */ KMap.prototype.TouchEnd=function(e){ if(!this.TouchZoom) this.MouseUp(e); this.TouchZoom=false; }; /** * @fn MouseWheel * @memberof KMap * @param e */ KMap.prototype.MouseWheel=function(e){ e.stopPropagation();e.preventDefault(); var x=this.xmin+this.ex*this.mpp; var y=this.ymax-this.ey*this.mpp; if(!this.Zooming && !this.Rectangling && !this.Dragging) if(e.deltaY<0) this.ZoomIn(x,y); else if(e.deltaY>0) this.ZoomOut(x,y); }; /** * @fn MouseMove * @memberof KMap * @param e * EventListener */ KMap.prototype.MouseMove=function(e){ this.MouseIn=true; var r=this.mapal.getBoundingClientRect(); this.ex=e.clientX-r.left; this.ey=e.clientY-r.top; e.stopPropagation(); e.preventDefault(); // prevent image drag&drop if(this.MouseKey){ if(this.timerID){clearTimeout(this.timerID);this.timerID=0} this.MapTipHide();this.CMenuHide(); } this.MouseMoveDo(); this.CoorUpdate(e); }; /** * @fn MouseMoveDo * @memberof KMap */ KMap.prototype.MouseMoveDo=function(){ var m=this; if(m.Digitizer){ if(!m.MouseKey || !(m.Dragging || m.Rectangling)) if(m.DigiMouseMove()) return; } if(m.Measuring){ if(!m.MouseKey || !(m.Dragging || m.Rectangling)) if(m.MeasMouseMove()) return; } if(m.MouseKey){ if(!m.Dragging && !m.Rectangling){ if(Math.abs(m.mx-m.ex)>9 || Math.abs(m.my-m.ey)>9){ if(m.MouseKey==1){ m.Dragging=true;m.mapal.style.cursor="move";m.StartX=m.x;m.StartY=m.y; }else m.Rectangling=true; } } if(m.Rectangling){ var startX=Math.max(0,Math.min(m.mx,m.ex)); var startY=Math.max(0,Math.min(m.my,m.ey)); var rectW=Math.min(m.mapw-startX,Math.max(m.mx,m.ex)-startX); var rectH=Math.min(m.maph-startY,Math.max(m.my,m.ey)-startY); var R=m.rect; if(rectW>9 || rectH>9){ R.style.display="block";R.style.left=(startX+m.mapl)+"px";R.style.top=(startY+m.mapt)+"px"; R.innerHTML="
"; }else R.style.display="none"; }else if(m.Dragging){ m.x=m.StartX+(m.mx-m.ex)*m.mpp; m.y=m.StartY-(m.my-m.ey)*m.mpp; m.Load(1); } }else{ if((Math.abs(m.mx-m.ex)>5 || Math.abs(m.my-m.ey)>5) && (!m.maptipBox || m.exm.maptipBox[2] || m.ey>m.maptipBox[3])){ if(m.timerID){clearTimeout(m.timerID);m.timerID=0;} m.MapTipHide(); m.LinkO=false; m.mx=m.ex;m.my=m.ey; m.timerID=setTimeout(function(){m.MapTipRequest();},250); m.CMenuLeave(); } } }; /** * @fn MouseDown * @memberof KMap * @param e */ KMap.prototype.MouseDown=function(e){ var m=this; var r=m.mapal.getBoundingClientRect(); m.ex=e.clientX-r.left; m.ey=e.clientY-r.top; m.eb=e.button+1; e.stopPropagation();e.preventDefault(); if(m.MouseKey==0){m.MouseKey=m.eb;m.mx=m.ex;m.my=m.ey;if(m.timerID){clearTimeout(m.timerID);m.timerID=0}}; if(m.Digitizer) m.DigiMouseDown(); }; /** * @fn MouseUp * @memberof KMap * @param e * EventListener */ KMap.prototype.MouseUp=function(e){ var m=this,b=this.MouseKey; m.MouseKey=0; if(m.Digitizer && !m.Rectangling && !m.Dragging){ m.DigiMouseUp(); }else if(this.Measuring && !this.Rectangling && !this.Dragging){ m.MeasAdd(); }else if(m.Rectangling){ m.Rectangling=false;m.rect.style.display="none"; var startX=Math.max(0,Math.min(m.mx,m.ex)); var startY=Math.max(0,Math.min(m.my,m.ey)); var rectW=Math.min(m.mapw-startX,Math.max(m.mx,m.ex)-startX); var rectH=Math.min(m.maph-startY,Math.max(m.my,m.ey)-startY); if(rectW>9 || rectH>9){m.x=m.xmin+(startX+rectW/2)*m.mpp;m.y=m.ymax-(startY+rectH/2)*m.mpp;m.mpp*=Math.max(rectW/m.mapw,rectH/m.maph);m.Load()} }else if(m.Dragging){ m.Dragging=false;m.mapal.style.cursor=m.cursor;m.Load(); }else if(m.LinkO){ if(m.LinkClickable) m.MapTipClick(m.LinkO,b);else if(m.CMenuPrepare()) m.CMenuPop(m.mx,m.my); }else if((b>1 || m.popCMenuOnLeftButton) && m.CMenuPrepare()){ m.CMenuPop(m.mx,m.my); }else{ // SN: only of triggered by event and not called by code (otherwise recursion!): if (e !== undefined) { m.MapTipRequest(); m.Immediately=true; } } }; /** * @fn MouseDbl * @memberof KMap */ KMap.prototype.MouseDbl=function(){ if(this.Digitizer) this.DigiMouseDbl(); else if(this.Digitizable()){ this.Digitize(); } }; /** * @fn MouseOut * @memberof KMap */ KMap.prototype.MouseOut=function(){ if(this.timerID){clearTimeout(this.timerID);this.timerID=0}; if(this.Dragging) this.MouseUp(); this.MouseIn=false; this.DigiCanvasRedraw(); if(this.Measuring) this.MeasDraw(); }; /** * @fn KeyDown * @memberof KMap * @param e */ KMap.prototype.KeyDown=function(e){ if(this.Digitizer) this.DigiKey(e.key); if(this.Measuring) this.MeasKey(e.key); }; /** * @fn * @memberof KMap * @param e */ KMap.prototype.DragEnter=function(e){ }; /** * @fn * @memberof KMap * @param e */ KMap.prototype.Drop=function(e){ var m=this; if(m.LyEditable && m.LyImportFiles(e.dataTransfer.files)) return; if(typeof Exif!="undefined"){ for(var a=0;athis.mapl+this.mapw) this.cmenuo.style.left=(x-w-3)+"px"; else this.cmenuo.style.left=(x+3)+"px"; if(y+h>this.mapt+this.maph) this.cmenuo.style.top=(this.mapt+this.maph-h)+"px"; }; /** * @fn CMenuLeave * @memberof KMap */ KMap.prototype.CMenuLeave=function(){ var m=this; if(!m.CMenuPopTimer) m.CMenuPopTimer=setTimeout(function(){m.CMenuHide()},400); }; /** * @fn CMenuHold * @memberof KMap */ KMap.prototype.CMenuHold=function(){ var m=this; if(m.CMenuPopTimer){clearTimeout(m.CMenuPopTimer);m.CMenuPopTimer=0;} }; /** * @fn CmenuHide * @memberof KMap */ KMap.prototype.CMenuHide=function(){ this.CMenuHold(); if(this.cmenuo){this.o.removeChild(this.cmenuo);this.cmenuo=null} }; /** * @fn Resize * @memberof KMap * @param w * @param h */ KMap.prototype.Resize=function(w,h){ this.o.style.width=w+"px";this.o.style.height=h+"px"; this.Placing(); this.Load(); }; /** * @fn LayerOn * @memberof KMap * @param i * @param on */ KMap.prototype.LayerOn=function(i,on){ if(typeof i!=="number") i=this.Layers.indexOf(i); this.Layers[i].on=!!on; if(on) this.Load();else this.RemoveTiles(this.Layers[i]); }; /** * @fn DeleteLayer * @memberof KMap * @param i */ KMap.prototype.DeleteLayer=function(i){ this.RemoveTiles(this.Layers[i]); this.Layers.splice(i,1); }; /** * @fn DeleteBasemap * @memberof KMap * @param i */ KMap.prototype.DeleteBasemap=function(i){ var d=(this.Basemap==this.Basemaps[i]); this.Basemaps.splice(i,1); if(d) this.FindSuitableBasemap(); this.Load(); }; /** * @fn SetBasemap * @memberof KMap * @param s */ KMap.prototype.SetBasemap=function(s){ this.RemoveTiles(this.Basemap); this.Basemap=s; this.RefreshBasemapCopyr(); this.unon=s.untiled; }; /** * @fn RefreshBasemapCopyr * @memberof KMap */ KMap.prototype.RefreshBasemapCopyr=function(){ var l=this.Basemap.copyright; if(this.Basemap.copyright_link) l=""+l+""; this.copyr.innerHTML=this.s("Basemap")+": "+l; try{this.copyr.style.left=(this.mapw-this.copyr.offsetWidth-10)+"px"}catch(err){} }; /** * @fn SetBasemapByToken * @memberof KMap * @param t * @return {null} */ KMap.prototype.SetBasemapByToken=function(t){ for(var i=0;i0 && !this.ButtonsLeft[a].id && !this.ButtonsLeft[a-1].id))){ btns.push(this.ButtonsLeft[a]); if(this.ButtonsLeft[a].gapAfter) btns.push({id:false}); } for(a=0;a0 && !this.ButtonsRight[a].id && !this.ButtonsRight[a-1].id))){ btns.push(this.ButtonsRight[a]); if(this.ButtonsRight[a].gapAfter) btns.push({id:false}); } for(a=0;a", bar:"
{title}
{close}
", close:"
X
", body:"
{body}
" }; // TODO (Maik) Startbreite der sidebars (hier wird dynamisch auch die mit dem Divider eingestellte Breite gespeichert): KMap.prototype.sidebarSettings={maps:{minWidth:200,width:200},search:{minWidth:200,width:200}}; /** * @fn SidebarOpen * @memberof KMap * @params title,callback,align * @return {DOMelement::div} winBody * * createElement div as sidebar * createElement div as sidebaContainer * createElement div as winBody * createElement img as CloseImg with onclick-listener in td with img call SidebarClose() */ KMap.prototype.SidebarOpen=function(id,title,callback,align){ var m=this; // TODO (Maik) ID der Sidebar um auf sidebarSettings zuzugreifen: m.sidebarId=id; m.SidebarClose(); m.sidebarCallback=callback; m.sidebarAlign=align?align:"right"; m.sidebar=document.createElement("div");m.o.appendChild(m.sidebar); var st=m.sidebar.style;st.position="absolute";st.zIndex="1010";st.backgroundColor="white";st.boxShadow="0 0 6px 0 #73808D"; // TODO (Maik) add splitter-div and some styles to in preperation to the above container: st.display="flex";st.flexDirection="row"; if(align!="right") st.left="0px"; // splitter: var splitter=document.createElement("div"); splitter.style.cssText="height:100%;box-sizing:border-box;cursor:ew-resize;flex:0 0 4px"; m.sidebarDivider = new KSplitter(splitter,function(active){ splitter.style.backgroundColor=active?"#c8c8c8":"#e8e8e8"; var border=active?"none":"1px solid #e0e0e0"; splitter.style.borderRight=border; splitter.style.borderLeft=border; },function(e){ // console.log("mousemove clientX="+e.clientX); var w; if(align=="right") w = m.mapl + m.mapw - e.clientX; else w = e.clientX - m.mapl; if(w > m.mapw / 2) w=m.mapw/2; if(w < m.sidebarSettings[m.sidebarId].minWidth) w = m.sidebarSettings[m.sidebarId].minWidth; m.sidebarSettings[m.sidebarId].width = w; m.Placing(); }); if(align=="right") m.sidebar.appendChild(splitter); // title bar: var t=document.createElement("table"); st=t.style;st.cellPadding="0";st.cellSpacing="0";st.border="0";st.borderCollapse="collapse"; // TODO (Maik) because of splitter-div add flex style: st.flexGrow="1"; m.sidebar.appendChild(t); // TODO (Maik) for align left add splitter after table: if(align!="right") m.sidebar.appendChild(splitter); // title caption: var tr=t.insertRow(); m.sidebarTitle=tr; var td=tr.insertCell();st=td.style;st.border=st.padding="0";st.paddingLeft=st.paddingTop=st.paddingBottom="8px";st.fontSize=m.FontSizeBig;st.fontWeight=m.FontWeightBig;st.color=m.TitleBarTextColor;st.textAlign="left";st.verticalAlign="middle"; // TODO (Maik) habe die Borders der Sidebar entfernt, weil sie nicht mehr zum Slider-DIV passen: st.borderBottom="1px solid #ddd"; td.innerHTML=title; // separator and close button: td=tr.insertCell();st=td.style;st.border=st.padding="0";st.width="16px"; // TODO (Maik) habe die Borders der Sidebar entfernt, weil sie nicht mehr zum Slider-DIV passen: st.borderBottom=st.borderRight="1px solid #ddd"; td.innerHTML=" "; td=tr.insertCell();st=td.style;st.border=st.padding="0";st.paddingLeft=st.paddingRight="8px";st.width="24px";st.verticalAlign="middle"; // TODO (Maik) habe die Borders der Sidebar entfernt, weil sie nicht mehr zum Slider-DIV passen: st.borderBottom="1px solid #ddd"; var closeImg=document.createElement("img");st=closeImg.style;st.verticalAlign="middle";st.cursor="pointer"; closeImg.src=m.ImgCloseBig;closeImg.width=closeImg.height="24"; td.appendChild(closeImg); td.onclick=function(){m.SidebarClose()}; // body: tr=t.insertRow(); td=tr.insertCell();td.colSpan="3"; m.sidebarContainer=document.createElement("div");m.sidebarContainer.style.overflowY="auto"; td.appendChild(m.sidebarContainer); var winBody=document.createElement("div");st=winBody.style; st.margin="8px"; m.sidebarContainer.appendChild(winBody); return winBody; }; /** * @fn SidebarClose * @memberof KMap */ KMap.prototype.SidebarClose=function(){ if(this.sidebar){ this.sidebarDivider.remove(); this.o.removeChild(this.sidebar); this.sidebar=null; this.Placing(); if(this.sidebarCallback) this.sidebarCallback(); } }; /** * @fn EdgebarOpen * @memberof KMap * @param callback * @return * * createElement div as edgebar * createElement table * createElement img from this.ImgClose as CloseImg with onclick-listener call EdgebarClose() */ KMap.prototype.EdgebarOpen=function(callback){ var m=this; m.EdgebarClose(); m.edgebarCallback=callback; m.edgebar=document.createElement("div");m.o.appendChild(m.edgebar); var st=m.edgebar.style;st.position="absolute";st.zIndex="1010";st.backgroundColor="white"; // TODO (Maik) Bei M-V soll die Edgebar (Geometrie-Editor bzw. Mess-Funktion) nicht die KO-Anzeige verdecken: // Deshalb hier den Shadow anpassen, damit er auch unterhalb des Fensters ist: st.boxShadow="0 0 3px 3px #73808D"; var t=document.createElement("table");m.edgebar.appendChild(t); st=t.style;st.borderSpacing="0";st.borderCollapse="collapse";st.margin="8px"; var tr=t.insertRow(0); var td=tr.insertCell(0); var o=document.createElement("div");td.appendChild(o); td=tr.insertCell(1); var c=document.createElement("img");td.appendChild(c); c.src=m.ImgClose;c.width="14";c.height="14"; c.style.cursor="pointer"; c.onclick=function(){m.EdgebarClose()} return o; }; /** * @fn EdgebarClose * @memberof KMap */ KMap.prototype.EdgebarClose=function(){ if(this.edgebar){ if(this.edgebar) this.o.removeChild(this.edgebar); this.edgebar=null; this.Placing(); if(this.edgebarCallback) this.edgebarCallback(); } }; /** @var {int} FindReqID */ KMap.prototype.FindReqID=0; /** * @var {string} FindURL * @memberof KMap * link to extern URL www.kig.gmbh/gazetteer */ KMap.prototype.FindURL="https://www.kig.gmbh/gazetteer/?q="; /** * @fn FindShow * @memberof KMap * @param c */ KMap.prototype.FindShow=function(c){ var m=this; if(c){ var so=this.SidebarOpen("search",m.s("Search"),function(){m.ButtonCheck("find",false)},"left"); // TODO (Maik) Habe width=100% statt 220px und box-sizing:border-box gesetzt wegen Divider: var fi=document.createElement("input");fi.type="text";fi.placeholder=m.s("SearchPlaceholder");fi.value="";var st=fi.style;st.boxSizing="border-box";st.width="100%";st.border="#73808D solid 1px";so.appendChild(fi); setTimeout(function(){m.Placing();fi.focus()},0); var loader=document.createElement("div");var st=loader.style;st.width="100%";st.height="3px";st.marginTop="6px";so.appendChild(loader); var tmrLoader,valLoader=0; var findXY=function(s){ var pt=s.split(";"); m.Loc=KMap.CoorTrans([parseFloat(pt[0]),parseFloat(pt[1])],m.PrjEx,m.Prj); m.LocDraw(); }; var list; var showResults=function(hits){ if(tmrLoader){clearInterval(tmrLoader);tmrLoader=null;} loader.style.backgroundImage=""; if(list){so.removeChild(list);list=null;} if(Array.isArray(hits) && hits.length){ list=document.createElement("table");so.appendChild(list);var st=list.style;st.borderSpacing="0";st.borderCollapse="collapse";st.marginTop="2px";st.maxWidth="350px"; for(var a=0;a-1) findXY(q); else{ tmrLoader=setInterval(function(){ valLoader+=1;if(valLoader==40) valLoader=0; loader.style.backgroundImage="linear-gradient(90deg, #3b99fc "+(-40+valLoader)+"%,white "+(-20+valLoader)+"%, #3b99fc "+(0+valLoader)+"%, white "+(20+valLoader)+"%, #3b99fc "+(40+valLoader)+"%, white "+(60+valLoader)+"%, #3b99fc "+(80+valLoader)+"%, white "+(100+valLoader)+"%, #3b99fc "+(120+valLoader)+"%)"; },25); m.FindReqID++;var myID=m.FindReqID; KInternet.HTTPRequest(m.FindURL+encodeURIComponent(q),function(r,json){ if(myID==m.FindReqID) showResults(r?json:null,fi); }); } }; fi.oninput=function(e){ if(m.FindTmr) clearTimeout(m.FindTmr); m.FindTmr=setTimeout(function(){findDo(fi.value)},500); }; ///addDOMEvent td.onkeyup fi.onkeyup=function(e){ if(e.key=="Enter"){ if(fi.value.indexOf(";")>-1){ findXY(fi.value); m.x=m.Loc[0];m.y=this.Loc[1]; m.Load(); }else findDo(fi.value); } }; }else{ m.SidebarClose(); m.LocDel(); } }; /// @var Loc KMap.prototype.Loc=null; /// @var LocShp KMap.prototype.LocShp=null; /** * @fn LocDraw() * @memeberof KMap */ KMap.prototype.LocDraw=function(){ var m=this; if(m.LocV){m.mapback.removeChild(m.LocV);m.mapback.removeChild(m.LocH);m.LocV=m.LocH=null;} m.LocV=document.createElement("div");m.mapback.appendChild(m.LocV); var st=m.LocV.style;st.zIndex="1007";st.position="absolute";st.left=((m.Loc[0]-m.xmin)/m.mpp)+"px";st.top="0";st.width="1px";st.height=m.maph+"px";st.backgroundColor="red"; m.LocH=document.createElement("div");m.mapback.appendChild(m.LocH); st=m.LocH.style;st.zIndex="1007";st.position="absolute";st.left="0";st.top=((m.ymax-m.Loc[1])/m.mpp)+"px";st.width=m.mapw+"px";st.height="1px";st.lineHeight="1px";st.overflow="hidden";st.backgroundColor="red"; } /** * @fn LocDel * @memberof KMap */ KMap.prototype.LocDel=function(){ var m=this; if(m.LocV){m.mapback.removeChild(m.LocV);m.mapback.removeChild(m.LocH);m.LocV=m.LocH=null;} m.Loc=null; if(m.LocShp){m.LocShp=null;m.Load();} } KMap.prototype.TbLocalize=function(xy,mpp,wkt){ // DEPRECATED !!! console.warn("Using deprecated KMap.TbLocalize() - use KMap.Localize() instead!"); this.Localize(xy,mpp,wkt); }; /** * @fn Localize(xy,mpp,wkt) * @memberof KMap * @param xy * @param mpp * @param wkt */ KMap.prototype.Localize=function(xy,mpp,wkt){ var m=this; m.Loc=xy; if(wkt){ var shp=KShape.createFromWkt(wkt,m.DigiPrecision===undefined?0:m.DigiPrecision); if(shp.type==KShape.stLine || shp.type==KShape.stPolygon){ m.LocShp=shp.toKShp(); m.LocShp.penWidth=4; m.LocShp.penColor="rgba(0,255,0,0.7)"; m.LocShp.fillColor="rgba(0,0,0,0)"; }else m.LocShp=null; var ext=shp.extent(); if(!ext.isNull){ // SN: mpp now sets the minimum! m.SetMPP(Math.max(mpp,1.5*Math.max((ext.xmax-ext.xmin)/m.mapw,(ext.ymax-ext.ymin)/m.maph))); if(!xy) m.Loc=[(ext.xmin+ext.xmax)/2,(ext.ymin+ext.ymax)/2]; } }else{ m.LocShp=null; var n=20;if(mpp && mpp<=2) n=2.5; if(m.mpp>n) m.SetMPP(n); } if(m.Loc){ m.x=parseFloat(m.Loc[0]);m.y=parseFloat(m.Loc[1]); m.Load(); } }; KMap.generateUUID = function() { return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)); } /// @var {int} LyEditable =1; KMap.prototype.LyEditable=1; /** * @fn LyShow(c) * @memberof KMap * @param c */ KMap.prototype.LyShow=function(c){ var m=this; if(c){ m.LyO=this.SidebarOpen("maps",m.s("Maps"),function(){m.ButtonCheck("map",false)},"right"); m.LyRefresh(); }else{ m.LyO=null; m.SidebarClose(); } }; // TODO (map.js) Erweiterungen für GeoPackages noch in Maik's Original-Quellcode einbauen /** * @fn LyRefresh() * @memberof KMap */ KMap.prototype.LyRefresh=function(reloadGeoPackages){ var m=this; while(m.LyO.children.length) m.LyO.removeChild(m.LyO.firstChild); // Make parent a flexbox and set height to 100%, but margin must be moved to the children: var st=m.LyO.style;st.display="flex";st.flexDirection="column";st.removeProperty("margin");st.height="100%"; var div=document.createElement("div");m.LyO.appendChild(div); div.style.cssText="flex: 0 1 auto; overflow-x: hidden; overflow-y: auto; margin: 10px 8px 0 8px; transition: height 0.5s ease-in-out;"; // TODO (Maik) Habe die Breite der Layerliste auf 100% gesetzt, um die Breite des Kartenreiters anpassen zu können (in den ist ein text-overflow ergänzt): var t=div.appendChild(document.createElement("table"));t.style.cssText="border-spacing: 0px; border-collapse: collapse; table-layout: fixed; width: 100%;"; for(var a=0;a'); td=tr.insertCell(2);td.style.cssText="vertical-align: middle; width: 20px;"; if(m.LyEditable && v.deletable){ var i=document.createElement("img");i.src=m.ImgClose;i.style.cssText="width: 14px; height: 14px; vertical-align: middle; margin: 0 3px; position: relative; top: -1px; cursor: pointer;";td.appendChild(i); //addDOMEvent img.mousedown -> this.LyDelBasemap() m.LyHookEvent(i,"mousedown",m,"LyDelBasemap",a); } } } for(a=0;a this.LyHit() m.LyHookEvent(i,"click",m,"LyHit",a); } td=tr.insertCell(1);td.style.cssText="vertical-align: middle; cursor: default; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"; if(!av) td.style.color="#73808D"; td.innerHTML=v.caption; // TODO (map.js) In SidebarOpen (Kartenreiter) verdeckt die Scrollbar die X-Symbole zum Löschen der Nutzer-Karten/Layer! // Deshalb hier padding-right ergänzt als Platzhalter für den Scrollbar: td=tr.insertCell(2);td.style.cssText="vertical-align: middle; width: 20px; padding-right: 20px;"; if(m.LyEditable&& v.deletable){ var i=document.createElement("img");i.src=m.ImgClose;i.style.cssText="width: 14px; height: 14px; vertical-align: middle; margin: 0 3px; position: relative; top: -1px; cursor: pointer;";td.appendChild(i); /// addDOMEvent img.mousedown -> this.LyDel() m.LyHookEvent(i,"mousedown",m,"LyDel",a); } } } if(m.LyEditable){ var div=document.createElement("div"); div.style.cssText="flex: 0 0 auto; margin: 10px 8px;"; m.LyO.appendChild(div); var b=document.createElement("button");b.style.whiteSpace="nowrap";b.innerHTML=m.s("LyAddWms"); div.appendChild(b); b.onclick=function(){m.LyWmsDialog()}; b=document.createElement("button");b.style.whiteSpace="nowrap";b.innerHTML=m.s("LyAddFile"); div.appendChild(b); b.onclick=function(){m.LyFileInput.click()}; // Button GeoPackage: if (m.LyGeoPackageEnabled){ b=document.createElement("button");b.id="LyAddGeoPackage";b.style.whiteSpace="nowrap";b.innerHTML=""+m.s("LyAddGeoPackage"); div.appendChild(b); b.onclick=function(){m.LyGeoPackagesList(true)}; } } m.Placing(true); if (m.LyGeoPackagesList.active) m.LyGeoPackagesList(reloadGeoPackages); }; // --- GeoPackage functions --- // TODO (Baustein 9b GeoPackages) Anforderung von Hr. Bergmann bezüglich Gitternetze - siehe Maiks Mail vom 12.06.2019 07:55 KMap.prototype.LyGeoPackageEnabled=false; KMap.prototype.LyGeoPackageEdit=false; KMap.prototype.LyGeoPackageBtnAdd="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB2ZXJzaW9uPSIxLjEiCiAgIHdpZHRoPSIxNiIKICAgaGVpZ2h0PSIxNiIKICAgaWQ9InN2ZzIiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTExIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOSIgLz4KICA8ZwogICAgIGlkPSJ0ZXh0MzAxNyIKICAgICBzdHlsZT0iZm9udC1zaXplOjEwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xpbmUtaGVpZ2h0OjEwMCU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpUeXBpY29uczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlR5cGljb25zIj4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcuOTY4NzUsMC41MzEyNSBjIC0wLjcwNDM1MzcsLTAuMDI5NzkgLTEuNDQ1NDQyNywwLjUwNDM2MDUgLTEuNSwxLjI1IC0wLjAwMjYyLDEuNjk4MTEyNiAtMy43OTJlLTQsMy4yNzc2MTMyIDAsNC45Mzc1IC0xLjM2MTA4MjMsNy4xODllLTQgLTIuODAzNjIzNiwwIC00LjEyNSwwIEMgMi4xOTQ2NDgzLDYuNzA3Mjk2IDIuMDI1OTMzNiw2LjcwMjQ1OSAxLjg3NSw2LjcxODc1IDEuNDIyMTk5Miw2Ljc2NzYyNDIgMS4wMDM3OTU1LDYuOTYxMzg5OCAwLjc1LDcuMzc1IDAuMTMyNjM2NjUsOC4xOTI0NzU2IDAuNzg3MDY0LDkuNDU4NTA3IDEuNzgxMjUsOS41MzEyNSBjIDEuNjEyMTMyMiwwLjAwMjQ5IDMuMTA5NDIzNiwyLjc3N2UtNCA0LjY4NzUsMCA3LjI5M2UtNCwxLjM2MjA1MiAwLDIuODA3Njg5IDAsNC4xMjUgLTAuMDQ1ODE3LDAuNTk2NDA3IDAuMTA0NzY5NywxLjI1NTM1NiAwLjY1NjI1LDEuNTkzNzUgMC44MTc0NzU2LDAuNjE3MzYzIDIuMDgzNTA3LC0wLjAzNzA2IDIuMTU2MjUsLTEuMDMxMjUgMC4wMDI0NiwtMS42MTUwNjMgMi43MzhlLTQsLTMuMTExMjM4IDAsLTQuNjg3NSAxLjQ0NzEzMSwtNy42NjNlLTQgMi45Nzc4NTEsMCA0LjM3NSwwIEMgMTQuMjUyNjU3LDkuNTc3MDY3IDE0LjkxMTYwNiw5LjQyNjQ4MDMgMTUuMjUsOC44NzUgMTUuODY3MzYzLDguMDU3NTI0NCAxNS4yMTI5NCw2Ljc5MTQ5MyAxNC4yMTg3NSw2LjcxODc1IGMgLTEuNzAxMiwtMC4wMDI1OSAtMy4yNzk1ODIsLTMuNzM3ZS00IC00LjkzNzUsMCAtNy41NTRlLTQsLTEuNDQ1OTQyNSAwLC0yLjk3MzU0MDIgMCwtNC4zNzUgMC4wMTE0NTQsLTAuMTQ5MTAxNyAwLjAxNjI5MSwtMC4zMTc4MTY0IDAsLTAuNDY4NzUgQyA5LjIzMjM3NTgsMS40MjIxOTkyIDkuMDM4NjEwMiwxLjAwMzc5NTUgOC42MjUsMC43NSA4LjQyMDYzMTEsMC41OTU2NTkxNSA4LjIwMzUzNDYsMC41NDExOCA3Ljk2ODc1LDAuNTMxMjUgeiIKICAgICAgIGlkPSJwYXRoMzAyMiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmYiIC8+CiAgPC9nPgo8L3N2Zz4K"; KMap.prototype.LyGeoPackageImgPen="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4Ij48ZyB0cmFuc2Zvcm09Im1hdHJpeCgwLjAzMzIwMzEsMCwwLDAuMDMzMjAzMSwwLjUsMC41MDAwMDkzMykiIHN0eWxlPSJmaWxsOiNmZjAwMDAiPjxwYXRoIGQ9Ik0gMzAuODIyLDM4NC41MzcgMCw1MTIgMTI3LjQ0Miw0ODEuMTk2IDQ2MS41OTEsMTQ3LjA0MSAzNjQuOTYxLDUwLjM5NiAzMC44MjIsMzg0LjUzNyB6IE0gMzk1Ljc4LDE0Mi43OTIgMTE1LjE4OCw0MjMuMzkgODguNjE4LDM5Ni44MDUgMzY5LjIwOSwxMTYuMjIzIDM5NS43OCwxNDIuNzkyIHoiIHN0eWxlPSJmaWxsOiNmZmZmZmYiLz48cGF0aCBkPSJNIDQ4Ny4xLDI0LjkwNiBDIDQ2MC4zOTcsLTEuNzY4IDQyMy4zNjMsLTguMDAxIDQwNC4zNTMsMTEuMDA0IGwgLTE5LjkzOCwxOS45MzggOTYuNjM0LDk2LjY0NSAxOS45MzgsLTE5LjkzOCBDIDUxOS45OTksODguNjM3IDUxMy43NzcsNTEuNjA0IDQ4Ny4xLDI0LjkwNiB6IiBzdHlsZT0iZmlsbDojZmZmZmZmIi8+PC9nPjwvc3ZnPg=="; KMap.prototype.LyGeoPackageBtnColor="rgba(91,103,109,0.65)"; /** * @fn LyGeoPackagesList() * @memberof KMap */ KMap.prototype.LyGeoPackagesList=function(reload){ var m=this; var id = "LyGeoPackagesList"; var e = document.querySelector("#LyAddGeoPackage span"); if (document.getElementById(id)) { // Remove the GeoPackage container: this.LyO.removeChild(this.LyO.lastChild); // Let the layer-list grow: this.LyO.firstChild.style.removeProperty("max-height"); // Enable the other buttons: this.LyO.children[1].children[0].disabled=false; this.LyO.children[1].children[1].disabled=false; e.style.removeProperty("transform"); this.LyGeoPackagesList.active=false; } else { this.LyGeoPackagesList.active=true; // Rotate the GeoPackage button arrow: e.style.display="inline-block"; e.style.transition="transform 0.5s linear"; e.style.transform="rotate(180deg)" // Shrink the layer-list - transition not working, may be because of settings in LyO container: this.LyO.firstChild.style.maxHeight="150px"; // Disable the other buttons: this.LyO.children[1].children[0].disabled=true; this.LyO.children[1].children[1].disabled=true; // Add GeoPackage container: var container=document.createElement("div");container.id=id;this.LyO.appendChild(container); container.style.cssText="flex: 1 1 auto; display: flex; flex-direction: column; margin: 0 8px 10px 8px; transition: height 0.5s ease-in-out;"; // Create GeoPackage button: if(m.LyGeoPackageEdit){ var span=container.appendChild(document.createElement("span")); span.style.cssText="flex: 0 0 auto; margin: 0 0 8px 4px; display: inline-block; border-radius: 4px; text-align: center; vertical-align: middle; cursor: pointer;"; var st=span.style;st.width=st.height=st.lineHeight="30px";st.backgroundColor=this.LyGeoPackageBtnColor; span.title=this.s("LyGeoPackageCreate"); this.LyHookEvent(span,"click",m,"LyGeoPackageUploadShow",0); var d=span.appendChild(document.createElement("div")); st=d.style;st.width=st.height="100%";st.opacity="1";st.backgroundImage="url('"+m.LyGeoPackageBtnAdd+"')";st.backgroundRepeat="no-repeat";st.backgroundPosition="center"; } // Add table of server side GeoPackages: div=container.appendChild(document.createElement("div"));div.style.cssText="flex: 1 1 200px; overflow-x: hidden; overflow-y: auto;"; var t=div.appendChild(document.createElement("table"));t.style.cssText="border-spacing: 0px; border-collapse: collapse; table-layout: fixed; width: 100%;"; this.LyGeoPackageUpload=new KUpload(); // Print the list of available GeoPackage-Layers: var print=function(json){ if (json) m.LyGeoPackageList=json; else json=m.LyGeoPackageList; for(var a=0;a-1)); win.appendChild(document.createElement("br")); win.appendChild(document.createElement("br")); /// addHTMLElement font "LyWmsLayer" d=document.createElement("font");win.appendChild(d); d.innerHTML=this.s("LyWmsLayer")+":"; win.appendChild(document.createElement("br")); /// addHTMLElement select var layerList=document.createElement("select");layerList.multiple=true;layerList.size=10;layerList.style.width="300px";layerList.style.border="#73808D solid 1px";win.appendChild(layerList); if(wmsO.layers){ for(var a=0;a"" && wmsO.layers[a].crs>"") o.value=a; else o.disabled=true; layerList.options.add(o); } } win.appendChild(document.createElement("br")); /// addHTMLElement button "LyAdd" b=document.createElement("button");win.appendChild(b);b.style.whiteSpace="nowrap";b.innerHTML=this.s("LyAdd"); /// addDOMEvent button.onclick -> this.LyAdd() b.onclick=function(){m.LyWmsAdd(wmsO,layerList,false)}; /// addHTMLElement button "LyAddBasemap" b=document.createElement("button");win.appendChild(b);b.style.whiteSpace="nowrap";b.innerHTML=this.s("LyAddBasemap"); /// addDOMEvent button.onclick -> this.LyAdd(true) b.onclick=function(){m.LyWmsAdd(wmsO,layerList,true)}; win.appendChild(document.createElement("br")); } }; /** * @fn LyMapsRequire() * @memberof KMap */ KMap.prototype.LyWmsRequire=function(url,user,pw){ var m=this; m.LyWmsGetCapabilities(url,user,pw,function(d){ var o={}; o.version=d.documentElement.getAttribute("version"); var service=d.getElementsByTagName("Service")[0]; o.copyright=o.title=service.querySelectorAll("Title")[0].childNodes[0].nodeValue; var c=service.querySelectorAll("OnlineResource");if(c.length) o.copyright_link=c[0].getAttribute("xlink:href"); c=service.querySelectorAll("MaxWidth");if(c.length) o.maxwidth=Number(c[0].childNodes[0].nodeValue); c=service.querySelectorAll("MaxHeight");if(c.length) o.maxheight=Number(c[0].childNodes[0].nodeValue); var getMap=d.getElementsByTagName("GetMap")[0]; o.url=getMap.querySelectorAll("Get")[0].querySelectorAll("OnlineResource")[0].getAttribute("xlink:href"); if(user && pw){o.authUser=user;o.authPw=pw;} o.formats=[]; var fs=KMap.XMLGetChildValues(getMap,"Format"); for(var a=0;a0) cs=cs[0].split(" "); } for(var a=0;a-1?"text/plain":o.infoFormats[0]; } o.layers.push(l); var layers=KMap.XMLGetChilds(layer,"Layer"); for(var a=0;a Maik fragen KMap.prototype.LayersChanged=function(){ // to be overwritten }; /** * @fn LyHit(i) * @memberof KMap */ KMap.prototype.LyHit=function(i){ this.LayerOn(i,!this.Layers[i].on); }; /** * @fn LyDelBasemap * @memberof KMap * @param i */ KMap.prototype.LyDelBasemap=function(i){ this.DeleteBasemap(i); this.LyChanged(); }; /** * @fn LyDel(i) * @memberof KMap */ KMap.prototype.LyDel=function(i){ this.DeleteLayer(i); this.LyRefresh(); this.LyChanged(); }; /** * @fn LyAddLocalLayer * @memberof KMap */ KMap.prototype.LyAddLocalLayer=function(fields,recs,title){ // calc extent: var m=this,e=new KExtent(); for(var a=0;a -1) topic.push(line); else tip.push(line); } tips.push({topic: topic.join("\n"),tip: tip.join("\n")}); } } if (tips.length) func(tips); }, //queryable:L.queryable fields:fields, recs:recs, // For DenkmalGIS M-V use an other color instead of yellow "rgba(255,255,0,...)": symbol:{penWidth:10,penColor:"rgba(255,150,0,.66)",fillColor:"rgba(255,150,0,.33)"}, drawFunc:function(t){m.LyDrawLocalLayer(t)} }; m.Layers.push(layer); m.Load(); m.LyChanged(); }; /** * @fn LyDrawLocalLayer * @memberof KMap * @param t */ KMap.prototype.LyDrawLocalLayer=function(t){ var m=this; ///addHTMLElement canvas var canvas=document.createElement("canvas"); canvas.width=canvas.height=t.layer.tilesize; var ctx=canvas.getContext("2d"); // TODO (Maik) map.js::KMap::LyDrawLocalLayer: Optimierung - aus der Schleife hierher verlegt: var penColor = t.layer.symbol.penColor? t.layer.symbol.penColor : null; var penWidth = t.layer.symbol.penWidth? t.layer.symbol.penWidth : 1; var fillColor = t.layer.symbol.fillColor? t.layer.symbol.fillColor : null; for(var c=0;c1){ ctx.beginPath(); for(var a=0;a-1){ var base=files[a].name.substr(0,i).toLowerCase(),ext=files[a].name.substr(i+1).toLowerCase(); if(exts.indexOf(ext)>-1){ if(!bundles[base]) bundles[base]={}; bundles[base][ext]=files[a]; } } } var out=[]; for(var key in bundles) out.push(bundles[key]); return out; }; /** * @fn LyAddShapefile * @memberof KMap * @param shpFile * @param dbfFile */ KMap.prototype.LyAddShapefile=function(shpFile,dbfFile){ var m=this,r=new FileReader(); r.onload=function(){ if(dbfFile){ var r2=new FileReader(); r2.onload=function(){m.LyAddShapefileDo(shpFile.name,r.result,r2.result)}; r2.readAsArrayBuffer(dbfFile); }else m.LyAddShapefileDo(shpFile.name,r.result); }; r.readAsArrayBuffer(shpFile); }; /** * @fn LyAddShapefileDo * @memberof KMap * @param title * @param bShp * @param bDbf */ KMap.prototype.LyAddShapefileDo=function(title,bShp,bDbf){ var shapefile; // TODO (map.js) show shapefile import error message to user try { shapefile=Shapefile.open(bShp); } catch(e) { alert(e); } var dbase=bDbf?DBase.open(bDbf):null; var fields=[];recs=[],i=0; if(dbase){ for(var a=0;a1){this.MeasLine[this.MeasLine.length-2]=this.MeasLine[this.MeasLine.length-1];this.MeasLine.pop();this.MeasDraw()} } }; /** * @fn MeasAdd * @memberof KMap */ KMap.prototype.MeasAdd=function(){ this.MeasLine.push(this.MeasLine[this.MeasLine.length-1]); this.MeasDraw(); }; /** * @fn MeasDot * @memberof KMap * @param {array} xy */ KMap.prototype.MeasDot=function(xy){ with(this.DigiCtx){ beginPath(); arc(xy[0],xy[1],4,0,2*Math.PI,true); fillStyle="rgba(0,255,0,0.3)";fill(); strokeStyle="rgb(0,192,0)";lineWidth=1.5;stroke(); } }; /** * @fn MeasDraw * @memberof KMap */ KMap.prototype.MeasDraw=function(){ this.DigiCtx.clearRect(0,0,this.DigiCanvas.offsetWidth,this.DigiCanvas.offsetHeight); this.DigiCtx.lineJoin="round"; this.DigiCtx.beginPath(); for(var b=0;b1+this.MeasType){ var s; if(this.MeasType==0){ var m=this.MeasLength()*this.RealScaleFac(this.MeasCY()); if(m<1000) s=m.toFixed(0)+" m"; else if(m<100000) s=(m/1000).toFixed(2)+" km"; else s=(m/1000).toFixed(0)+" km"; }else{ var qm=this.MeasArea()*Math.pow(this.RealScaleFac(this.MeasCY()),2); if(qm<10000) s=qm.toFixed(0)+" m²"; else if(qm<1000000) s=(qm/10000).toFixed(2)+" ha"; else if(qm<100000000) s=(qm/1000000).toFixed(2)+" km²"; else s=(qm/1000000).toFixed(0)+" km²"; } with(this.DigiCtx){font="bold 12px sans-serif";textBaseline="bottom"} var xy=this.MeasLine[this.MeasLine.length-1-(this.MouseIn? 0:1)]; var cr=this.Geo2Px(xy); this.DigiCtx.fillText(s,cr[0]+10,cr[1]); } }; /** * @fn MeasDel * @memberof KMap */ KMap.prototype.MeasDel=function(){ this.MeasLine=[[0,0]]; this.MeasDraw(); }; /** * @fn MeasShow * @memberof KMap */ KMap.prototype.MeasShow=function(){ var m=this; var mo=m.EdgebarOpen(function(){ if(m.Measuring){ m.Measuring=0; m.ButtonCheck("measure",false); m.DigiCtx.clearRect(0,0,m.DigiCanvas.offsetWidth,m.DigiCanvas.offsetHeight); } }); m.Measuring=1; m.MeasDraw(); m.MapTipHide(); m.CMenuHide(); var t=document.createElement("table");mo.appendChild(t);t.style.borderSpacing="0";t.style.borderCollapse="collapse"; var tr=t.insertRow(); var td=tr.insertCell();td.style.padding="0";td.style.whiteSpace="nowrap"; var i=document.createElement("input");i.type="radio";i.name="MeasType";i.style.verticalAlign="middle";td.appendChild(i);if(m.MeasType==0) i.checked="true"; i.onclick=function(){m.MeasType=0;m.MeasDraw()}; var a=document.createElement("font");a.innerHTML=this.s("MeasTypeLine");var st=a.style;st.verticalAlign="middle";st.cursor="default";td.appendChild(a); i=document.createElement("input");i.type="radio";i.name="MeasType";i.style.verticalAlign="middle";td.appendChild(i);if(m.MeasType==1) i.checked="true"; i.onclick=function(){m.MeasType=1;m.MeasDraw()}; var a=document.createElement("font");a.innerHTML=this.s("MeasTypeArea");st=a.style;st.verticalAlign="middle";st.cursor="default";td.appendChild(a); tr=t.insertRow(); td=tr.insertCell();st=td.style;st.padding="0";st.verticalAlign="middle";st.whiteSpace="nowrap"; i=document.createElement("input");i.type="checkbox";i.style.verticalAlign="middle";td.appendChild(i);i.checked=m.MeasShowXY; i.onclick=function(){m.MeasShowXY=this.checked;m.MeasDraw()}; a=document.createElement("font");a.innerHTML=m.s("MeasShowXY");st=a.style;st.verticalAlign="middle";st.cursor="default";td.appendChild(a); tr=t.insertRow(); td=tr.insertCell();td.style.padding="0";td.colSpan="2"; var b=document.createElement("button");td.appendChild(b);b.innerHTML=this.s("MeasClear"); b.onclick=function(){m.MeasDel()}; m.Placing(); m.MeasDraw(); }; /** * @vars {string} PrintTitle, {string} PrintPaperSize, {string}PrintPaperFormat, {int} PrintScale, {boolean} PrintUseScale, {boolean} PrintScalebar */ KMap.prototype.PrintTitle=""; KMap.prototype.PrintPaperSize="A4"; KMap.prototype.PrintPaperFormat="L"; KMap.prototype.PrintScale=25000; KMap.prototype.PrintUseScale=false; KMap.prototype.PrintScalebar=true; /** * @fn PrintDlgShow * @memberof KMap */ KMap.prototype.PrintDlgShow=function(){ var m=this; m.PrintDlgO=m.win.Open("print",0,{title:m.s("Printout"),modal:true}).o; var t=document.createElement("table");this.PrintDlgO.appendChild(t);t.style.borderSpacing=0;t.style.borderCollapse="collapse"; var tr=t.insertRow(0); var td=tr.insertCell(0);with(td.style){verticalAlign="middle";padding="4px";cursor="default"} td.innerHTML=this.s("PrintoutTitle")+": "; var td=tr.insertCell(1);with(td.style){padding="4px";verticalAlign="middle"}; var i=document.createElement("input");i.type="text";i.style.width="180px";i.style.border="#73808D solid 1px";i.value=this.PrintTitle;td.appendChild(i); i.onkeyup=function(){m.PrintTitle=this.value;}; var tr=t.insertRow(); var td=tr.insertCell(0);with(td.style){verticalAlign="middle";padding="4px";cursor="default"} td.innerHTML=this.s("PrintoutPaperSize")+": "; var td=tr.insertCell(1);td.style.padding="4px"; var i=document.createElement("input");i.type="radio";i.name="PrintPaperSize";i.value="A4";i.style.verticalAlign="middle";td.appendChild(i);if(this.PrintPaperSize=="A4") i.checked="true"; i.onclick=function(){m.PrintPaperSize=this.value;}; var a=document.createElement("font");a.innerHTML="A4";with(a.style){verticalAlign="middle";cursor="default";};td.appendChild(a); var i=document.createElement("input");i.type="radio";i.name="PrintPaperSize";i.value="A3";i.style.verticalAlign="middle";td.appendChild(i);if(this.PrintPaperSize=="A3") i.checked="true"; i.onclick=function(){m.PrintPaperSize=this.value;}; var a=document.createElement("font");a.innerHTML="A3";with(a.style){verticalAlign="middle";cursor="default";};td.appendChild(a); var tr=t.insertRow(); var td=tr.insertCell(0);with(td.style){verticalAlign="middle";padding="4px";cursor="default"} td.innerHTML=this.s("PrintoutPaperFormat")+": "; var td=tr.insertCell(1);td.style.padding="4px"; var i=document.createElement("input");i.type="radio";i.name="PrintPaperFormat";i.value="P";i.style.verticalAlign="middle";td.appendChild(i);if(this.PrintPaperFormat=="P") i.checked="true"; i.onclick=function(){m.PrintPaperFormat=this.value;}; var a=document.createElement("font");a.innerHTML=this.s("PrintoutPortrait");with(a.style){verticalAlign="middle";cursor="default";};td.appendChild(a); var i=document.createElement("input");i.type="radio";i.name="PrintPaperFormat";i.value="L";i.style.verticalAlign="middle";td.appendChild(i);if(this.PrintPaperFormat=="L") i.checked="true"; i.onclick=function(){m.PrintPaperFormat=this.value;}; var a=document.createElement("font");a.innerHTML=this.s("PrintoutLandscape");with(a.style){verticalAlign="middle";cursor="default";};td.appendChild(a); var tr=t.insertRow(); var td=tr.insertCell(0);with(td.style){verticalAlign="middle";padding="4px";cursor="default"} td.innerHTML=this.s("Scale")+": "; var td=tr.insertCell(1);with(td.style){padding="4px";verticalAlign="middle";} var i2=document.createElement("input");i2.type="text";i2.style.width="55px";i2.style.border="#73808D solid 1px";i2.style.verticalAlign="middle";i2.value=this.PrintScale;i2.disabled=!this.PrintUseScale; var i=document.createElement("input");i.type="checkbox";i.style.verticalAlign="middle";td.appendChild(i);i.checked=this.PrintUseScale; i.onclick=function(){i2.disabled=!this.checked;m.PrintUseScale=this.checked;if(this.checked) i2.focus();}; var a=document.createElement("font");a.innerHTML=" 1:";with(a.style){verticalAlign="middle";cursor="default";};td.appendChild(a); td.appendChild(i2); i2.onkeyup=function(){m.PrintScale=parseFloat(this.value);}; var tr=t.insertRow(); var td=tr.insertCell(0);td.style.padding="4px";td.colSpan=2; td.appendChild(document.createElement("br")); var b=document.createElement("button");td.appendChild(b);b.innerHTML=this.s("GeneratePDF"); b.onclick=function(){m.Printout()}; }; KMap.dummyImg="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; KMap.ImgZoomAll="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB2ZXJzaW9uPSIxLjEiCiAgIHdpZHRoPSIxNiIKICAgaGVpZ2h0PSIxNiIKICAgaWQ9InN2ZzIiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTExIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOSIgLz4KICA8ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDAuNzA3MTA2NzgsLTAuNzA3MTA2NzgsMC43MDcxMDY3OCwwLjcwNzEwNjc4LC01LjEyODA2MzcsOS42MjQ4Mzc1KSIKICAgICBpZD0idGV4dDMwMTciCiAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsaW5lLWhlaWdodDoxMDAlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O3dyaXRpbmctbW9kZTpsci10Yjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNmZjAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6VHlwaWNvbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpUeXBpY29ucyI+CiAgICA8cGF0aAogICAgICAgZD0iTSAwLjM0NDIwNTgzLDguMzM1Mzg2IEMgMC4yODA3NDQ0MSw4LjA4ODA5MjQgMC4zMDg5ODAyLDguMDA4ODM2OCAwLjM4MjMyNjMzLDcuNzc2MDI4NCAwLjUxNDc3ODM1LDcuNTE5Mzk2NyAwLjU5NDgzNDcsNy40MjE1NTczIDAuODQ5Mjk5NDEsNy4xMjM0MDc3IDEuOTcwNTkzNCw2LjAwOTczNDUgMi41NDM0OSw1LjQyNDQzNDUgMy42NzA4OTI2LDQuMzE3MjI2NCA0LjIxNDk3MzgsMy45MDU4NDc1IDUuMjIzNTgyOSw0LjA3NjM3NDYgNS4zODQ0MjcsNC44MTQzMTM1IDUuNTE0MDY4Miw1LjI4ODgxNTIgNS4zNTE0MDU2LDUuODEzNjI2NyA0Ljk1NTkzNzksNi4xMDk0MjA1IDQuNDM0NjIxNSw2LjYwODcwOTEgNC40NTE5NzQyLDYuNTY5MzI4NiAzLjkzMDY1NzgsNy4wNjg2MTcyIGMgMi4yMzM0MTU4LDAuMDAzMjggMS4zMDY5NTMxLC0wLjAwNjU3IDMuNTQwMTcxNywwLjAwNDk1IEMgOC4yMTU1NzEsNy4xMjgwNjE4IDguNzA0NzgxNiw4LjA4NjI1MTEgOC4yNDIzMTY0LDguNjk4NjE5NCA3Ljk4ODgyNjksOS4xMTE3MzE2IDcuNDk1OTE1Miw5LjIwODc1MSA3LjA0OTE0ODcsOS4xNzQ0MyBjIC0yLjA5Mjg5NDgsMCAtMS4wMjU1OTY0LDAgLTMuMTE4NDkwOSwwIDAuNjA0MTY1OSwwLjU4ODE3MzUgMC42ODM1OTc4LDAuNjI0MjM5NSAxLjI3ODk3NCwxLjIyMDg4OCAwLjQxMTcwNjYsMC41NDQzNDcgMC4yNDA1ODA5LDEuNTU0Mzc3IC0wLjQ5ODY5MjEsMS43MTM1MzQgQyA0LjI0Njc4NCwxMi4yMzQwMzggMy43MzIxNDc1LDEyLjA4NjQ2NyAzLjQzMzg4NzIsMTEuNzA0NzUzIDIuMzE3NjYyOCwxMC41ODg1MjcgMC43NTU5OTA4OSw5LjA4MTUzMiAwLjYyMzg4MzE3LDguODk0NzQ0NiAwLjQ5MTc3NTU1LDguNzA3OTU3MiAwLjQwNzY2NzI1LDguNTgyNjc5NiAwLjM0NDIwNTgzLDguMzM1Mzg2IHoiCiAgICAgICBpZD0icGF0aDMwMjIiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMTAuMjQwNzA4LDE4LjIzMTg4NyBjIDAuMjQ3MjkzLDAuMDYzNDYgMC4zMjY1NDksMC4wMzUyMyAwLjU1OTM1NywtMC4wMzgxMiAwLjI1NjYzMiwtMC4xMzI0NTMgMC4zNTQ0NzEsLTAuMjEyNTA4IDAuNjUyNjIxLC0wLjQ2Njk3MyAxLjExMzY3MywtMS4xMjEyOTQgMS42OTg5NzMsLTEuNjk0MTkxIDIuODA2MTgxLC0yLjgyMTU5NCAwLjQxMTM3OSwtMC41NDQwODEgMC4yNDA4NTIsLTEuNTUyNjg5IC0wLjQ5NzA4NywtMS43MTM1MzMgLTAuNDc0NTAyLC0wLjEyOTY0MiAtMC45OTkzMTQsMC4wMzMwMiAtMS4yOTUxMDcsMC40Mjg0ODkgLTAuNDk5Mjg5LDAuNTIxMzE2IC0wLjQ1OTkwOSwwLjUwMzk2MyAtMC45NTkxOTcsMS4wMjUyOCAtMC4wMDMzLC0yLjIzMzQxNiAwLjAwNjYsLTEuMzA2OTU0IC0wLjAwNSwtMy41NDAxNzMgLTAuMDU0NDksLTAuNzQ0NzQxIC0xLjAxMjY4MSwtMS4yMzM5NTAxIC0xLjYyNTA0NzUsLTAuNzcxNDg3IC0wLjQxMzExMTksMC4yNTM0OSAtMC41MTAxMzEyLDAuNzQ2NDAxIC0wLjQ3NTgxMDQsMS4xOTMxNjggMCwyLjA5Mjg5NSAwLDEuMDI1NTk3IDAsMy4xMTg0OTIgQyA4LjgxMzQ4MzEsMTQuMDQxMjcgOC43Nzc0MTY5LDEzLjk2MTgzNyA4LjE4MDc2NzksMTMuMzY2NDYyIDcuNjM2NDIwOCwxMi45NTQ3NTQgNi42MjYzOTExLDEzLjEyNTg4MSA2LjQ2NzIzNDMsMTMuODY1MTUzIGMgLTAuMTI1MTc2OSwwLjQ2NDE1NyAwLjAyMjM5NCwwLjk3ODc5MyAwLjQwNDEwNzcsMS4yNzcwNTMgMS4xMTYyMjYzLDEuMTE2MjI0IDIuNjIzMjIxOCwyLjY3Nzg5NyAyLjgxMDAwOTEsMi44MTAwMDQgMC4xODY3ODczLDAuMTMyMTA3IDAuMzEyMDY1MywwLjIxNjIxNiAwLjU1OTM1NjksMC4yNzk2NzggeiIKICAgICAgIGlkPSJwYXRoMzAyMi04IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsaW5lLWhlaWdodDoxMDAlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O3dyaXRpbmctbW9kZTpsci10Yjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6VHlwaWNvbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpUeXBpY29ucyIgLz4KICAgIDxwYXRoCiAgICAgICBkPSJNIDEwLjY0NTY1OCwtMS45NjYwNjY3IEMgMTAuMzk4MzY1LC0yLjAyOTUyODMgMTAuMzE5MTA5LC0yLjAwMTI5MiAxMC4wODYzLC0xLjkyNzk0NjEgOS44Mjk2NjkzLC0xLjc5NTQ5NDIgOS43MzE4Mjk5LC0xLjcxNTQzNzkgOS40MzM2ODAzLC0xLjQ2MDk3MzIgOC4zMjAwMDcxLC0wLjMzOTY3ODkyIDcuNzM0NzA3MiwwLjIzMzIxNzY2IDYuNjI3NDk5LDEuMzYwNjIwMyA2LjIxNjEyMDIsMS45MDQ3MDE1IDYuMzg2NjQ3MywyLjkxMzMwOTggNy4xMjQ1ODYyLDMuMDc0MTU0IDcuNTk5MDg3OSwzLjIwMzc5NTUgOC4xMjM4OTkzLDMuMDQxMTI4MiA4LjQxOTY5MzEsMi42NDU2NjUgOC45MTg5ODE3LDIuMTI0MzQ4OSA4Ljg3OTYwMTIsMi4xNDE3MDE3IDkuMzc4ODg5OSwxLjYyMDM4NTYgYyAwLjAwMzI4LDIuMjMzNDE1MiAtMC4wMDY1NywxLjMwNjk1MjkgMC4wMDQ5NSwzLjU0MDE3MTUgMC4wNTQ0OTEsMC43NDQ3NDA4IDEuMDEyNjgxMSwxLjIzMzk1MTYgMS42MjUwNDkxLDAuNzcxNDg2NCAwLjQxMzExMiwtMC4yNTM0ODk3IDAuNTEwMTMxLC0wLjc0NjQwMSAwLjQ3NTgxLC0xLjE5MzE2OCAwLC0yLjA5Mjg5NCAwLC0xLjAyNTU5NTkgMCwtMy4xMTg0ODk5IDAuNTg4MTc0LDAuNjA0MTY1MyAwLjYyNDI0LDAuNjgzNTk3NiAxLjIyMDg4OCwxLjI3ODk3MzIgMC41NDQzNDcsMC40MTE3MDc0IDEuNTU0Mzc3LDAuMjQwNTgwOSAxLjcxMzUzNCwtMC40OTg2OTE1IEMgMTQuNTQ0MzEsMS45MzY1MTEgMTQuMzk2NzM1LDEuNDIxODc1IDE0LjAxNTAyNSwxLjEyMzYxNDkgMTIuODk4Nzk5LDAuMDA3MzkwNDUgMTEuMzkxODA0LC0xLjU1NDI4MTcgMTEuMjA1MDE2LC0xLjY4NjM4OTQgMTEuMDE4MjI5LC0xLjgxODQ5NyAxMC44OTI5NTIsLTEuOTAyNjA1MyAxMC42NDU2NTgsLTEuOTY2MDY2NyB6IgogICAgICAgaWQ9InBhdGgzMDIyLTIiCiAgICAgICBzdHlsZT0iZm9udC1zaXplOjEwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xpbmUtaGVpZ2h0OjEwMCU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpUeXBpY29uczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlR5cGljb25zIiAvPgogICAgPHBhdGgKICAgICAgIGQ9Im0gMjAuNTQyMjc4LDcuOTMwMzIxOCBjIDAuMDYzNDYsMC4yNDcyOTM3IDAuMDM1MjMsMC4zMjY1NSAtMC4wMzgxMiwwLjU1OTM1ODEgLTAuMTMyNDUsMC4yNTY2MzU4IC0wLjIxMjUwOSwwLjM1NDQ3MDcgLTAuNDY2OTczLDAuNjUyNjIwNiAtMS4xMjEzMjQsMS4xMTM2NDE1IC0xLjY5NDE5OSwxLjY5ODk2MDUgLTIuODIxNTk1LDIuODA2MTc0NSAtMC41NDQwOCwwLjQxMTM4IC0xLjU1MjY4OCwwLjI0MDg1MiAtMS43MTM1MzMsLTAuNDk3MDg4IC0wLjEyOTY0MiwtMC40NzQ1IDAuMDMzMDMsLTAuOTk5MzA5IDAuNDI4NDg4LC0xLjI5NTEwMSAwLjUyMTMxNCwtMC40OTkyODk2IDAuNTAzOTY2LC0wLjQ1OTkwNTggMS4wMjUyNzksLTAuOTU5MTk3NSAtMi4yMzM0MTMsLTAuMDAzMjggLTEuMzA2OTUxLDAuMDA2NTUgLTMuNTQwMTcxLC0wLjAwNDk2IC0wLjc0NDc0LC0wLjA1NDQ4NyAtMS4yMzM5NTEsLTEuMDEyNjgwNSAtMC43NzE0ODYsLTEuNjI1MDQ4NCAwLjI1MzQ5LC0wLjQxMzExMTkgMC43NDY0MDEsLTAuNTEwMTMxMiAxLjE5MzE2OCwtMC40NzU4MTA0IDIuMDkyODk1LDAgMS4wMjU1OTcsMCAzLjExODQ5MiwwIC0wLjYwNDE2NSwtMC41ODgxNzU4IC0wLjY4MzU5OCwtMC42MjQyNDIgLTEuMjc4OTczLC0xLjIyMDg5MSAtMC40MTE3MDgsLTAuNTQ0MzQ3MSAtMC4yNDA1ODEsLTEuNTU0Mzc2OCAwLjQ5ODY5MSwtMS43MTM1MzM3IDAuNDY0MTU2LC0wLjEyNTE3NjkgMC45Nzg3OTIsMC4wMjIzOTggMS4yNzcwNTMsMC40MDQxMDc4IDEuMTE2MjI0LDEuMTE2MjI2MyAyLjY3Nzg5NiwyLjYyMzIyMDggMi44MTAwMDQsMi44MTAwMDgxIDAuMTMyMTA3LDAuMTg2Nzg3MyAwLjIxNjIxNiwwLjMxMjA2NjIgMC4yNzk2NzcsMC41NTkzNTgxIHoiCiAgICAgICBpZD0icGF0aDMwMjItOC00IgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxMHB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7dGV4dC1hbGlnbjpzdGFydDtsaW5lLWhlaWdodDoxMDAlO2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O3dyaXRpbmctbW9kZTpsci10Yjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6VHlwaWNvbnM7LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpUeXBpY29ucyIgLz4KICA8L2c+Cjwvc3ZnPgo="; KMap.ImgZoomIn="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB2ZXJzaW9uPSIxLjEiCiAgIHdpZHRoPSIxNiIKICAgaGVpZ2h0PSIxNiIKICAgaWQ9InN2ZzIiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTExIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOSIgLz4KICA8ZwogICAgIGlkPSJ0ZXh0MzAxNyIKICAgICBzdHlsZT0iZm9udC1zaXplOjEwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xpbmUtaGVpZ2h0OjEwMCU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpUeXBpY29uczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlR5cGljb25zIj4KICAgIDxwYXRoCiAgICAgICBkPSJtIDcuOTY4NzUsMC41MzEyNSBjIC0wLjcwNDM1MzcsLTAuMDI5NzkgLTEuNDQ1NDQyNywwLjUwNDM2MDUgLTEuNSwxLjI1IC0wLjAwMjYyLDEuNjk4MTEyNiAtMy43OTJlLTQsMy4yNzc2MTMyIDAsNC45Mzc1IC0xLjM2MTA4MjMsNy4xODllLTQgLTIuODAzNjIzNiwwIC00LjEyNSwwIEMgMi4xOTQ2NDgzLDYuNzA3Mjk2IDIuMDI1OTMzNiw2LjcwMjQ1OSAxLjg3NSw2LjcxODc1IDEuNDIyMTk5Miw2Ljc2NzYyNDIgMS4wMDM3OTU1LDYuOTYxMzg5OCAwLjc1LDcuMzc1IDAuMTMyNjM2NjUsOC4xOTI0NzU2IDAuNzg3MDY0LDkuNDU4NTA3IDEuNzgxMjUsOS41MzEyNSBjIDEuNjEyMTMyMiwwLjAwMjQ5IDMuMTA5NDIzNiwyLjc3N2UtNCA0LjY4NzUsMCA3LjI5M2UtNCwxLjM2MjA1MiAwLDIuODA3Njg5IDAsNC4xMjUgLTAuMDQ1ODE3LDAuNTk2NDA3IDAuMTA0NzY5NywxLjI1NTM1NiAwLjY1NjI1LDEuNTkzNzUgMC44MTc0NzU2LDAuNjE3MzYzIDIuMDgzNTA3LC0wLjAzNzA2IDIuMTU2MjUsLTEuMDMxMjUgMC4wMDI0NiwtMS42MTUwNjMgMi43MzhlLTQsLTMuMTExMjM4IDAsLTQuNjg3NSAxLjQ0NzEzMSwtNy42NjNlLTQgMi45Nzc4NTEsMCA0LjM3NSwwIEMgMTQuMjUyNjU3LDkuNTc3MDY3IDE0LjkxMTYwNiw5LjQyNjQ4MDMgMTUuMjUsOC44NzUgMTUuODY3MzYzLDguMDU3NTI0NCAxNS4yMTI5NCw2Ljc5MTQ5MyAxNC4yMTg3NSw2LjcxODc1IGMgLTEuNzAxMiwtMC4wMDI1OSAtMy4yNzk1ODIsLTMuNzM3ZS00IC00LjkzNzUsMCAtNy41NTRlLTQsLTEuNDQ1OTQyNSAwLC0yLjk3MzU0MDIgMCwtNC4zNzUgMC4wMTE0NTQsLTAuMTQ5MTAxNyAwLjAxNjI5MSwtMC4zMTc4MTY0IDAsLTAuNDY4NzUgQyA5LjIzMjM3NTgsMS40MjIxOTkyIDkuMDM4NjEwMiwxLjAwMzc5NTUgOC42MjUsMC43NSA4LjQyMDYzMTEsMC41OTU2NTkxNSA4LjIwMzUzNDYsMC41NDExOCA3Ljk2ODc1LDAuNTMxMjUgeiIKICAgICAgIGlkPSJwYXRoMzAyMiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmYiIC8+CiAgPC9nPgo8L3N2Zz4K"; KMap.ImgZoomOut="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB2ZXJzaW9uPSIxLjEiCiAgIHdpZHRoPSIxNiIKICAgaGVpZ2h0PSIxNiIKICAgaWQ9InN2ZzIiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTExIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOSIgLz4KICA8ZwogICAgIGlkPSJ0ZXh0MzAxNyIKICAgICBzdHlsZT0iZm9udC1zaXplOjEwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xpbmUtaGVpZ2h0OjEwMCU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpUeXBpY29uczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlR5cGljb25zIj4KICAgIDxwYXRoCiAgICAgICBkPSJNIDEuODc1LDYuNzE4NzUgQyAxLjQyMjE5OTIsNi43Njc2MjQyIDEuMDAzNzk1NSw2Ljk2MTM4OTggMC43NSw3LjM3NSAwLjEzMjYzNjY1LDguMTkyNDc1NiAwLjc4NzA2NCw5LjQ1ODUwNyAxLjc4MTI1LDkuNTMxMjUgYyA0LjA4NDA2ODIsMC4wMDYzMSA4LjA4MjczOTIsMCAxMS44NzUsMCBDIDE0LjI1MjY1Nyw5LjU3NzA2NyAxNC45MTE2MDYsOS40MjY0ODAzIDE1LjI1LDguODc1IDE1Ljg2NzM2Myw4LjA1NzUyNDQgMTUuMjEyOTQsNi43OTE0OTMgMTQuMjE4NzUsNi43MTg3NSBjIC00LjA5MTQ5NCwtMC4wMDYyMiAtOC4wNzEwMzc3LDAgLTExLjg3NSwwIC0wLjE0OTEwMTcsLTAuMDExNDU0IC0wLjMxNzgxNjQsLTAuMDE2MjkxIC0wLjQ2ODc1LDAgeiIKICAgICAgIGlkPSJwYXRoMzAyMiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmYiIC8+CiAgPC9nPgo8L3N2Zz4K"; KMap.ImgZoomBack="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB2ZXJzaW9uPSIxLjEiCiAgIHdpZHRoPSIxNiIKICAgaGVpZ2h0PSIxNiIKICAgaWQ9InN2ZzIiPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTExIj4KICAgIDxyZGY6UkRGPgogICAgICA8Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+CiAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+CiAgICAgICAgPGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPgogICAgICAgIDxkYzp0aXRsZT48L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0YT4KICA8ZGVmcwogICAgIGlkPSJkZWZzOSIgLz4KICA8ZwogICAgIGlkPSJ0ZXh0MzAxNyIKICAgICBzdHlsZT0iZm9udC1zaXplOjEwcHg7Zm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vcm1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xpbmUtaGVpZ2h0OjEwMCU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0O2ZpbGw6IzAwMDAwMDtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtmb250LWZhbWlseTpUeXBpY29uczstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOlR5cGljb25zIj4KICAgIDxwYXRoCiAgICAgICBkPSJNIDAuNSw4LjQwMjkzMzUgQyAwLjQxNTI4Mjc0LDguMDcyODExMiAwLjQ1Mjk3NTg0LDcuOTY3MDA5NSAwLjU1MDg4ODU2LDcuNjU2MjI0IDAuNzI3NzA0Miw3LjMxMzYzNTkgMC44MzQ1NzQ3Myw3LjE4MzAyNiAxLjE3NDI3MDEsNi43ODUwMTM5IDIuNjcxMTMxNSw1LjI5ODMyNiA0LjE1NTAwNjIsMy43OTc4OTM0IDUuNjYwMDIyMiwyLjMxOTgzNiA2LjM4NjMzODUsMS43NzA2Njk1IDcuNzMyNzcyMSwxLjk5ODMxMzEgNy45NDc0ODk1LDIuOTgzNDE3OSA4LjEyMDU1MjksMy42MTY4NDk3IDcuOTAzNDA3OCw0LjMxNzQ0MjEgNy4zNzU0ODE5LDQuNzEyMzA5MyA2LjY3OTU1NTIsNS4zNzg4MzAxIDUuOTgzNjI4NCw2LjA0NTM1MSA1LjI4NzcwMTcsNi43MTE4NzE5IGMgMi45ODE0NzgzLDAuMDA0MzggNS45NjMzNzYzLC0wLjAwODc3IDguOTQ0NTkxMywwLjAwNjYxIDAuOTk0MTg2LDAuMDcyNzQzIDEuNjQ3MjUzLDEuMzUxODY4NyAxLjAyOTg5LDIuMTY5MzQ0MyAtMC4zMzgzOTQsMC41NTE0ODAzIC0wLjk5NjQwMiwwLjY4MDk5NTUgLTEuNTkyODA5LDAuNjM1MTc5IC0yLjc5Mzg5MSwwIC01LjU4Nzc4MTYsMCAtOC4zODE2NzIzLDAgMC44MDY1MjU5LDAuNzg1MTc2OCAxLjYzMTY1NDQsMS41NTI0MTQ4IDIuNDI2NDQ2NSwyLjM0ODkwNTggMC41NDk2MDQsMC43MjY2NzIgMC4zMjExNjEzLDIuMDc1MDAyIC0wLjY2NTcyNDYsMi4yODc0NjcgQyA2LjQyODgwMzIsMTQuMzI2NDk2IDUuNzQxNzkzOSwxNC4xMjk0OTcgNS4zNDM2MzQsMTMuNjE5OTMzIDMuODUzNTQwMiwxMi4xMjk4MzYgMS4wNDk3MDg3LDkuMzk4OTk0MyAwLjg3MzM1Mjc2LDkuMTQ5NjQ0MiAwLjY5Njk5NjgxLDguOTAwMjk0MSAwLjU4NDcxNzI2LDguNzMzMDU1OCAwLjUsOC40MDI5MzM1IHoiCiAgICAgICBpZD0icGF0aDMwMjIiCiAgICAgICBzdHlsZT0iZmlsbDojZmZmZmZmIiAvPgogIDwvZz4KPC9zdmc+Cg=="; // TODO (map.js) Geolocation: Image ZoomPos und Ajax-Loader ergänzt KMap.ImgZoomPos="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iMjAiCiAgIGhlaWdodD0iMjAiPgogIDxlbGxpcHNlCiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuMTIwNjAzMDI7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjEuOTg4Nzc3ODg7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjE7cGFpbnQtb3JkZXI6bWFya2VycyBmaWxsIHN0cm9rZSIKICAgICBpZD0icGF0aDg0OCIKICAgICBjeD0iMTAuMDM0MTg0IgogICAgIGN5PSIxMC4wNDg4NzUiCiAgICAgcng9IjYuNTY2OTUxOCIKICAgICByeT0iNi41MDg4NDYzIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOm5vbmU7ZmlsbC1vcGFjaXR5OjAuNDY3MzM2Njg7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjEwO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjYxODA5MDQ2O3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICBpZD0icmVjdDg1MiIKICAgICB3aWR0aD0iMCIKICAgICBoZWlnaHQ9IjQuMjM2ODA3MyIKICAgICB4PSI3LjUxOTExMTIiCiAgICAgeT0iNC41IgogICAgIHJ4PSIwIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuODI4MTkzMDc7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNjE4MDkwNDY7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgIGlkPSJyZWN0ODU0IgogICAgIHdpZHRoPSIyLjAzNDUxMDkiCiAgICAgaGVpZ2h0PSI2LjkzMTc0OTMiCiAgICAgeD0iOS4wMTY5Mjg3IgogICAgIHk9IjAuNTAwMDAwNDgiCiAgICAgcnk9IjAuNzg2NTQwODEiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS44MjgxOTMxOTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC42MTgwOTA0NjtwYWludC1vcmRlcjpub3JtYWwiCiAgICAgaWQ9InJlY3Q4NTQtMiIKICAgICB3aWR0aD0iMi4wMzQ1MTA5IgogICAgIGhlaWdodD0iNi45MzE3NDkzIgogICAgIHg9IjkuMDE2OTI4NyIKICAgICB5PSIxMi41NjgyNTEiCiAgICAgcnk9IjAuNzg2NTQwODEiIC8+CiAgPHJlY3QKICAgICBzdHlsZT0ib3BhY2l0eToxO2ZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZTtzdHJva2Utd2lkdGg6MS44MTI5NzQyMTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6NDtzdHJva2UtZGFzaGFycmF5Om5vbmU7c3Ryb2tlLW9wYWNpdHk6MC42MTgwOTA0NjtwYWludC1vcmRlcjpub3JtYWwiCiAgICAgaWQ9InJlY3Q4NTQtNCIKICAgICB3aWR0aD0iMS45ODMwNDMzIgogICAgIGhlaWdodD0iNi45OTM3NDUzIgogICAgIHg9IjguOTIxNjA4IgogICAgIHk9Ii0xOS41Mzg4NzYiCiAgICAgcnk9IjAuNzkzNTc1MjMiCiAgICAgdHJhbnNmb3JtPSJtYXRyaXgoLTAuMDAzOTYzODYsMC45OTk5OTIxNCwtMC45OTk5ODA4NSwtMC4wMDYxODgwMywwLDApIiAvPgogIDxyZWN0CiAgICAgc3R5bGU9Im9wYWNpdHk6MTtmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7c3Ryb2tlLXdpZHRoOjEuODEyNTc5OTk7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjAuNjE4MDkwNDY7cGFpbnQtb3JkZXI6bm9ybWFsIgogICAgIGlkPSJyZWN0ODU0LTQtNyIKICAgICB3aWR0aD0iMS45ODMwNDMzIgogICAgIGhlaWdodD0iNi45OTA3MDE3IgogICAgIHg9IjguOTk1NDc0OCIKICAgICB5PSItNy41MzEwNzM2IgogICAgIHJ5PSIwLjc5MzIyOTk0IgogICAgIHRyYW5zZm9ybT0ibWF0cml4KC0wLjAwMzk2MjE0LDAuOTk5OTkyMTUsLTAuOTk5OTgwODQsLTAuMDA2MTkwNzEsMCwwKSIgLz4KICA8ZWxsaXBzZQogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojZmZmZmZmO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxLjQzMDU1NjU0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDo0O3N0cm9rZS1kYXNoYXJyYXk6bm9uZTtzdHJva2Utb3BhY2l0eTowLjYxODA5MDQ2O3BhaW50LW9yZGVyOm5vcm1hbCIKICAgICBpZD0icGF0aDkwMSIKICAgICBjeD0iMTAuMDM0MTg0IgogICAgIGN5PSIxMC4wNDg4NzUiCiAgICAgcng9IjEuMTQ0NDEyMyIKICAgICByeT0iMS4xMzQyODYzIiAvPgo8L3N2Zz4K"; KMap.ImgZoomPosWait="data:image/gif;base64,R0lGODlhEAAQAPQAAJaWlv///5iYmOfn58fHx/v7++7u7qamprm5ufT09M3NzdTU1KCgoL+/v6ysrODg4Nra2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAkKAAAALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkECQoAAAAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoLLoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkECQoAAAAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAkKAAAALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYAqrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAkKAAAALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0UaFBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA=="; KMap.ImgSearch="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTgiIHdpZHRoPSIxOCIgdmlld0JveD0iMCAwIDE4IDE4Ij48cGF0aCBzdHlsZT0iZmlsbDojZmZmZmZmIiBkPSJNIDcuMjU2NjMyNywwLjM3MzM4NzY0IEMgMy41MzA1MTAyLDAuMzczMzg3NjQgMC41LDMuNDA1NjMyNSAwLjUsNy4xMzAwMjAzIGMgMCwzLjcyNjEyMjcgMy4wMzA1MTAyLDYuNzU2NjMyNyA2Ljc1NjYzMjcsNi43NTY2MzI3IDEuMjYxMTIyNCwwIDIuNDQwNzE0MiwtMC4zNDY5NTIgMy40NTIwNDAzLC0wLjk1MDYyNiBMIDE1LjI3MjY0NiwxNy41IDE3LjUsMTUuMjc0NDA4IDEyLjk2NTUwMywxMC43Mzk5MTEgYyAwLjY2MjY1MywtMS4wNDQyODUyIDEuMDQ3NzYyLC0yLjI4Mjg0OTkgMS4wNDc3NjIsLTMuNjA5ODkwNyAwLC0zLjcyNDM4NzggLTMuMDMwNTEsLTYuNzU2NjMyNjYgLTYuNzU2NjMyMywtNi43NTY2MzI2NiB6IG0gMCwxLjg2MTMwNjI2IGMgMi42OTkxODM2LDAgNC44OTUyOTIzLDIuMTk2MTQyNyA0Ljg5NTI5MjMsNC44OTUzMjY0IDAsMi42OTkxODM3IC0yLjE5NjEwODcsNC44OTUyOTI3IC00Ljg5NTI5MjMsNC44OTUyOTI3IC0yLjY5OTE4MzcsMCAtNC44OTUyOTI2LC0yLjE5NjEwOSAtNC44OTUyOTI2LC00Ljg5NTI5MjcgMCwtMi42OTkxODM3IDIuMTk2MTA4OSwtNC44OTUzMjY0IDQuODk1MjkyNiwtNC44OTUzMjY0IHoiLz48L3N2Zz4="; KMap.ImgLayers="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij48cGF0aCBkPSJNIDcuNDg2ODg3NSwxMS4wODAxMzcgQyA3LjM3NDAwMjQsMTEuMDY2NDk1IDcuMTgyNjg1MywxMS4wMjk2MzEgNy4wNjE3Mzc1LDEwLjk5ODIxNiA2Ljc2MzE4MSwxMC45MjA2NzEgMC45MjI3NzQ3NCw4LjUzNTEyNjEgMC43NjA4MjM5MSw4LjQyNDU2OTEgMC41Njg1OTU0LDguMjkzMzQxOCAwLjUwODU2Mzc3LDguMjAyNzAxNCAwLjUwODU2Mzc3LDguMDQzNjg0IGMgMCwtMC4yNjgxOTg4IDAuMTYwNzQxNjIsLTAuMzg1MjA0MiAwLjk5MzYxMzgzLC0wLjcyMzI2MDQgMC42ODQ2NTc3LC0wLjI3Nzg5NzUgMC44NjI5OTAyLC0wLjMyMTA0OTUgMS4xNjExMTYsLTAuMjgwOTYwMyAwLjEyOTUwNzcsMC4wMTc0MTUgMC42NTA3OTAzLDAuMjE3NTg4NSAxLjk4NjQ3NjYsMC43NjI4MTExIDAuOTk1OTkxMiwwLjQwNjU1OTQgMS44OTY2NTYxLDAuNzY1MDU3NSAyLjAwMTQ3NzcsMC43OTY2NjAxIDAuODE0ODMyMiwwLjI0NTY2NTggMS44NDg3Njg3LDAuMjQ5ODUxOCAyLjY1MzUyMjIsMC4wMTA3MzYgMC4xMjkwMTEsLTAuMDM4MzM1IDEuMDQ2NzU1OSwtMC40MDEyODcyIDIuMDM5NDMyOSwtMC44MDY1NjcgMS4yMTg1MzMsLTAuNDk3NDg5OSAxLjg2MDYzLC0wLjc0NTUwNjYgMS45NzY1MTYsLTAuNzYzNDQ5NSAwLjMwMjc4NCwtMC4wNDY4OCAwLjQ5Mzc5NCwtNy43MjdlLTQgMS4xOTkyNywwLjI4OTQ5MDcgMC44MjI3OTEsMC4zMzg1MzIzIDAuOTcxNDQ2LDAuNDQ3ODczMyAwLjk3MTQ0NiwwLjcxNDUzMTEgMCwwLjE1OTAzNDkgLTAuMDYwMDYsMC4yNDk3MDkxIC0wLjI1MjI2LDAuMzgwODI1NiAtMC4xMzU2NjksMC4wOTI1NTIgLTUuNjE0NjgxLDIuMzQ3MzQzNiAtNi4wOTc5MTQxLDIuNTA5NDg5NiAtMC40NzY1MDc1LDAuMTU5ODg5IC0xLjA5MTE5MzIsMC4yMTQxODUgLTEuNjU0MzczNCwwLjE0NjEzIHoiIHN0eWxlPSJmaWxsOiNmZmZmZmYiLz48cGF0aCBkPSJNIDcuMzg0MjY1MSw3Ljg2MTQ2NTkgQyA3LjI0NzE5MDksNy44NDA5MjMyIDcuMDU1ODczMyw3LjgwMDEzMzQgNi45NTkxMTUxLDcuNzcwODIyMSA2LjYxNjQ4MDUsNy42NjcwMjYxIDAuODYzNDMxOTcsNS4yOTgzNDc2IDAuNzQ0Njc0MTksNS4yMTIxNzY0IDAuNTYxOTM1NzgsNS4wNzk1ODAyIDAuNDg2MTEzMTUsNC45NTYyNDAyIDAuNTAyMDcxMTQsNC44MTc1MzU3IDAuNTE5NDM3NDIsNC42NjY1OTA0IDAuNjEzMDI3NTMsNC41NDUwNDM1IDAuNzk4NTgzNDYsNC40MzI0NTA3IDEuMDEwNjM3Miw0LjMwMzc3OTYgNi44MTUxNzgsMS45NDI3MjkgNy4wNzQ2ODY0LDEuODc5NTg4MiBjIDAuMTE3OTA3OCwtMC4wMjg2ODkgMC4zNzQzMzg2LC0wLjA2NzQgMC41Njk4NDU1LC0wLjA4NjAyNiAwLjQxMTg2NTcsLTAuMDM5MjM5IDAuOTEwMDMzOCwtMC4wMDQ1NyAxLjI4ODM1NDgsMC4wODk2NiAwLjI3MTEwNzksMC4wNjc1MjUgNi4wNTUwMjIzLDIuNDE5Njc1NyA2LjI2ODUyODMsMi41NDkyMjg3IDAuMTg1NTU3LDAuMTEyNTkzMyAwLjI3OTE0NiwwLjIzNDEzOTcgMC4yOTY1MTMsMC4zODUwODUxIDAuMDE1OTYsMC4xMzg3NDQ2IC0wLjA1OTg3LDAuMjYyMDQ4IC0wLjI0Mjc4OCwwLjM5NDc3NDggQyAxNS4xMzYyNTksNS4yOTg1NzE1IDkuMzgxNzU2OSw3LjY2NzYzNTUgOS4wNDM2MDQsNy43Njk1MzA0IDguNjA5Nzk3Niw3LjkwMDI0OSA3LjkwMzk4MzEsNy45MzkzNTM5IDcuMzg0MjY1MSw3Ljg2MTQ2NjEgeiIgc3R5bGU9ImZpbGw6I2ZmZmZmZiIvPjxwYXRoIGQ9Im0gNy40ODcwNTc1LDE0LjI4NDczOSBjIC0wLjExMjg4NSwtMC4wMTM2NCAtMC4zMDQyMDIxLC0wLjA1MDUxIC0wLjQyNTE1LC0wLjA4MTkyIEMgNi43NjMzNTEsMTQuMTI1MjczIDAuOTIyOTQ0NzcsMTEuNzM5NzIzIDAuNzYwOTkzOTQsMTEuNjI5MTY2IDAuNTY4NzY1NDMsMTEuNDk3OTM5IDAuNTA4NzMzOCwxMS40MDcyOTkgMC41MDg3MzM4LDExLjI0ODI4IGMgMCwtMC4yNjgyIDAuMTYwNzQxNjIsLTAuMzg1MjA1IDAuOTkzNjEzOSwtMC43MjMyNjMgMC42ODQ2NTc2LC0wLjI3Nzg5OCAwLjg2Mjk5MDIsLTAuMzIxMDUgMS4xNjExMTU5LC0wLjI4MDk2MSAwLjEyOTUwNzgsMC4wMTc0MSAwLjY1MDc5MDMsMC4yMTc1ODkgMS45ODY0NzY2LDAuNzYyODEzIDAuOTk1OTkxMiwwLjQwNjU2MiAxLjg5NjY1NjEsMC43NjUwNiAyLjAwMTQ3NzcsMC43OTY2NjMgMC44MTQ4MzIyLDAuMjQ1NjY1IDEuODQ4NzY4NywwLjI0OTg1MSAyLjY1MzUyMjIsMC4wMTA3NCAwLjEyOTAxMTEsLTAuMDM4MzIgMS4wNDY3NTU5LC0wLjQwMTI3NiAyLjAzOTQzMzksLTAuODA2NTU3IDEuMjE4NTMyLC0wLjQ5NzQ5MiAxLjg2MDYyOSwtMC43NDU1MSAxLjk3NjUxNiwtMC43NjM0NTIgMC4zMDI3ODQsLTAuMDQ2ODggMC40OTM3OTMsLTcuNzRlLTQgMS4xOTkyNjksMC4yODk0OTEgMC44MjI3OTEsMC4zMzg1MzMgMC45NzE0NDYsMC40NDc4NzQgMC45NzE0NDYsMC43MTQ1MzQgMCwwLjE1OTAzNiAtMC4wNjAwNiwwLjI0OTcxIC0wLjI1MjI2LDAuMzgwODI2IC0wLjEzNTY2OSwwLjA5MjU1IC01LjYxNDY4MSwyLjM0NzM0OCAtNi4wOTc5MTQxLDIuNTA5NDk0IC0wLjQ3NjUwNzQsMC4xNTk4OSAtMS4wOTExOTMxLDAuMjE0MTg1IC0xLjY1NDM3MzQsMC4xNDYxMyB6IiBzdHlsZT0iZmlsbDojZmZmZmZmIi8+PC9zdmc+"; KMap.ImgMeasure="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+PHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLXJ1bGU6ZXZlbm9kZCIgZD0iTSAxNS4yMjE1MDcsMC41IDAuNSwxNS4yMjE1MDcgNC43Nzg0OTI2LDE5LjUgMTkuNSw0Ljc3ODQ5MjYgMTUuMjIxNTA3LDAuNSBaIG0gMC4wNDM2NiwxLjU5NTcwMzIgMS43MjY2NzYsMS43MjY2NzczIC0wLjg3NzUyNywwLjg3NzUyNzYgLTEuNzI2Njc4LC0xLjcyNjY3NzQgMC44Nzc1MjksLTAuODc3NTI3NSB6IE0gMTMuNTEwMTEsMy44NTI5NDEyIDE1LjIzNjc4OCw1LjU3OTYxODYgMTQuMzU3MDc4LDYuNDU3MTQ2MSAxMi42MzA0LDQuNzMwNDY4NyAxMy41MTAxMSwzLjg1Mjk0MTIgWiBNIDExLjc1Mjg3Miw1LjYwNzk5NjMgMTQuMTU0MDY3LDguMDA5MTkxMiAxMy4yNzQzNTcsOC44ODY3MTg1IDEwLjg3NTM0NSw2LjQ4NTUyNCAxMS43NTI4NzIsNS42MDc5OTYzIFogTSAxMCw3LjM2MzA1MTUgMTEuNzI2Njc4LDkuMDg5NzI5IDEwLjg0OTE1LDkuOTY3MjU2MyA5LjEyMDI4OTUsOC4yNDA1NzkgMTAsNy4zNjMwNTE1IFogTSA4LjI0Mjc2Miw5LjExODEwNzIgOS45Njk0MzkzLDEwLjg0NDc4NCA5LjA5MTkxMTgsMTEuNzI0NDk1IDcuMzY1MjM0Myw5Ljk5NzgxNzIgOC4yNDI3NjIsOS4xMTgxMDcyIFogTSA2LjQ4NzcwNjgsMTAuODc1MzQ1IDguMjE0Mzg0MiwxMi42MDIwMjIgNy4zMzY4NTY2LDEzLjQ3OTU0OSA1LjYwNzk5NjMsMTEuNzUyODcyIDYuNDg3NzA2OCwxMC44NzUzNDUgWiBNIDQuNzMwNDY4NywxMi42MzA0IDYuNDU3MTQ2MSwxNC4zNTcwNzggNS41Nzk2MTg2LDE1LjIzNjc4OCAzLjg1Mjk0MTIsMTMuNTA3OTI4IDQuNzMwNDY4NywxMi42MzA0IFogTSAyLjk3NTQxMzcsMTQuMzg3NjM4IDUuMzc0NDI1NSwxNi43ODY2NSA0LjQ5Njg5OCwxNy42NjYzNiAyLjA5Nzg4NiwxNS4yNjUxNjYgMi45NzU0MTM3LDE0LjM4NzYzOCBaIi8+PC9zdmc+"; KMap.ImgPrint="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCI+PHBhdGggc3R5bGU9ImZpbGw6I2ZmZmZmZiIgZD0ibSA0LjMyMDU3MywxLjIyNjMwMjEgYyAtMC45MzU3NDY1LDAgLTEuMjQ2MjI0LDAuMzA5OTM2OCAtMS4yNDYyMjQsMS4zMjM2OTc5IGwgMCwyLjE4NDc2NTYgLTEuNzE3NzA4NCwwIGMgLTAuNTQ1ODUxOTUsMCAtMC43Nzg2NjE3NSwwLjIzMzgwMyAtMC44NTY2NDA2LDAuNzAxNjkyNyBsIDAsMC43MDM5MDYzIDAsNC43NTQ2ODg0IGMgMCwwLjg1Nzc5NyAwLjIzMzUwODcyLDEuMTcwOTYzIDEuMDkxMjc2LDEuMTcwOTYzIGwgMS40ODMwNzMsMCAwLDMuNTA4NDYzIGMgMCwxLjAxMzc2MSAwLjMxMDQ3NzUsMS4zMjU5MTIgMS4yNDYyMjQsMS4zMjU5MTIgbCA5LjM1ODg1NCwwIGMgMC45MzU3NDcsMCAxLjE2ODc1LC0wLjMxMjY1OCAxLjE2ODc1LC0xLjI0ODQzOCBsIDAsLTMuMTk2MzU0IGMgMCwtMC4yMzM5NDMgMC4wNzgxNywtMC4zMTIxMDkgMC4zMTIxMSwtMC4zMTIxMDkgbCAxLjE3MDk2MywwIEMgMTcuMjY2OTk2LDEyLjA2NTUwOCAxNy41LDExLjgzMDgzMSAxNy41LDEwLjg5NTA1MyBjIDAsLTEuNjM3NjE0OSA1LjA5ZS00LC0zLjM1MTcwOTggLTAuMDc3NDcsLTQuOTg5MzIzOCAwLjA3Nzk3LC0wLjg1Nzc5NzkgLTAuMjMzNTA5LC0xLjE3MDk2MzYgLTEuMDkxMjc2LC0xLjE3MDk2MzYgbCAtMS40MDU1OTksMCBjIC0wLjA3Nzk4LC0wLjE1NTk2MzIgLTAuMDc3NDcsLTAuMTU2NjUzNyAtMC4wNzc0NywtMC4yMzQ2MzU0IGwgMCwtMi4wMjc2MDQxIGMgMCwtMC45MzU3Nzk1IC0wLjIzMzAwNSwtMS4yNDYyMjQgLTEuMTY4NzUsLTEuMjQ2MjI0IGwgLTkuMzU4ODU0LDAgeiBtIDAuMTU3MTYxMywxLjMyNTkxMTUgOS4xMjIwMDU3LDAgMCwyLjEwNTA3OCAtOS4xMjIwMDU3LDAgMCwtMi4xMDUwNzggeiBtIDAsNy40MDg3MjQyIDkuMTIyMDA1NywwIDAsNS42MTM1NDEyIC05LjEyMjAwNTcsMCAwLC01LjYxMzU0MTIgeiBtIDEuMzI1OTExNSwwLjg1NjY0MDIgMCwxLjI0ODQzOCA2LjQ3MjM5NjIsMCAwLC0xLjI0ODQzOCAtNi40NzIzOTYyLDAgeiBtIC0wLjA3OTY4NywyLjE4MjU1MiAwLDEuMjQ4NDM4IDYuNDcyMzk2MSwwIDAsLTEuMjQ4NDM4IC02LjQ3MjM5NjEsMCB6Ii8+PC9zdmc+Cg=="; KMap.ImgLink="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTgiIHdpZHRoPSIxOCI+PHBhdGggZD0ibSA5LjM1ODIwNDksMTAuMjQ5NzU1IC0xLjAwNDc1OTksMS4wMDU1NTYgMC4wMzMwNywwLjAzMzA3IGMgMC4xMzc0NjEsMC4xMzc5NTkgMC4xMzc0NjEsMC4zNjMwMSAwLDAuNTAwODY5IGwgLTQuMTg1Njg2MSw0LjE4NTU4NyBjIC0wLjEzODI1NzksMC4xMzgyNTcgLTAuMzYzMDQzMSwwLjEzODI1NyAtMC41MDEzMDA5LDAgTCAyLjAyNTI2MDUsMTQuMzAxMTAxIGMgLTAuMTM4MjkxMSwtMC4xMzg4MjIgLTAuMTM4MjkxMSwtMC4zNjM1NDEgMCwtMC41MDE2NjYgTCA2LjIxMDc4MDYsOS42MTM3NDg3IGMgMC4xMzgxMjUxLC0wLjEzNzk5MjIgMC4zNjI5NDM1LC0wLjEzNzk5MjIgMC41MDA1MzcyLDAgbCAwLjAzMzIwMywwLjAzMzAzNyAxLjAwNTQyMzksLTEuMDA0NzkzMSAtMC4wMzMwNywtMC4wMzMzMDMgYyAtMC42OTM0MTQxLC0wLjY5MzI0ODEgLTEuODE3NzcxNywtMC42OTMyNDgxIC0yLjUxMTU1MTEsMCBMIDEuMDIwMDM1NywxMi43OTQyNzcgYyAtMC42OTMzODA5NCwwLjY5Mzc0NiAtMC42OTMzODA5NCwxLjgxODIzNiAwLDIuNTExMzE4IGwgMS42NzQwMzU0LDEuNjc0MjY4IGMgMC42OTM1MTM4LDAuNjkzNTE0IDEuODE3NjA1OCwwLjY5MzUxNCAyLjUxMTI1MjQsMCBsIDQuMTg2MDUxNCwtNC4xODU1ODYgYyAwLjY5MzM4MTEsLTAuNjkzMjQ5IDAuNjkzMzgxMSwtMS44MTgxMzcgMCwtMi41MTE1MTggbCAtMC4wMzMxNywtMC4wMzMgeiIgc3R5bGU9ImZpbGw6I2ZmZmZmZiIvPjxwYXRoIGQ9Ik0gMTYuOTc5OTE3LDIuNjk0ODgwNSAxNS4zMDYwMTQsMS4wMjA1MTMgYyAtMC42OTQwNDUsLTAuNjk0MDc4MjEgLTEuODE4MTcsLTAuNjk0MDc4MjEgLTIuNTExNzUsMCBMIDguNjA4NTQ0Nyw1LjIwNTcwMTEgYyAtMC42OTMyNDgyLDAuNjkzMjQ4MiAtMC42OTMyNDgyLDEuODE4MTM3IDAsMi41MTEzODUyIGwgMC4wMzMyMDMsMC4wMzMyMDMgMS4wMDUyOTEyLC0xLjAwNTA5MTkgLTAuMDMzNTAyLC0wLjAzMzA3IGMgLTAuMTM4MDkxOCwtMC4xMzgxMjUxIC0wLjEzODA5MTgsLTAuMzYzMDA5OSAwLC0wLjUwMTE2ODEgTCAxMy43OTkzODksMi4wMjU0MzkgYyAwLjEzODYyMywtMC4xMzgyMjQ3IDAuMzYyNzQ0LC0wLjEzODIyNDcgMC41MDExMzUsMCBsIDEuNjc0MzM0LDEuNjc0NDMzOCBjIDAuMTM4MjU4LDAuMTM3NjYwMiAwLjEzODI1OCwwLjM2MjQ3ODYgMCwwLjUwMDc2OTYgbCAtNC4xODU2ODYsNC4xODU2MTk4IGMgLTAuMTM4MDkyLDAuMTM3OTkyMiAtMC4zNjI5MSwwLjEzNzk5MjIgLTAuNTAwOTAyLDAgbCAtMC4wMzMzNCwtMC4wMzMyMDMgLTEuMDA0NzkzLDEuMDA1NDI0IDAuMDMzMDQsMC4wMzMwNyBjIDAuNjkyODQ5LDAuNjkzNDgwNyAxLjgxNzQ3MywwLjY5MzQ4MDcgMi41MTA5ODYsMCBsIDQuMTg1NzIsLTQuMTg1ODUyMiBjIDAuNjkzNDgsLTAuNjkzNzQ2MSAwLjY5MzQ4LC0xLjgxNzczODUgMy4zZS01LC0yLjUxMDgyMDYgeiIgc3R5bGU9ImZpbGw6I2ZmZmZmZiIvPjxwYXRoIGQ9Im0gNS42NDQzNjg0LDEyLjE1NDQ4NSAwLjIwMDgxMjYsMC4yMDE0MTEgYyAwLjIyMTM5ODUsMC4yMjA2NjggMC42MjQzODQ4LDAuMTgwMTkzIDAuODk1MTg5NiwtMC4wOTEzMSBMIDEyLjI2NDU0MSw2Ljc0MDc4MTUgYyAwLjI3MDkwNSwtMC4yNzEwNzA0IDAuMzExOTQ0LC0wLjY3NDAyMzYgMC4wOTExNCwtMC44OTUyODkyIEwgMTIuMTU0ODcxLDUuNjQ0NTgwMSBDIDExLjkzMzQ3Myw1LjQyMzE4MTcgMTEuNTMwODg1LDUuNDY0Mjg3MSAxMS4yNTk1NDksNS43MzU3NTU5IEwgNS43MzUwNDYyLDExLjI1OTcyNyBjIC0wLjI3MDQwNjMsMC4yNzEzMDMgLTAuMzExNTQ1LDAuNjczMzYgLTAuMDkwNjc4LDAuODk0NzU4IHoiIHN0eWxlPSJmaWxsOiNmZmZmZmYiLz48L3N2Zz4="; KMap.prototype.ImgClose="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTQiIHdpZHRoPSIxNCIgdmVyc2lvbj0iMS4xIj48cGF0aCBzdHlsZT0iZmlsbDojNzM4NDhjIiBkPSJNIDAuNTAwMDAwMDIsMTAuODk5OTk5IDQuMzk5OTk5OCw3IDAuNTAwMDAwMDIsMy4xMDAwMDAyIDMuMDk5OTk5OSwwLjUwMDAwMDI4IDYuOTk5OTk5Nyw0LjQwMDAwMDEgMTAuODk5OTk5LDAuNTAwMDAwMjggMTMuNSwzLjEwMDAwMDIgOS41OTk5OTk2LDcgMTMuNSwxMC44OTk5OTkgMTAuODk5OTk5LDEzLjUgNi45OTk5OTk3LDkuNjAwMDAwMiAzLjA5OTk5OTksMTMuNSBaIiAvPjwvc3ZnPg=="; KMap.prototype.ImgCloseBig="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMTYiIHdpZHRoPSIxNiI+PHBhdGggZD0iTSAwLjUsMi41OTc4NTc2IDUuOTAyMTQyNSw4IDAuNSwxMy40MDIxNDIgMi41OTc4NTgyLDE1LjUgOC4wMDAwMDA2LDEwLjA5Nzg1OCAxMy40MDIxNDIsMTUuNSAxNS41LDEzLjQwMjE0MiAxMC4wOTc4NTksOCAxNS41LDIuNTk3ODU3NiAxMy40MDIxNDIsMC40OTk5OTk0MyA4LjAwMDAwMDYsNS45MDIxNDE5IDIuNTk3ODU4MiwwLjQ5OTk5OTQzIDAuNSwyLjU5Nzg1NzYgWiIgc3R5bGU9ImZpbGw6IzczODQ4YyIvPjwvc3ZnPg=="; // --- Digitizer Functions --- KMap.prototype.DigiPrecision=1; KMap.prototype.DigiBtnColor="rgba(91,103,109,0.65)"; KMap.prototype.DigiBtnSelColor="#FF9632"; KMap.prototype.DigiBtnSnapSelColor="#3296D0"; KMap.prototype.DigiBtnOkColor="#90AD1B"; KMap.prototype.DigiBtnSize="30px"; KMap.prototype.DigiBtnMargin="4px"; KMap.prototype.DigiBtnOkMargin="16px"; KMap.prototype.DigiImgPoint="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0ibSAxMS4xMjMyMTMsOC4wMDAwMDAzIGEgMy4xMjMyMTI5LDMuMTIzMjEyOSAwIDEgMSAtNi4yNDY0MjU4LDAgMy4xMjMyMTI5LDMuMTIzMjEyOSAwIDEgMSA2LjI0NjQyNTgsMCB6IiBzdHlsZT0iZmlsbDojZmZmZmZmIi8+PC9zdmc+"; KMap.prototype.DigiImgLine="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTSA5Ljg1ODUxNDgsMS40NjY4NzI5IDMuMDkyMDA3Miw2LjMyNjQ1NTYgMTMuMzAzMjgyLDExLjk4NTcxNiAxMC40NzM2NTIsMTQuNTY5MjkzIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDoyLjU2NjMwODc0O3N0cm9rZS1saW5lY2FwOmJ1dHQ7c3Ryb2tlLWxpbmVqb2luOm1pdGVyO3N0cm9rZS1taXRlcmxpbWl0OjQiIC8+PC9zdmc+"; KMap.prototype.DigiImgPolygon="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTSAzLjU0MTQ4OTIsMi43NTk5OTU5IDAuNSw4LjE0Mzc3MTEgbCAwLDUuMTc3Njc4OSAxNSwwIC01LjA1NDYyOSwtNS43NTMwMDAxIDIuMjE5MTA1LC0yLjc1MzMzNDEgMCwtMi4wNTUxMTk5IHoiIHN0eWxlPSJmaWxsOiNmZmZmZmYiLz48L3N2Zz4="; KMap.prototype.DigiImgImport="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCI+PHBhdGggZD0ibSAxLDE4LjQgMTgsMCAwLC01LjU3OTU0MyAtMi42MDg4NCwwIDAsMi45NzEyNjYgLTEyLjc4MjQ5NTksMCAwLC0yLjk3MTI2NiAtMi42MDg2NjQxLDAgeiIgc3R5bGU9ImZpbGw6IzczODQ4YyIvPjxwYXRoIGQ9Im0gOC42OTU4MDg2LDEuODkxOTYxIDAsNS42NDA3NSAtMi42MTk1OTc3LDAgMy45MDI2NjAyLDYuNzU4NTQzIDMuOTAxMzU4OSwtNi43NTg1NDMgLTIuNTc2MDM5LDAgMCwtNS42NDA3NSB6IiBzdHlsZT0iZmlsbDojNzM4NDhjIi8+PC9zdmc+"; KMap.prototype.DigiImgOK="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTSAwLjUsOC41NzUyMzAzIDIuNzYyNDM3OSw2LjQ2MTEyMTMgNS44MTEyNjk1LDkuMzkxOTQ4OCAxMy4zMTQ0NTMsMi4xNDE5NDkgMTUuNSw0LjMzMjY2ODkgNS44MTA3ODMsMTQuMDE2OTU1IHoiIHN0eWxlPSJmaWxsOiNmZmZmZmYiLz48L3N2Zz4="; KMap.prototype.DigiImgNewVertex="data:image/x-win-bitmap,application/x-win-bitmap;base64,AAACAAEAICACABAAEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////////////////gf///gB///w8P//8/z//+Ocf//nnn//5gZ//+YGf//nnn//45x///P8///w8P//+AH///4H/////////////////////////////////////////////////8="; KMap.prototype.DigiImgSnap="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2Ij4NCgk8cGF0aCBkPSJNMTUgMTAuMzUzYzAgLjkwNS0uMjIgMS40MTctLjUzNSAyLjEyLS4zNC42NC0uOTA1IDEuMzUtMS41MjYgMS44MjUtLjYxNy40MjUtMS4yMzcuNzU2LTIuMDYyLjk1MnMtMS43ODcuMjkzLTIuODg1LjI5M2MtMS4xMjIgMC0xLjk5Ni0uMTc3LTIuODMtLjM4NHMtMS41MzUtLjYtMi4xMDQtMS4wMDJjLS42NS0uNDU4LTEuMTc3LTEuMDg1LTEuNDY1LTEuNzMzLS4yOC0uNjQ4LS41NjctMS4xMi0uNTctMi4wNjNMMSA2aDMuNWwtLjAwNCAzLjUyYy0uMDAxLjY3Ni4wMTUuNjQuMTIgMSAuMTguNDIuMjk4LjYwNS42MjIuOTIzLjQ3My4zNDIuNDg2LjM2NCAxLjA4Ny42MzYuNzIuMTQ3LjguMjEzIDEuNjkuMjA3Ljg0NS0uMDA2IDEuMDItLjA1NSAxLjYzNS0uMi42LS4xODQuNzM3LS4zMDMgMS4xNjgtLjY3NGEyLjQ4IDIuNDggMCAwIDAgLjUwOS0uODI5Yy4xMzYtLjQxMy4xNzctLjQ1Ny4xNzYtMS4wNjZMMTEuNTI4IDZIMTV6bTAtNS44MTZoLTMuNWwuMDI0LTMuMDM1TDE1IDEuNDc4em0tMTAuNSAwTDEgNC41MTNWMS41MDJoMy41eiIgZmlsbD0iI2ZmZiIvPg0KCTxwYXRoIGQ9Ik04LjYwNC0uMDAzYy4xNy4wNDUuMjY4LjQuMjA0Ljk4NmEyLjggMi44IDAgMCAxLS4yMDQuNzk5Yy0uMTEyLjI1Ni0uMjUuNDgtLjMzLjY2LS4wNi4xNjItLjExMi4yODYtLjA4LjMzLjAwMy4wMzMuMDQuMDk1LjA4LjE4M3MuMTMuMTg3LjI0LjMyMmwuNDU0LjUxN2MuMTEyLjEzNi4yMjcuMjg2LjMzOC40NTVhMi42NyAyLjY3IDAgMCAxIC4zNC43NjljLjA4My4zMDUuMDkuNjM3LjAxNS45Ny0uMTQyLjQ5LS4zOC44Mi0uNiAxLjAzLS4yMzQuMjUtLjQyLjM4Ny0uNTMyLjUtLjEzLjEyNy0uMjQzLjMxOC0uMzM2LjQ4My0uMjQ0LjQ0LS4zODIuNzctLjU3NC43NzMtLjE2OC4wMDQtLjQtLjMyOC0uMzk2LS45OTItLjAwMS0uMjUuMDQtLjU3LjE5My0uOTIuMTU2LS4zMzUuMzI0LS41NjIuNDc0LS43OTUuMTAzLS4xOTMuMTk2LS4zNDQuMTY4LS40MTIuMDAyLS4wNC0uMDE4LS4xMDYtLjA0My0uMTg2cy0uMDgyLS4xNzItLjE1NS0uMjg0YTIuNyAyLjcgMCAwIDAtLjIxOS0uMjgzbC0uNDYzLS41NTRjLS4xNTUtLjE5NS0uMzA1LS40My0uNDI2LS43MTMtLjEzMy0uMy0uMTg1LS42NS0uMTQ1LTEuMDE2LjA4LS40NDcuMjU3LS43NjQuNDQtLjk3Ny4xNzUtLjIyMi4zNzctLjQxNC40NjgtLjUxMy4xMy0uMTM1LjI2NS0uMzMyLjM3NS0uNDg3LjMwNi0uNDM0LjUzNy0uNy43MTYtLjY1MnoiIGZpbGw9IiNmZmYiLz4NCjwvc3ZnPg=="; KMap.prototype.DigiImgSnapLoading="data:image/gif;base64,R0lGODlhEAAQAPQAAJScoP///5aeoubo6cbLzfv7++7v76Srrre9v/T19czQ0tPW2J6mqb7DxauxtN/i49rc3gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFUCAgjmRpnqUwFGwhKoRgqq2YFMaRGjWA8AbZiIBbjQQ8AmmFUJEQhQGJhaKOrCksgEla+KIkYvC6SJKQOISoNSYdeIk1ayA8ExTyeR3F749CACH5BAkKAAAALAAAAAAQABAAAAVoICCKR9KMaCoaxeCoqEAkRX3AwMHWxQIIjJSAZWgUEgzBwCBAEQpMwIDwY1FHgwJCtOW2UDWYIDyqNVVkUbYr6CK+o2eUMKgWrqKhj0FrEM8jQQALPFA3MAc8CQSAMA5ZBjgqDQmHIyEAIfkECQoAAAAsAAAAABAAEAAABWAgII4j85Ao2hRIKgrEUBQJLaSHMe8zgQo6Q8sxS7RIhILhBkgumCTZsXkACBC+0cwF2GoLLoFXREDcDlkAojBICRaFLDCOQtQKjmsQSubtDFU/NXcDBHwkaw1cKQ8MiyEAIfkECQoAAAAsAAAAABAAEAAABVIgII5kaZ6AIJQCMRTFQKiDQx4GrBfGa4uCnAEhQuRgPwCBtwK+kCNFgjh6QlFYgGO7baJ2CxIioSDpwqNggWCGDVVGphly3BkOpXDrKfNm/4AhACH5BAkKAAAALAAAAAAQABAAAAVgICCOZGmeqEAMRTEQwskYbV0Yx7kYSIzQhtgoBxCKBDQCIOcoLBimRiFhSABYU5gIgW01pLUBYkRItAYAqrlhYiwKjiWAcDMWY8QjsCf4DewiBzQ2N1AmKlgvgCiMjSQhACH5BAkKAAAALAAAAAAQABAAAAVfICCOZGmeqEgUxUAIpkA0AMKyxkEiSZEIsJqhYAg+boUFSTAkiBiNHks3sg1ILAfBiS10gyqCg0UaFBCkwy3RYKiIYMAC+RAxiQgYsJdAjw5DN2gILzEEZgVcKYuMJiEAOwAAAAAAAAAAAA=="; KMap.prototype.DigiCreate=function(types,type){ if(!types) types=1+2+4; var m=this,d,i,st; if(m.DigiO) m.DigiClose(); m.DigiO=this.EdgebarOpen(function(){if(m.Digitizer) m.DigiClose(true)}); if(types & 256){ d=document.createElement("div");m.DigiO.appendChild(d); m.DigiAddOkControl(types,d,true); d=document.createElement("div");m.DigiO.appendChild(d); d.style.marginTop="12px"; i=document.createElement("select");d.appendChild(i); i.style.border="#73808D solid 1px"; i.onchange=function(){ var i=Number(this.selectedIndex); if(m.DigiShp!=m.DigiMShp.shapes[i]) m.DigiStartShp(i); }; i.onclick=function(){this.onchange()}; i.onkeyup=function(){this.onchange()}; m.DigiIndexBox=i; i=document.createElement("button");d.appendChild(i); i.innerHTML=" + "; i.onclick=function(e){ m.DigiAddNew(type) m.DigiStartShp(m.DigiMShp.shapes.length-1); }; i=document.createElement("button");d.appendChild(i); i.innerHTML=" - "; i.onclick=function(e){ if(m.DigiMShp.shapes.length>1){ var i=Number(m.DigiIndexBox.selectedIndex); m.DigiMShp.shapes.splice(i,1); m.DigiStartShp(Math.min(i,m.DigiMShp.shapes.length-1)); } }; d=document.createElement("div");m.DigiO.appendChild(d); d.style.marginTop="12px"; m.DigiAddTypeControl(types,d); }else{ d=document.createElement("div");m.DigiO.appendChild(d); m.DigiAddTypeControl(types,d); m.DigiSnapAddControl(d); m.DigiAddOkControl(types,d,false); m.DigiIndexBox=null; } d=document.createElement("div");m.DigiO.appendChild(d); st=d.style;st.marginTop="12px";//st.verticalAlign="middle"; // TODO (map.js) Erweiterung des MapDigitizers um CRS-Eingabe => Maik senden m.DigiInput=d; i=document.createElement("input");i.style.width="97px";i.style.border="#73808D solid 1px";d.appendChild(i); i.onkeyup=function(){m.DigiSetXY()}; m.DigiInputX=i; a=document.createElement("font");a.innerHTML=" ; ";d.appendChild(a); i=document.createElement("input");i.style.width="97px";i.style.border="#73808D solid 1px";d.appendChild(i); i.onkeyup=function(){m.DigiSetXY()}; m.DigiInputY=i; d=document.createElement("div");m.DigiO.appendChild(d); st=d.style;st.marginTop="12px";d.style.display="none"; m.DigiExtended=d; i=document.createElement("select");d.appendChild(i); i.size="10";i.style.display="block";i.style.width="170px";i.style.border="#73808D solid 1px"; i.onchange=function(){m.DigiListBoxClick()}; i.onclick=function(){m.DigiListBoxClick()}; m.DigiListBox=i; i.onkeydown=function(e){ //if(!e) e=window.event; m.DigiKey(e.key); e.stopPropagation();e.preventDefault(); }; i=document.createElement("button");d.appendChild(i);i.style.fontSize="8pt";i.style.marginTop="12px"; i.innerHTML=m.s("DigiPathFlip"); i.onclick=function(e){m.DigiPathFlip()}; i=document.createElement("button");d.appendChild(i);i.style.fontSize="8pt";i.style.marginTop="12px"; i.innerHTML=m.s("DigiPartAdd"); i.onclick=function(e){m.DigiPartAdd()}; // TODO (map.js) Erweiterung des MapDigitizers um CRS-Eingabe => Maik senden d=document.createElement("div");m.DigiO.appendChild(d); st=d.style;st.marginTop="12px";d.style.display="none"; var t=document.createElement("table");d.appendChild(t);t.style.borderSpacing="0";t.style.borderCollapse="collapse"; // TODO (map.js) Neuer Resource-String in map.csv für Erweiterung des MapDigitizers => Maik senden var tr = t.insertRow(); var td=tr.insertCell();st=td.style;st.padding="2px 0";st.fontSize=m.FontSize;st.fontWeight="bold";st.textAlign="center"; td.innerHTML=m.s("DigiImportCoorSelect"); for(var a=0;a1){ i=document.createElement("span");o.appendChild(i); st=i.style;st.display="inline-block";st.width=st.height=st.lineHeight=this.DigiBtnSize;if(!fromMulti) st.marginLeft=this.DigiBtnMargin;st.cursor="pointer";st.textAlign="center";st.verticalAlign="middle"; i.title=m.s("DigiImport"); i.onclick=function(){m.DigiImport(types)}; d=document.createElement("div");i.appendChild(d); st=d.style;st.width=st.height="100%";st.opacity="1";st.backgroundImage="url('"+m.DigiImgImport+"')";st.backgroundRepeat="no-repeat";st.backgroundPosition="center"; } o.style.position="relative"; i=document.createElement("span");o.appendChild(i); st=i.style;st.display="inline-block";st.position="absolute";st.right="8px";st.width=st.height=st.lineHeight=this.DigiBtnSize;st.borderRadius="4px";st.marginLeft=this.DigiBtnOkMargin;st.marginRight=this.DigiBtnMargin;st.backgroundColor=this.DigiBtnOkColor;st.cursor="pointer";st.textAlign="center";st.verticalAlign="middle"; i.title=m.s("DigiOK"); i.onclick=function(){m.DigiFinish()}; d=document.createElement("div");i.appendChild(d); st=d.style;st.width=st.height="100%";st.opacity="1";st.backgroundImage="url('"+m.DigiImgOK+"')";st.backgroundRepeat="no-repeat";st.backgroundPosition="center"; }; KMap.prototype.DigiIndexBoxRefresh=function(){ var m=this; if(!m.DigiIndexBox) return; while(m.DigiIndexBox.options.length) m.DigiIndexBox.remove(0); for(var a=0;a1){ var o=document.createElement("option"); o.text="_______"+this.s("DigiLBPart")+" "+(a+1)+"_______"; o.value=-(a+1); this.DigiListBox.options.add(o); if(a==this.DigiCurPart && b==-1) o.selected=true; } for(var b=0;b-1){ var l=this.DigiShp.lines[this.DigiCurPart].points.length; if(this.DigiCurPt0) this.DigiInputSet(this.DigiShp.lines[this.DigiCurPart].points[l-1]); else this.DigiInputSet(); this.DigiInputX.disabled=this.DigiInputY.disabled=false; }else{ this.DigiInputSet(); this.DigiInputX.disabled=this.DigiInputY.disabled=true; } this.DigiCanvasRedraw(); this.DigiListBoxSetCur(); }; KMap.prototype.DigiMovePt=function(xy,NoInput){ this.DigiShp.lines[this.DigiCurPart].points[this.DigiCurPt]=new KPoint(xy[0],xy[1]).snapToGrid(1/Math.pow(10,this.DigiPrecision)); this.DigiCanvasRedraw(); this.DigiListBox.options[this.DigiListBox.selectedIndex].text=this.DigiListBoxFormat(xy); if(!NoInput) this.DigiInputSet(xy); }; KMap.prototype.DigiSetXY=function(){ var xy=this.DigiShp.lines[this.DigiCurPart].points[this.DigiCurPt]; xy=[parseFloat(this.DigiInputX.value),parseFloat(this.DigiInputY.value)]; xy=KMap.CoorTrans(xy,this.PrjEx,this.Prj); this.DigiMovePt(xy,true); }; KMap.prototype.DigiStart=function(geom,types,callback,type){ // types (combinable flags): 1=point, 2=line, 4=polygon, 256=multi geometry; type: 1=point, 2=line, 3=polygon var m=this; switch(type){ case 1:type=KShape.stPoint;break; case 2:type=KShape.stLine;break; case 3:type=KShape.stPolygon;break; default:type=(types & 1)?KShape.stPoint:((types & 4)?KShape.stPolygon:KShape.stLine); } m.DigiCallback=callback; m.DigiMShp=new KMultiShape(); if(geom) m.DigiLoad(geom); if(m.DigiMShp.shapes.length==0) m.DigiAddNew(type); m.DigiCreate(types,type); m.MapTipHide();m.CMenuHide(); m.Digitizer=true; m.DigiStartShp(0); m.DigiSnapLoad(); m.DigiSnapDisabled=false; m.DigiSnapControlRefresh(); }; KMap.prototype.DigiStartShp=function(index){ var m=this; m.DigiShp=m.DigiMShp.shapes[index]; if(m.DigiShp.type==KShape.stPolygon) for(var a=0;ampp*2){ m.SetMPP(mpp); m.x=(ext.xmin+ext.xmax)/2;m.y=(ext.ymin+ext.ymax)/2; m.Load(); } } }; KMap.prototype.DigiAddNew=function(type){ var g=new KShape(type);g.lines.push(new KLine()); this.DigiMShp.shapes.push(g); }; KMap.prototype.DigiSetShapeType=function(t){ var m=this; m.DigiShp.type=t; m.DigiP.style.backgroundColor=(t==KShape.stPoint?m.DigiBtnSelColor:m.DigiBtnColor); m.DigiL.style.backgroundColor=(t==KShape.stLine?m.DigiBtnSelColor:m.DigiBtnColor); m.DigiF.style.backgroundColor=(t==KShape.stPolygon?m.DigiBtnSelColor:m.DigiBtnColor); m.DigiExtended.style.display=(t==KShape.stPoint?"none":""); m.Placing(); if(t==KShape.stPoint){ if(m.DigiShp.lines[0].points.length>1) m.DigiShp.lines[0].points=[m.DigiShp.lines[0].points[0]]; if(m.DigiShp.lines.length>1) m.DigiShp.lines=[m.DigiShp.lines[0]]; m.DigiSetCur(0,0); } m.DigiCanvasRedraw(); m.DigiIndexBoxRefresh(); m.DigiListBoxRefresh(); }; KMap.prototype.DigiFinish=function(){ if(this.DigiIndexBox || this.DigiShp.lines[this.DigiCurPart].points.length) this.DigiClose(true,true); }; KMap.prototype.DigiClose=function(inform,ok){ this.Digitizer=false; if(this.edgebar) this.EdgebarClose(); this.DigiO=null; this.DigiCanvasRedraw(); if(inform && this.DigiCallback) this.DigiCallback(!!ok); delete this.DigiCallback; }; KMap.prototype.DigiPathFlip=function(){ this.DigiShp.lines[this.DigiCurPart].flip(); this.DigiListBoxRefresh(); if(this.DigiCurPt1){ var n=this.DigiCurPart; this.DigiShp.lines.splice(n,1); if(n==this.DigiShp.lines.length) n=this.DigiShp.lines.length-1; this.DigiSetCur(0,n); this.DigiListBoxRefresh(); } }; KMap.prototype.DigiClosestVertex=function(xy){ var dmin=Number.MAX_VALUE,v=[-1,0]; for(var a=0;a6 || Math.abs(m.my-m.ey)>6) m.DigiVertexDrag=2; if(m.DigiVertexDrag==2){m.DigiMovePt(m.Px2Geo(m.DigiSnapPt()));succ=true}; }else{ if(m.DigiVertexDrag) m.DigiVertexDrag=0; else{ var c="auto"; var v=m.DigiClosestVertex([m.ex,m.ey]); if(v[0]>-1) c="pointer";else{var k=m.DigiClosestEdge([m.ex,m.ey]);if(k[0]>-1) c="url('"+m.DigiImgNewVertex+"'),crosshair";succ=true}; m.mapal.style.cursor=c; } } }else m.DigiCanvasRedraw(); return succ; }; KMap.prototype.DigiMouseDown=function(){ this.DigiMouseKey=this.MouseKey; if(this.DigiCurPt-1){ this.DigiVertexDrag=1; this.DigiSetCur(v[1],v[0]); }else{ var k=this.DigiClosestEdge([this.ex,this.ey]);if(k[0]>-1){this.DigiShp.lines[k[0]].points.splice(k[1],0,new KPoint(k[2][0],k[2][1]).snapToGrid(1/Math.pow(10,this.DigiPrecision)));this.DigiSetCur(k[1],k[0]);this.DigiListBoxRefresh();this.mapal.style.cursor="auto"}; } } }; KMap.prototype.DigiMouseUp=function(){ if(!this.DigiSnapMouseUp(this.DigiMouseKey) && (this.DigiCurPt==this.DigiShp.lines[this.DigiCurPart].points.length)){ var xy=this.Px2Geo(this.DigiSnapPt()); var pt=new KPoint(xy[0],xy[1]).snapToGrid(1/Math.pow(10,this.DigiPrecision)); var pts=this.DigiShp.lines[this.DigiCurPart].points; if(!(pts.length && pts[pts.length-1].equals(pt))){ pts.push(pt); if(this.DigiShp.type==KShape.stPoint && !this.DigiIndexBox) this.DigiFinish(); else if(this.DigiShp.type!=KShape.stPoint){this.DigiListBoxRefresh();this.DigiSetCur(pts.length)} else this.DigiCanvasRedraw(); } } this.DigiMouseKey=0; }; KMap.prototype.DigiMouseDbl=function(){ if(this.DigiCurPt==this.DigiShp.lines[this.DigiCurPart].points.length && this.DigiShp.lines.length==1) this.DigiFinish(); }; KMap.prototype.DigiKey=function(k){ if(k=="Backspace" || k=="Delete"){ if(this.DigiCurPt==-1) this.DigiPartDel(); else if(this.DigiShp.lines[this.DigiCurPart].points.length>this.DigiShp.type==KShape.stPoint?1:(this.DigiShp.type==KShape.stLine?2:3)){ if(this.DigiCurPt==this.DigiShp.lines[this.DigiCurPart].points.length){ this.DigiShp.lines[this.DigiCurPart].points.pop(); this.DigiSetCur(this.DigiShp.lines[this.DigiCurPart].points.length); this.DigiListBoxRefresh(); }else if(this.DigiCurPt>-1){ var n=this.DigiCurPt;if(n==this.DigiShp.lines[this.DigiCurPart].points.length-1) n-=1;this.DigiShp.lines[this.DigiCurPart].points.splice(this.DigiCurPt,1);this.DigiSetCur(n);this.DigiListBoxRefresh(); } } } }; KMap.prototype.DigiDot=function(xy,sel){ this.DigiCtx.beginPath(); this.DigiCtx.arc(xy[0],xy[1],6,0,2*Math.PI,true); this.DigiCtx.fillStyle="rgba(255,"+(sel?255:0)+",0,0.3)";this.DigiCtx.fill(); this.DigiCtx.strokeStyle="red";this.DigiCtx.lineWidth=2;this.DigiCtx.stroke(); }; // TODO (Maik) DigiMakePath hat ungenutztes Argument shp - evtl. ein historisches Überbleibsel? KMap.prototype.DigiMakePath=function(shp){ this.DigiCtx.beginPath(); for(var a=0;a an Maik senden KMap.prototype.DigiImportCoorSelect=function(callback){ this.DigiImportCoorSelected=(function(prj){ // this.DigiCoorSelect.removeChild(t);t=null; this.DigiInput.style.display=""; this.DigiCoorSelect.style.display="none"; callback(prj); }).bind(this); this.DigiInput.style.display="none"; this.DigiExtended.style.display="none"; this.DigiCoorSelect.style.display=""; this.Placing(); }; KMap.prototype.DigiImportShapefile=function(file,geomTypes){ var m=this,r=new FileReader(); r.onload=function(){ var ms=new KMultiShape(); var shapefile=Shapefile.open(r.result); // TODO (map.js) select crs here is better than using the map-crs-selection => Maik senden m.DigiImportCoorSelect(function(prj){ while(!shapefile.eof()){ var shp=shapefile.get(); var type=0; switch(shp.type){ case KShape.stPoint:type=1;break; case KShape.stLine:type=2;break; case KShape.stPolygon:type=4;break; } m.DigiTransform(shp,prj,m.Prj); if(geomTypes & type) ms.shapes.push(shp); if(!m.DigiIndexBox) break; } if(ms.shapes.length){ m.DigiMShp=ms; m.DigiStartShp(0); } }); }; r.readAsArrayBuffer(file); }; KMap.prototype.DigiImportGpx=function(file,geomTypes){ var m=this,r=new FileReader(); r.onload=function(){ var doc=KMap.LoadXML(r.result); var segs=KMap.XMLSelectNodes(doc,"//*[local-name()='trkseg']"),recs=[]; var shp=new KShape(KShape.stLine); for(var a=0;a