<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Map 개발자의 길</title>
    <link>https://yd-dev.tistory.com/</link>
    <description>- Map 개발자의 로그
- 작은 도움
</description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 06:34:53 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>YD_Koo</managingEditor>
    <image>
      <title>Map 개발자의 길</title>
      <url>https://tistory1.daumcdn.net/tistory/3714754/attach/400657d7603a48949ab69d8076e154e1</url>
      <link>https://yd-dev.tistory.com</link>
    </image>
    <item>
      <title>javaScript lpad, rpad 구현</title>
      <link>https://yd-dev.tistory.com/15</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;기능 구현에 앞서서&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;MySql에서 사용되는 LPAD, RPAD가 생각보다 자주사용하다 보니 javascript에서 사용하고 싶었다.&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;1. javaScript lpad, rpad&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 좌우로 자리수만큼 입력값 채우기&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;- 본개발자 코드는 자리수가 명확할떄 사용하기 때문에 별도로 입렵값에대한 에러 처리를 하지 않습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1663229546471&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//mysql query rpad() lpad() 구현

// 왼쪽 채움
String.prototype.lpad = function(padLength, padString) {
    let arrTxt = this;
    while (arrTxt.length &amp;lt; padLength)
        arrTxt = padString + arrTxt;
    return arrTxt;
}

// 오른쪽 채움
String.prototype.rpad = function(padLength, padString) {
    let arrTxt = this;
    while (arrTxt.length &amp;lt; padLength)
        arrTxt += padString;
    return arrTxt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;101&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNowVw/btrMdEwVDfQ/EPJ26a6jUua4UIDnNNaHgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNowVw/btrMdEwVDfQ/EPJ26a6jUua4UIDnNNaHgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNowVw/btrMdEwVDfQ/EPJ26a6jUua4UIDnNNaHgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNowVw%2FbtrMdEwVDfQ%2FEPJ26a6jUua4UIDnNNaHgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;101&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;101&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>javaScript</category>
      <category>JavaScript</category>
      <category>javascript lpad</category>
      <category>javascript rpad</category>
      <category>LPAD</category>
      <category>Rpad</category>
      <category>텍스트채우기</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/15</guid>
      <comments>https://yd-dev.tistory.com/15#entry15comment</comments>
      <pubDate>Thu, 15 Sep 2022 17:19:35 +0900</pubDate>
    </item>
    <item>
      <title>multiple popup in openlayers (다중팝업)</title>
      <link>https://yd-dev.tistory.com/14</link>
      <description>&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555;&quot;&gt;기능 구현에 앞서서&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;OpenLayers의 Popup(tooltip)은 기본 예제 따라하면 단일 팝업으로만 작성 가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: right;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;본 개발자의 클라이언트는 여러 정보를 한번에 보고싶어하심.... 하...제발......&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. OepnLayers Multiple Popup&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 코드 구현&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1663220001122&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//맵 클릭 이벤트
map.on('singleclick', function(evt) {
    var coordinate = evt.coordinate;
    var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(coordinate, 'EPSG:3857', 'EPSG:4326'));
    
    // 툴팁 DIV 생성
    let element = document.createElement(&quot;div&quot;);
    element.classList.add('ol-popup');
    element.innerHTML = `&amp;lt;a id=&quot;popup-closer&quot; class=&quot;ol-popup-closer&quot;&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;div&amp;gt;&amp;lt;p&amp;gt;You clicked here:&amp;lt;/p&amp;gt;&amp;lt;code&amp;gt;${hdms}&amp;lt;/code&amp;gt;&amp;lt;/div&amp;gt;`;
    element.style.display = 'block';

	// OverLay 생성
    let overlay = new ol.Overlay({
        element: element, // 생성한 DIV
        autoPan: true,
        className: &quot;multiPopup&quot;,
        autoPanMargin: 100,
        autoPanAnimation: {
            duration: 400
        }
    });
	//오버레이의 위치 저장
    overlay.setPosition(coordinate);
    //지도에 추가
    map.addOverlay(overlay);

	// 해당 DIV 다켓방법
    let oElem = overlay.getElement();
    oElem.addEventListener('click', function(e) {
        var target = e.target;
        if (target.className == &quot;ol-popup-closer&quot;) {
            //선택한 OverLayer 삭제
            map.removeOverlay(overlay);

        }
    });
});&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 결과&lt;/h2&gt;
 &lt;link rel=&quot;stylesheet&quot; href=&quot;https://openlayers.org/en/v3.20.1/css/ol.css&quot; type=&quot;text/css&quot;&gt;
    &lt;!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --&gt;
    &lt;script src=&quot;https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL&quot;&gt;&lt;/script&gt;
    &lt;script src=&quot;https://openlayers.org/en/v3.20.1/build/ol.js&quot;&gt;&lt;/script&gt;
    &lt;style&gt;
      .ol-popup {
        position: absolute;
        background-color: white;
        -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
        filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
        padding: 15px;
        border-radius: 10px;
        border: 1px solid #cccccc;
        bottom: 12px;
        left: -50px;
        min-width: 280px;
      }
      .ol-popup:after, .ol-popup:before {
        top: 100%;
        border: solid transparent;
        content: &quot; &quot;;
        height: 0;
        width: 0;
        position: absolute;
        pointer-events: none;
      }
      .ol-popup:after {
        border-top-color: white;
        border-width: 10px;
        left: 48px;
        margin-left: -10px;
      }
      .ol-popup:before {
        border-top-color: #cccccc;
        border-width: 11px;
        left: 48px;
        margin-left: -11px;
      }
      .ol-popup-closer {
        text-decoration: none;
        position: absolute;
        top: 2px;
        right: 8px;
      }
      .ol-popup-closer:after {
        content: &quot;✖&quot;;
      }
    &lt;/style&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;div id=&quot;map&quot; class=&quot;map&quot;&gt;&lt;/div&gt;
    
    &lt;script&gt;
      /**
       * Create the map.
       */
      var map = new ol.Map({
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        target: 'map',
        view: new ol.View({
          center: [0, 0],
          zoom: 2
        })
      });


      /**
       * Add a click handler to the map to render the popup.
       */
      map.on('singleclick', function(evt) {
		var coordinate = evt.coordinate;
	    var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(coordinate, 'EPSG:3857', 'EPSG:4326'));
		let element = document.createElement(&quot;div&quot;);
			element.classList.add('ol-popup');
			element.innerHTML = `&lt;a id=&quot;popup-closer&quot; class=&quot;ol-popup-closer&quot;&gt;&lt;/a&gt; &lt;div id=&quot;popup-content&quot;&gt;&lt;p&gt;You clicked here:&lt;/p&gt;&lt;code&gt;${hdms}&lt;/code&gt;&lt;/div&gt;`;
			element.style.display = 'block';
			
			
			 let overlay = new ol.Overlay({
                    element: element,
                    autoPan: true,
                    className: &quot;multiPopup&quot;,
                    autoPanMargin: 100,
                    autoPanAnimation: {
                        duration: 400
                    }
                });
				
			
			overlay.setPosition(coordinate);
			map.addOverlay(overlay);
			
			
			let oElem = overlay.getElement();
			oElem.addEventListener('click', function(e) {
				var target = e.target;
				if (target.className == &quot;ol-popup-closer&quot;) {
					map.removeOverlay(overlay);
				
				}
			});
		});
    &lt;/script&gt;
&lt;!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --&gt;</description>
      <category>Openlayers</category>
      <category>multiplePopup</category>
      <category>openlayers</category>
      <category>openlayers Popup</category>
      <category>openlayers tooltip</category>
      <category>overlay</category>
      <category>ToolTip</category>
      <category>다중툴팁</category>
      <category>다중팝업</category>
      <category>멀티툴팁</category>
      <category>오픈레이어스</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/14</guid>
      <comments>https://yd-dev.tistory.com/14#entry14comment</comments>
      <pubDate>Thu, 15 Sep 2022 12:29:21 +0900</pubDate>
    </item>
    <item>
      <title>Deckgl tooltip position fixed( 툴팁고정)</title>
      <link>https://yd-dev.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp;기능 구현에 앞서서&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 본개발자는 DeckGl은 왜 !!!지원을 안해줄까??? 하는 의구심에 매우 피곤함.....&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 굳이 이걸 이렇게 개발 해야하나 싶음 ....&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- 익숙 해진다 싶으면 왜 맨날 삽질일까&amp;nbsp; ㅜㅜ&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Deckgl 툴팁 위치 고정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1.1&amp;nbsp; Deckgl에서 제공하는 이벤트를 최대한 사용해 보았다&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1663132244404&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
import {WebMercatorViewport} from '@deck.gl/core';

let map = new Deck({
	...
    
    // 지도 위치 이동시 발생 이벤트
    onViewStateChange: e =&amp;gt; {
    	/************************************************************
         *
         * 본개발자의 tooltip은 dataset에 위경도(LongLat)값 저장되어 있음
         * &amp;lt;div id=&quot;tooltip&quot;  data-lon=&quot;127.0952452665531&quot; data-lat=&quot;37.20030546967153&quot; style=&quot;display: block&quot;&amp;gt;...&amp;lt;/div&amp;gt;
         * 
         ************************************************************/
    	const el = document.getElementById('tooltip');
        
        // 핵심 이벤트 WebMercatorViewport
        let pro2Px = new WebMercatorViewport(e.viewState)
        // 투영된 좌표계의 위치를 px 값으로 반환
        .project([Number(el.dataset.lon) , Number(el.dataset.lat)]);
        
        
        el.style.left = pro2Px[0] + 'px';
        el.style.top = pro2Px[1]  + 'px';
    
    }
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1.2. Picxel에 오차 범위가 좀 있는듯 하지만 일단 88.99%는 도달한듯 싶다...&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 결과&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp; -&amp;nbsp; 코드 적용 전&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;signalC.gif&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2BXWb/btrL426v6Nr/JFzntXjnWeTYNQAWiTbhTK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2BXWb/btrL426v6Nr/JFzntXjnWeTYNQAWiTbhTK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2BXWb/btrL426v6Nr/JFzntXjnWeTYNQAWiTbhTK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/2BXWb/btrL426v6Nr/JFzntXjnWeTYNQAWiTbhTK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1415&quot; height=&quot;876&quot; data-filename=&quot;signalC.gif&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;nbsp;- 코드 적용 후&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;signalB.gif&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKSFHa/btrL0TWfTNz/YaYITZDgIyTomGwllm3vz0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKSFHa/btrL0TWfTNz/YaYITZDgIyTomGwllm3vz0/img.gif&quot; data-alt=&quot;코드 적용 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKSFHa/btrL0TWfTNz/YaYITZDgIyTomGwllm3vz0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bKSFHa/btrL0TWfTNz/YaYITZDgIyTomGwllm3vz0/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1415&quot; height=&quot;876&quot; data-filename=&quot;signalB.gif&quot; data-origin-width=&quot;1415&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드 적용 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DeckGL</category>
      <category>deckgl</category>
      <category>Deckgl ToolTip</category>
      <category>Deckgl Tooltip fixed position</category>
      <category>ToolTip</category>
      <category>위치고정</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/13</guid>
      <comments>https://yd-dev.tistory.com/13#entry13comment</comments>
      <pubDate>Wed, 14 Sep 2022 12:27:39 +0900</pubDate>
    </item>
    <item>
      <title>(docker) jupyterlab R kernel 추가하기</title>
      <link>https://yd-dev.tistory.com/12</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이전글 : &lt;a href=&quot;https://yd-dev.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://yd-dev.tistory.com/11&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1662439556773&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;docker-jupyterhub(+ jupyterlab) 설치&quot; data-og-description=&quot;설치 방법 전 JupyterHub 구성이유 &amp;nbsp;- 본개발자는 여러 사용자가 사용할수 있는 JupyterLab 구성이 필요 해짐 &amp;nbsp;- anaconda 사용하기 싫음 ( 본 개발자 존특) &amp;nbsp;- docker 연습겸&amp;nbsp; 1. 도커를 이용한 JupyterHub..&quot; data-og-host=&quot;yd-dev.tistory.com&quot; data-og-source-url=&quot;https://yd-dev.tistory.com/11&quot; data-og-url=&quot;https://yd-dev.tistory.com/11&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bw1RFt/hyPHqHU1V1/byhKJKkIMEekPEgkiGc2p0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/2qE6g/hyPHucsQdm/J3mWoHA04kZi7i6cUQnkc0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/fNIA0/hyPHpoG6Yc/n3FDHHEIqW1xgWoxkZdCpK/img.png?width=1920&amp;amp;height=977&amp;amp;face=0_0_1920_977&quot;&gt;&lt;a href=&quot;https://yd-dev.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yd-dev.tistory.com/11&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bw1RFt/hyPHqHU1V1/byhKJKkIMEekPEgkiGc2p0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/2qE6g/hyPHucsQdm/J3mWoHA04kZi7i6cUQnkc0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/fNIA0/hyPHpoG6Yc/n3FDHHEIqW1xgWoxkZdCpK/img.png?width=1920&amp;amp;height=977&amp;amp;face=0_0_1920_977');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;docker-jupyterhub(+ jupyterlab) 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;설치 방법 전 JupyterHub 구성이유 &amp;nbsp;- 본개발자는 여러 사용자가 사용할수 있는 JupyterLab 구성이 필요 해짐 &amp;nbsp;- anaconda 사용하기 싫음 ( 본 개발자 존특) &amp;nbsp;- docker 연습겸&amp;nbsp; 1. 도커를 이용한 JupyterHub..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yd-dev.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 환경에서 계속해서 진행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설치 방법 전 R kernel&amp;nbsp; 구성이유&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - 클라이언트가 해달란다..... 아주 하.......&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. jupyterLab을 이용한 R Kernel 추가하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - R 설치 앞아서&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662439782501&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Docker container shell 접근
# docker exec -it  jhubcontainer /bin/bash

# 현재 등록된 Kernel 리스트 가져오기
# jupyter kernelspec list&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;54&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dW73k7/btrLuksNXrf/UDXxNn88HM9HU0NNNkYKdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dW73k7/btrLuksNXrf/UDXxNn88HM9HU0NNNkYKdK/img.png&quot; data-alt=&quot;현재 등록된 커널 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dW73k7/btrLuksNXrf/UDXxNn88HM9HU0NNNkYKdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdW73k7%2FbtrLuksNXrf%2FUDXxNn88HM9HU0NNNkYKdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;54&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;54&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재 등록된 커널 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. R 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1662440096899&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apt-get error 발생시 아래 update, upgrade 순서대로 진행
# apt-get update
# apt-get upgrade

apt-get install r-base&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. IRkernel 설치&lt;/h2&gt;
&lt;pre id=&quot;code_1662440178212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R 실행
R  
&amp;gt; install.packages(&quot;IRkernel&quot;) # 설치 시간 3~5분 소요
&amp;gt; IRkernel::installspec(name=&quot;r&quot;, displayname=&quot;R&quot;)
&amp;gt; q()   # R 종료 

# 해당 설치 완료 되면 디폴트 경로가 /root/.local/share/jupyter/kernels/r 이런식으로 되어있을꺼다&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJBrTR/btrLu9j2BWB/vKGY3K36cRsA2oLeM4cvPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJBrTR/btrLu9j2BWB/vKGY3K36cRsA2oLeM4cvPK/img.png&quot; data-alt=&quot;R kernel 위치 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJBrTR/btrLu9j2BWB/vKGY3K36cRsA2oLeM4cvPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJBrTR%2FbtrLu9j2BWB%2FvKGY3K36cRsA2oLeM4cvPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;73&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;R kernel 위치 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. R Kernel 내용 위치 복사&lt;/h3&gt;
&lt;pre id=&quot;code_1662440766977&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 경로 생성 Jupyterhub 구성으로 작성시 usr 파일의 정보를 같이 쓰는거 같다. 
# 위 내용은 확인이 좀 필요하다...

mkdir /usr/local/share/jupyter/kernels/

cp -r /root/.local/share/jupyter/kernels/r /usr/local/share/jupyter/kernels/

# 기존 디폴트로 등록된 kernel 삭제
jupyter kernelspec uninstall r

# 삭제 이후
jupyter kernelspec list

# 경로가 변경되어 kernel이 추가되어있는것을 확인 할수 있다.
# 이부분은 본개발자도 이해를 못하는 부분 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJD1YB/btrLzp0fMox/gpAmq3wtEWnveHFhK9NOKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJD1YB/btrLzp0fMox/gpAmq3wtEWnveHFhK9NOKk/img.png&quot; data-alt=&quot;디폴트 정의된 커널 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJD1YB/btrLzp0fMox/gpAmq3wtEWnveHFhK9NOKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJD1YB%2FbtrLzp0fMox%2FgpAmq3wtEWnveHFhK9NOKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;155&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;155&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디폴트 정의된 커널 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6gGva/btrLvDLWWEe/qNmHA7xIVj7f0wmBMLcK40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6gGva/btrLvDLWWEe/qNmHA7xIVj7f0wmBMLcK40/img.png&quot; data-alt=&quot;R 추가된 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6gGva/btrLvDLWWEe/qNmHA7xIVj7f0wmBMLcK40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6gGva%2FbtrLvDLWWEe%2FqNmHA7xIVj7f0wmBMLcK40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1915&quot; height=&quot;984&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;R 추가된 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Docker</category>
      <category>BIGDATA</category>
      <category>docker</category>
      <category>JupyterHub</category>
      <category>jupyterlab</category>
      <category>r</category>
      <category>R kernel</category>
      <category>r 코드</category>
      <category>빅데이터</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/12</guid>
      <comments>https://yd-dev.tistory.com/12#entry12comment</comments>
      <pubDate>Tue, 6 Sep 2022 14:10:42 +0900</pubDate>
    </item>
    <item>
      <title>[Docker] jupyterhub(+ jupyterlab) 설치</title>
      <link>https://yd-dev.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설치 방법 전 JupyterHub 구성이유&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;- 본개발자는 여러 사용자가 사용할수 있는 JupyterLab 구성이 필요 해짐&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;- anaconda 사용하기 싫음 ( 본 개발자 존특)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;- docker 연습겸&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 도커를 이용한 JupyterHub 구성&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662369629837&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. docker container 등록방법
# docker 사용한 image : jupyterhub/jupyterhub 
# -p 포트번호 설정 
# bash docker shell 바로 접근 하기 위함 

docker run -it -p 8000:8000 --name jhubcontainer jupyterhub/jupyterhub bash
jupyterhub start&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://xxx.xxx.xxx.xxx:8000 접속&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 페이지를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- admin 계정에한 정보 모르겠음.....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- 직접 사용자 추가&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byvSRa/btrLugjbcHz/NoWEG9nWdFYzSWN3sHkGh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byvSRa/btrLugjbcHz/NoWEG9nWdFYzSWN3sHkGh1/img.png&quot; data-alt=&quot;http://xxx.xxx.xxx.xxx:8000 접속화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byvSRa/btrLugjbcHz/NoWEG9nWdFYzSWN3sHkGh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyvSRa%2FbtrLugjbcHz%2FNoWEG9nWdFYzSWN3sHkGh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;922&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http://xxx.xxx.xxx.xxx:8000 접속화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;user 계정을 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1662427974562&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Docker container shell 접근
# docker exec -it &amp;nbsp;jhubcontainer /bin/bash

adduser yd

Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Changing the user information for username
Enter the new value, or press ENTER for the default
    Full Name []:
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? [Y/n]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 이후 server &lt;span style=&quot;background-color: #ffffff;&quot;&gt;Spawn failed&amp;nbsp; 생성에 실패했다고 뭐라뭐라 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz0iAD/btrLuhoUmw3/ADIB1sNdrKEIVFee7A8GgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz0iAD/btrLuhoUmw3/ADIB1sNdrKEIVFee7A8GgK/img.png&quot; data-alt=&quot;로그인 후 페이지 생성에 Error 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz0iAD/btrLuhoUmw3/ADIB1sNdrKEIVFee7A8GgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz0iAD%2FbtrLuhoUmw3%2FADIB1sNdrKEIVFee7A8GgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1917&quot; height=&quot;342&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 후 페이지 생성에 Error 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 로그 정보&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vW5As/btrLu2reN1q/kR1pyfrkATVpu05oHaRYhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vW5As/btrLu2reN1q/kR1pyfrkATVpu05oHaRYhK/img.png&quot; data-alt=&quot;Error Log&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vW5As/btrLu2reN1q/kR1pyfrkATVpu05oHaRYhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvW5As%2FbtrLu2reN1q%2FkR1pyfrkATVpu05oHaRYhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;317&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Error Log&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1662429041973&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# apt-get 에러 발생시 아래 apt-get update및 upgrade  실행
# apt-get update
# apt-get upgrade

# 추가적으로 설치할 항목들이 있다.
apt-get install python3 python3-pip 
python3 -m pip install jupyterhub notebook jupyterlab


# 설치후 jupyterhub 재가동&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;977&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAgJbD/btrLnsyd5DK/oWkjJApFVSGlm2npWWFaI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAgJbD/btrLnsyd5DK/oWkjJApFVSGlm2npWWFaI0/img.png&quot; data-alt=&quot;Jupyterhub --&amp;amp;gt; jupyterlab 생성 완료된 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAgJbD/btrLnsyd5DK/oWkjJApFVSGlm2npWWFaI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAgJbD%2FbtrLnsyd5DK%2FoWkjJApFVSGlm2npWWFaI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;977&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;977&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Jupyterhub --&amp;gt; jupyterlab 생성 완료된 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 관리자 권한 추가&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1662430947520&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Docker container shell 접근
# docker exec -it &amp;nbsp;jhubcontainer /bin/bash

mkdir /etc/jupyterhub
cd /etc/jupyterhub/
jupyterhub --generate-config -f jupyterhub_config.py

# nano 미설치시
# apt-get install nano

nano jupyterhub_config.py


# 메모장(jupyterhub_config.py) 추가내용
c.Authenticator.admin_users = {'yd'}
c.PAMAuthenticator.admin_groups = {'masterG'}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;jupyterhub_config.py 추가된 내용&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VsnXL/btrLotYeC0d/18RDRNApYNdmnD4e0ydhBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VsnXL/btrLotYeC0d/18RDRNApYNdmnD4e0ydhBK/img.png&quot; data-alt=&quot;admin 계정 추가 및 그룹 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VsnXL/btrLotYeC0d/18RDRNApYNdmnD4e0ydhBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVsnXL%2FbtrLotYeC0d%2F18RDRNApYNdmnD4e0ydhBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1498&quot; height=&quot;494&quot; data-origin-width=&quot;1498&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;admin 계정 추가 및 그룹 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1662431634762&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 수정한  jupyterhub_config.py 실행 
# jupyterhub 재실행 기존 돌고 있는거 있음 종료 바람

jupyterhub -f /etc/jupyterhub/jupyterhub_config.py

# http://xxx.xxx.xxx.xxx:8000/hub/admin#/   관리자페이지 접근 URL (관리자 로그인 후 )&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;관리자 화면&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD70qk/btrLu8dZ8CW/FS0AmoyQN2EcIfkH4hOZl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD70qk/btrLu8dZ8CW/FS0AmoyQN2EcIfkH4hOZl0/img.png&quot; data-alt=&quot;관리자 모드 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD70qk/btrLu8dZ8CW/FS0AmoyQN2EcIfkH4hOZl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD70qk%2FbtrLu8dZ8CW%2FFS0AmoyQN2EcIfkH4hOZl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1537&quot; height=&quot;427&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;관리자 모드 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;위 구성의 단점 ?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 관리자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; - 관리자가 사용자를 추가를 해줘야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; - 귀찮다.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 페이지&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hub.docker.com/r/jupyterhub/jupyterhub&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hub.docker.com/r/jupyterhub/jupyterhub&lt;/a&gt;&lt;/p&gt;</description>
      <category>Docker</category>
      <category>docker</category>
      <category>jupyter</category>
      <category>JupyterHub</category>
      <category>jupyterhub admin</category>
      <category>jupyterlab</category>
      <category>Python</category>
      <category>도커</category>
      <category>주피터</category>
      <category>주피터랩</category>
      <category>주피터허브</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/11</guid>
      <comments>https://yd-dev.tistory.com/11#entry11comment</comments>
      <pubDate>Mon, 5 Sep 2022 18:20:45 +0900</pubDate>
    </item>
    <item>
      <title>geoFeatures의 bbox의 최적 Zoom 구하기</title>
      <link>https://yd-dev.tistory.com/10</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. LIneString, Polygon, Point의 웹상에서 최적으로 보일수 있는 Zoom 구하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1652253609101&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let width = 1920; //웹사이트 넓이 
let height = 1080; // 웹사이트 높이 
let BOUNDS = [[bbox[0],bbox[1]],[bbox[2],bbox[3]]]; 
//[[127.09875551,37.20934113],[127.10195002,37.21464863]]


const viewport = new WebMercatorViewport({
      width: width,
      height: height
});

const {longitude, latitude, zoom} = viewport.fitBounds(BOUNDS, {
  padding: 50 // 해당 Features의 BBOX 여백 생성 
});
//[127.11449868, 37.167457671163525, 15.68894428866944]; //[x,y,z]
//cetner 정보 및 Zoom 반환&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://deck.gl/docs/api-reference/core/web-mercator-viewport&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://deck.gl/docs/api-reference/core/web-mercator-viewport&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://math.gl/modules/web-mercator/docs/api-reference/web-mercator-viewport&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://math.gl/modules/web-mercator/docs/api-reference/web-mercator-viewport&lt;/a&gt;&lt;/p&gt;</description>
      <category>DeckGL</category>
      <category>BBox</category>
      <category>deckgl</category>
      <category>fitBounds</category>
      <category>getZoom</category>
      <category>map</category>
      <category>WebMercatorViewport</category>
      <category>지도</category>
      <category>최적Zoom</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/10</guid>
      <comments>https://yd-dev.tistory.com/10#entry10comment</comments>
      <pubDate>Wed, 11 May 2022 16:24:16 +0900</pubDate>
    </item>
    <item>
      <title>DeckGL TextLayer 한글 깨짐/미표출</title>
      <link>https://yd-dev.tistory.com/9</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. DeckGL TextLayer&amp;nbsp; 기능 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Deckgl 한글 라벨 입력시 미표출 또는 한글깨짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA3jFX/btrxB5h7fBJ/JiNGzXtT1D6ff5eBDGY9dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA3jFX/btrxB5h7fBJ/JiNGzXtT1D6ff5eBDGY9dk/img.png&quot; data-alt=&quot;DeckGL 한글 입력 시 미표출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA3jFX/btrxB5h7fBJ/JiNGzXtT1D6ff5eBDGY9dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA3jFX%2FbtrxB5h7fBJ%2FJiNGzXtT1D6ff5eBDGY9dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1211&quot; height=&quot;786&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DeckGL 한글 입력 시 미표출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNLpDX/btrxHw0jB76/HXANL7RnU2gf8VmoiYeKqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNLpDX/btrxHw0jB76/HXANL7RnU2gf8VmoiYeKqk/img.png&quot; data-alt=&quot;한글 인코딩 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNLpDX/btrxHw0jB76/HXANL7RnU2gf8VmoiYeKqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNLpDX%2FbtrxHw0jB76%2FHXANL7RnU2gf8VmoiYeKqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1167&quot; height=&quot;751&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;한글 인코딩 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deckgl TextLayer&amp;nbsp;에서 추가 할 항목&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.1 characterSet&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;디폴트 범위가 &lt;span style=&quot;color: #000000;&quot;&gt;ASCII characters 32-128 , // 한글을 지원하지 않는다...........&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; characterSet에 필요한 한글 코드를 직접 입력하는 방법 말고는 찾질 못했다&amp;nbsp; 그래도 없는것보다는 급하면 사용가능 할꺼 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648456953232&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import DeckGL from '@deck.gl/react';
import {TextLayer} from '@deck.gl/layers';

function App({data, viewState}) {  

  const layer = new TextLayer({
    id: 'text-layer',
    data,
    pickable: true,
    getPosition: d =&amp;gt; d.coordinates,
    getText: d =&amp;gt; d.name,
    getSize: 32,
    getAngle: 0,
    getTextAnchor: 'middle',
    getAlignmentBaseline: 'center',
    // characterSet Default: ASCII characters 32-128
    // 추가 이벤트
    characterSet : function(){
    	 const charSet = [];
            for (let i = 32; i &amp;lt; 128; i++) {
                charSet.push(String.fromCharCode(i));
            }
            charSet.push(String.fromCharCode(45824)); // 대
            charSet.push(String.fromCharCode(49884)); // 시
            charSet.push(String.fromCharCode(44036)); // 간
         return charSet;
    }
  });

  return &amp;lt;DeckGL viewState={viewState}
    layers={[layer]}
    getTooltip={({object}) =&amp;gt; object &amp;amp;&amp;amp; `${object.name}\n${object.address}`} /&amp;gt;;
}

//출처 : https://deck.gl/docs/api-reference/layers/text-layer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DeckGL</category>
      <category>deckgl</category>
      <category>DeckGL TextLayer</category>
      <category>Deckgl한글깨짐</category>
      <category>Dekcgl</category>
      <category>TextLayer</category>
      <category>한글깨짐</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/9</guid>
      <comments>https://yd-dev.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 28 Mar 2022 17:47:32 +0900</pubDate>
    </item>
    <item>
      <title>DeckGL 거리측정 기능 개발</title>
      <link>https://yd-dev.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. DeckGl 거리측정 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; - Deckgl Hover evt , Click evt 를 이용한 기능 구현&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;signalB.gif&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zgngr/btrg2Lk47qc/xAHEoDS78RP5SRrR1ln5UK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zgngr/btrg2Lk47qc/xAHEoDS78RP5SRrR1ln5UK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zgngr/btrg2Lk47qc/xAHEoDS78RP5SRrR1ln5UK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/zgngr/btrg2Lk47qc/xAHEoDS78RP5SRrR1ln5UK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;731&quot; data-filename=&quot;signalB.gif&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1633508517881&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let preDisTanceLongLat = [];

new Deck({
    id: 'map'
    canvas: 'map'
    layers: [baseMap] // 배경지도
    onHover: function(e) {
        const distancePointlayer = new ScatterplotLayer({
            id: 'distancePath-movePoint',
            data: [e.coordinate],
            opacity: 0.8,
            stroked: true,
            filled: true,
            txGrupKey: 'distance',
            radiusScale: 2,
            getPosition: d =&amp;gt; {
                return d;
            },
            getRadius: 2,
            getFillColor: d =&amp;gt; [255, 255, 255, 0],
            getLineColor: d =&amp;gt; [255, 255, 255]
        });

        if (preDisTanceLongLat.length &amp;gt; 0) {
            var oData = [{
                prelonglat: preDisTanceLongLat[tpreDisTanceLongLat.length - 1],
                nextLonLat: e.coordinate
            }];
            const distanceLinelayer = new PathLayer({
                id: 'distanceLinelayer_dash',
                data: oData,
                getWidth: 2,
                pickable: false,
                widthScale: 3,
                widthMinPixels: 2,
                widthMaxPixels: 2,
                getPath: d =&amp;gt; {
                    return d.geom.geometry.coordinates
                },
                getColor: d =&amp;gt; [255, 172, 0],
                getDashArray: [3, 2],
                dashJustified: false,
                extensions: [new PathStyleExtension({
                    dash: true
                })],
            });
        }
    },
    onClick: function(e, mouseInfo) {
        let longlat = e.coordinate //현재 마우스 위치 
        preDisTanceLongLat.push(longlat);
    }
})&lt;/code&gt;&lt;/pre&gt;</description>
      <category>DeckGL</category>
      <category>deckgl</category>
      <category>distance measurement</category>
      <category>GL</category>
      <category>map</category>
      <category>거리측정</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/8</guid>
      <comments>https://yd-dev.tistory.com/8#entry8comment</comments>
      <pubDate>Wed, 6 Oct 2021 17:23:09 +0900</pubDate>
    </item>
    <item>
      <title>DeckGL Map 기울기(pitch) 적용시 깨짐 현상</title>
      <link>https://yd-dev.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1. DeckGL Polygon, Line, Marker 등 기울기(pitch) 적용 깨짐 형상&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- DekcGL 각 레이어의 기본 디폴트 높이 값을 가지고 있는 부분에서 생기는 오류 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 해당 에러 화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;signalB.gif&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baI4Na/btq6MS30S2Q/TGKWKfFZccLHsUEd5iKMNk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baI4Na/btq6MS30S2Q/TGKWKfFZccLHsUEd5iKMNk/img.gif&quot; data-alt=&quot;DeckGL 기울기에 따른 레이어 깨짐 현상&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baI4Na/btq6MS30S2Q/TGKWKfFZccLHsUEd5iKMNk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/baI4Na/btq6MS30S2Q/TGKWKfFZccLHsUEd5iKMNk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;731&quot; data-filename=&quot;signalB.gif&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DeckGL 기울기에 따른 레이어 깨짐 현상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드&lt;/p&gt;
&lt;pre id=&quot;code_1623204526853&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new GeoJsonLayer({
    data,
    getLineColor: oDeSetting.styleLine.color,
    getLineWidth: oDeSetting.styleLine.width,
    getFillColor: oDeSetting.stylePolygon.color,

    // 레이어 높이값 적용 해제 하는 코드 
    // 아래 부분에 해당 코드 추가 
    parameters: {
        depthTest: false
    }
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DeckGL</category>
      <category>deckgl</category>
      <category>polygon</category>
      <category>레이어 기울기 깨짐</category>
      <category>레이어 깨짐</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/7</guid>
      <comments>https://yd-dev.tistory.com/7#entry7comment</comments>
      <pubDate>Wed, 9 Jun 2021 11:12:32 +0900</pubDate>
    </item>
    <item>
      <title>DeckGL Layer On/Off</title>
      <link>https://yd-dev.tistory.com/6</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 결과 화면&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;layerOnOff.gif&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;641&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQf3ca/btqNx9CNYSe/CJEa5UZ58Y6bJAbrc8s5p1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQf3ca/btqNx9CNYSe/CJEa5UZ58Y6bJAbrc8s5p1/img.gif&quot; data-alt=&quot;DeckGL을 이용한 레이어 On/OFF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQf3ca/btqNx9CNYSe/CJEa5UZ58Y6bJAbrc8s5p1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/dQf3ca/btqNx9CNYSe/CJEa5UZ58Y6bJAbrc8s5p1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1190&quot; height=&quot;641&quot; data-filename=&quot;layerOnOff.gif&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;641&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DeckGL을 이용한 레이어 On/OFF&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. DeckGL Clone 이벤트 이용 하기&amp;nbsp;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;- 레이어.clone(obejct)&lt;/h4&gt;
&lt;pre id=&quot;code_1605522078807&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arrLayers = deck.props.layers // 화면의 표출된 모든 레이어

let setVisibleLayer = function(targetID , bVisible){
	var cloneLayers = [];
	for (var i = 0; i &amp;lt; arrLayers.length; i++) {
		if(arrLayers[i].id == targetID ){ // arrLayers.id 레이어 만들때 정의했던 ID
			cloneLayers.push(arrLayers[i].clone({visible : bVisible}));
		}
		else {
			console.error('해당 ID와 매칭되는 정보가 없습니다.')
		}	
	}
	deck.setProps({layers: cloneLayers});
}
setVisibleLayer('speedLayer' , false); // or setVisibleLayer('speedLayer' , true);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;deckgl.clone 사용시 new 레이어 없이 선언 되어 있던 레이어를 복제하여 재사용 가능?? 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;구축 기반&amp;nbsp; Spring, javascript ,DeckGL&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/h4&gt;</description>
      <category>DeckGL</category>
      <category>deckgl</category>
      <category>DeckGL.clone</category>
      <category>LayerOnOff</category>
      <author>YD_Koo</author>
      <guid isPermaLink="true">https://yd-dev.tistory.com/6</guid>
      <comments>https://yd-dev.tistory.com/6#entry6comment</comments>
      <pubDate>Mon, 16 Nov 2020 19:25:21 +0900</pubDate>
    </item>
  </channel>
</rss>